View Full Version : تغییر آیتم انتخاب شده در لیست ویو
mehdi64org
دوشنبه 21 بهمن 1392, 23:49 عصر
سلام
من یک لیست ویو توی برنامه ام قرار دادم . حالا قصد دارم که وقتی هر کدوم از آیتم ها انتخاب شد، رنگ اون آیتم عوض بشه ؛ یا اینکه مثلا کنارش یه علامتی قرار بگیره که مشخص بشه قبلا این آیتم انتخاب شده. خلاصه قصد دارم که یک جوری متمایز بشه با بقیه آیتم ها. چه کارهایی میتونم بکنم .
لطفا راهنمایی بفرمایید.
با تشکر
hamedjj
سه شنبه 22 بهمن 1392, 00:23 صبح
باید از android:listSelector استفاده کنی
مثال:
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
list selector XML :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/>
<item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/list_item_bg_pressed" android:state_activated="true"/>
</selector>
که در مابقی فایل های xml رنگ های لیست موجود میباشد
از پروژه (منوی کشویی با استفاده از Navigation Drawer)برای توضیحات استفاده کردم
لینک (http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=1914652&viewfull=1#post1914652)
mehdi64org
سه شنبه 22 بهمن 1392, 00:54 صبح
ببخشید ممنون میشم اگر یه ذره بیشتر توضیح بدین.
من قصد دارم که وقتی برگشتم به اکتیویتی هم اون آیتم رنگش متمایز باشه.
از تابع setItemChecked در لیست ویو نمیشه استفاده کرد؟
با تشکر
haniiii
سه شنبه 22 بهمن 1392, 02:14 صبح
ببخشید ممنون میشم اگر یه ذره بیشتر توضیح بدین.
من قصد دارم که وقتی برگشتم به اکتیویتی هم اون آیتم رنگش متمایز باشه.
از تابع setItemChecked در لیست ویو نمیشه استفاده کرد؟
با تشکر
باید با استفاده از یکی از روش های موجود انتخاب شدن اون ایتم رو ذخیره کنی
ساده ترین راهش استفاده از SharedPreferences هست به این صورت که برای هر ایتم یه key خاص خودش در نظر میگیری و تو اداپتر هم باید لود کردن رنگ ایتم بر اساس SharedPreferences رو هندل کنی
هر وقت هم کاربر رو ایتم کلیک کرد SharedPreferences ش رو عوض کنی
http://developer.android.com/reference/android/content/SharedPreferences.html
mehdi64org
سه شنبه 22 بهمن 1392, 13:00 عصر
ببخشید الان کد من به صورت زیر هست:
public void RssShow() {
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, TitleList);
RssListView.setAdapter(arrayAdapter);
for (int i = 0; i < GeneralVar.ClickedAddress.size(); i++) {
for (int j = 0; j < AddressList.size(); j++) {
if (GeneralVar.ClickedAddress.get(i).equals(AddressLi st.get(j))) {
}
}
}
}
در آرایه GeneralVar.ClickedAddress آیتم هایی رو که قبلا انتخاب شدن رو ذخیره کردم. و در AddressList هم آیتم هایی رو که الان دارم رو ذخیره کردم.
بعد توی قسمت if گفتم که اگر هر کدوم از آیتم های AddressList با GeneralVar.ClickedAddress مساوی بود یعنی که قبلا روش کلیک شده.
حالا میخوام توی قسمت if یک دستوری بزارم که اون آیتم رو متمایز کنه با بقیه. اینجارو نمیدونم چه باید بکنم؟ اصلا این کار شدنی هست؟
با تشکر
haniiii
سه شنبه 22 بهمن 1392, 13:29 عصر
لازم نیست 2 تا آرایه در نظر بگیری
من مختصر توضیح میدم
یه ArrayList ( یا هر لیست جنرال دیگه ای ) بساز برای ذخیره وضعیت میتونه از هر نوعی که دوست داری باشه ... چون 2 حالت داره Boolean میتونه انتخاب خوبی باشه
موقع ساختن ایتم های لیست ویو با استفاده از SharedPreferences که توضیح دادم وضعیت ایتم های لیست رو با توجه به position داخل اون arraylist اضافه کن ( مثلا True برای حالت انتخاب شده )
و برای اداپتر این Arraylist رو هم بفرست
موقع لود کردن ایتم ها در متد Getview باید بررسی کنی با توجه به position آیا انتخاب شده یا نه
if(arraylist.get(position))
{
// entekhab shode
}
else
{
//halat entekhab nashode
}
تا اینجا موقع لود کردن اطلاعات ذخیره شده رو درست نشون میده
برای اینکه وقتی رو ایتم مورد نظر کلیک کرد رنگ عوض بشه ( یا هر اتفاق دیگه ای ) :
داخل متد onclicklistener ای که برای اون ایتم در نظر گرفتی این ها رو هم اضافه کن
اول باید با توجه به position اون SharedPreferencesمختص به خودش رو عوض کنی ( اگر انتخاب شده بود به حالت انتخاب نشده و بالعکس )
و اون arraylist رو هم باید تغییر بدی
arraylist.set(position,true/false)
mehdi64org
سه شنبه 22 بهمن 1392, 14:22 عصر
اول اینکه ممنون بابت وقتی که گذاشتید و توضیحاتی که دادید.
برنامه ای که نوشتم خیلی ساده ست. یک Rss Reader که فیدهای سایت رو میگیره و توی آرایه AddressList ذخیره میکنه. و قسمت setOnItemClickListener لیست ویو هم به این شکل هست:
protected void onPostExecute(String result) {
RssShow();
RssListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
GeneralVar.ClickedAddress.add(AddressList.get(posi tion));
startActivity(new Intent(android.content.Intent.ACTION_VIEW,Uri.pars e(AddressList.get(position))));
}
});
}
}
هر آیتم که انتخاب بشه به آرایه GeneralVar.ClickedAddress اضافه میشه و آدرس رو به مروگر میفرسته و صفحه اون لود میشه.
فایل rss_show_page.xml رو هم به این صورت نوشتم:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/rssShow"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</LinearLayout>
و بعد همانطور که قبلا عرض کردم با استفاده از دوتا for میام بین تو تا آرایه مقایسه انجام میدم و اگر از گزینه های AddressList در GeneralVar.ClickedAddress هم وجود داشته باشه میخوام که اون گزینه متمایز نمایش داده بشه.
public void RssShow() {
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, TitleList);
RssListView.setAdapter(arrayAdapter);
for (int i = 0; i < GeneralVar.ClickedAddress.size(); i++) {
for (int j = 0; j < AddressList.size(); j++) {
if (GeneralVar.ClickedAddress.get(i).equals(AddressLi st.get(j))) {
}
}
}
}
مطمئنا روشی که شما فرمودین درسته ولی با توجه به نوع نوشتن برنامه توسط من، فکر نکنم بشه یا بتونم عملیش کنم.
حالا با توجه به توضیحاتی که شما فرمودین ، من باید تغییراتی که میخوام رو قبل از فراخوانی کد:
RssListView.setAdapter(arrayAdapter);
انجام بدم؟ چون الان یک لیست ویوی خیلی ساده دارم که توش عنوان هر لینک نمایش داده میشه.
با تشکر
haniiii
سه شنبه 22 بهمن 1392, 14:43 عصر
اول اینکه ممنون بابت وقتی که گذاشتید و توضیحاتی که دادید.
.....
خواهش میکنم :)
شما از یه ArrayAdapter(this, android.R.layout.simple_list_item_1, TitleList) استفاده کردین ... خب این باعث میشه در مورد نمایش listview با مشکل مواجه بشین ... پیشنهاد من اینه که بعد از خوندن این اموزش (http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/)اداپتر رو تغییر بدین و همچنین setonclicklistener رو داخل اداپتر پیاده سازی کنید ...
همچنین با توجه به اینکه ایتم هاتون زیاد تغییر میکنن بهتره برای SharedPreferences یه key خاص با توجه به ورودی ( مثلا شماره پست rss یا یه چیزی مثل این ) انتخاب کنید که مشکلی پیش نیاد
پ.ن: اگه تو زمینه custom adapter مشکلی وجود داشت مثال های زیادی تو همین فروم موجود هست ... کافیه سرچ کنید ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.