Установите цвет фона для выбранного элемента ListView в android
У меня есть listview, который отображает несколько элементов. Теперь я хочу прокрутить до определенного элемента (например, 33-й элемент). Я знаю, что это можно сделать через
myList.setSelection(32);
Но в пользовательском интерфейсе элемент не получает подсветки (потому что он находится в режиме касания?!). Как я могу применить определенный цвет фона для этого элемента? Я попробовал
myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);
но я получаю исключение NullPointerException, потому что getSelectedView() возвращает null. Есть ли способ добиться этого выделения? Я должен как-то уведомить пользователя о том, какой элемент является "активным"...
Ответы
Ответ 1
- Чтобы выделить выделенный элемент, вы должны запросить фокус для listView и запустить setSelection() в потоке пользовательского интерфейса. Это сработало для меня:
runOnUiThread(new Runnable() {
public void run() {
myList.requestFocus();
myList.setSelection(position);
}
});
2.Для применения определенного цвета к элементу. Вы можете использовать настраиваемый listItem.
а. Установите индивидуальный lisItem для своего списка:
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.customizedlistitem,arrListView);
myList.setAdapter(listAdapter);
б. В своей папке макета создайте customizedlistitem.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/customizedlistitem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/customizedbackground"/>
с. В вашей папке с рисунком создайте customizedbackground.xml следующим образом:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:state_pressed="false" android:drawable="@color/RED"></item>
<item android:state_pressed="true" android:drawable="@color/GREEN"></item>
<item android:drawable="@color/BLACK"></item> <!-- for other state -->
</selector>
д. Убедитесь, что в вашем проекте определен цвет RED, GREEN и BLACK (вы можете определить его в color.xml в папке значений):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="RED">#FF0000</color>
<color name="GREEN">#008000</color>
<color name="BLACK">#000000</color>
</resources>
Ответ 2
Попробуйте, это сработает -
myList.getChildAt(myList.getSelectedItemPosition()).setBackgroundColor(Color.RED);
Ответ 3
Я попытался следующим образом и решил проблему.
Создал класс javaBean, который получает позицию. Как и после.
public class Global {
public static int mListPosition = 0;
public static int getListPosition() {
return mListPosition;
}
public static void setListPosition(int mListPosition) {
Global.mListPosition = mListPosition;
}
}
Затем из OnListItemClickListener()
я устанавливаю позицию выбранного элемента. Как и после
mList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Global.setListPosition(arg2);
}
});
Затем в классе адаптера выполните следующие
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) mCtx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.details_retailer_list_row, null);
mHolder = new ViewHolder();
v.setTag(mHolder);
mHolder.mDetailsRetailerLayout = (LinearLayout) v
.findViewById(R.id.details_cart_retailer_row_layout);
mHolder.mDetailsRetailer = (TextView) v
.findViewById(R.id.detailsRetailerRow);
} else {
mHolder = (ViewHolder) v.getTag();
}
final CartDetailsRetailerBean mDetailsRetailerBean = mItems
.get(position);
if (position == Global.getListPosition()) {
mHolder.mDetailsRetailerLayout
.setBackgroundResource(R.drawable.image1);
} else {
mHolder.mDetailsRetailerLayout
.setBackgroundResource(R.drawable.image2);
}
if (mDetailsRetailerBean != null) {
Log.i("Global Position", "" + Global.getListPosition());
mHolder.mDetailsRetailer.setText(mDetailsRetailerBean
.getRetailerName());
}
return v;
}
Попробуйте изменить одно из выбранных цветов фона в списке Android.
Ответ 4
ListView в XML файле:
<ListView android:id="@+id/android:list" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/Tablayoutdesign"
android:cacheColorHint="#000000"
android:dividerHeight="1dip"
android:layout_marginTop="63dip"
android:layout_marginBottom="40dip"
/>
Создайте новый xml с именем listselector, например:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selected -->
<item
android:state_focused="true"
android:state_selected="false"
android:drawable="@drawable/focused"/>
<!-- Pressed -->
<item
android:state_selected="true"
android:state_focused="false"
android:drawable="@drawable/selected" />
</selector>
Создайте файл colors.xml, например:
<resources>
<drawable name="focused">#ff5500</drawable>
<drawable name="selected">#FF00FF</drawable>
</resources>
В вашем Java-коде:
ListView lv= (ListView) findViewById(R.id.list);
lv.setSelector( R.drawable.listselector);
Ответ 5
Вероятно, самый простой способ - использовать для вашего фона Drawable State List. Это позволяет применять разные стили в зависимости от того, выбран ли элемент управления/сфокусирован/отключен/и т.д.
Для ознакомления с Drawable State List Drawables посмотрите эту статью.
Ответ 6
Измените строку
myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);
к
myList.getSelectedView().setBackgroundColor(getResources().getColor(Color.RED));
Ответ 7
Значение nullPointerException, вероятно, связано с тем, что вы находитесь в touchmode, setSelection на самом деле не выбирает элемент в спискеView, когда вы находитесь в режиме касания, он просто "смотрит" на него, если вы знаете, что я имею в виду.
Вы должны сделать индивидуальный адаптер (создав класс, который расширяет используемый вами адаптер:])
И в вашем пользовательском классе адаптера вы должны переопределить метод getView (int position, View convertView, ViewGroup parent), например:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = inflater.inflate(android.R.layout.simple_list_item_1, null);
String content = lista.get(position).toString();
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
text.setText(content);
convertView.setBackgroundColor(lista.get(position).getBackgroundColor());
return convertView;
}
В коде переменная "lista" представляет собой список некоторых элементов, которые у меня есть на моем адаптере.
Итак, когда вы закончите выбирать свой элемент, вы должны вызвать getView для каждого элемента, который у вас есть, или вы можете вызвать метод invalidateViews из списка list до, который вы установите для выбора (если вы call invalidateViews после выбора, выбор будет проигнорирован (по крайней мере, на touchmode:]))