Установить цвет фона для выбранного элемента ListView в Android - PullRequest
13 голосов
/ 19 мая 2011

У меня есть список, который отображает несколько элементов. Теперь я хочу перейти к какому-то конкретному предмету (например, к 33-му предмету). Я знаю, что это можно сделать через

myList.setSelection(32);

Но в пользовательском интерфейсе элемент не получает никакого выделения (потому что он находится в сенсорном режиме ?!). Как я могу применить определенный цвет фона для этого элемента? Я пытался

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);

но я получаю исключение NullPointerException, потому что getSelectedView () возвращает ноль. Есть ли способ добиться этого выделения? Я должен как-то уведомить пользователя о том, какой элемент является «активным» ...

Ответы [ 7 ]

2 голосов
/ 28 мая 2013

Попробуйте, это будет работать -

myList.getChildAt(myList.getSelectedItemPosition()).setBackgroundColor(Color.RED);
2 голосов
/ 28 января 2013
  1. Чтобы выделить выбранный элемент, вы должны запросить фокус для listView и запустить setSelection () в потоке пользовательского интерфейса.Это сработало для меня:
runOnUiThread(new Runnable() {
    public void run() {
        myList.requestFocus();
        myList.setSelection(position);
    }
});

2. Чтобы применить определенный цвет к элементу.Вы можете использовать настраиваемый listItem.

a.Установите настроенный lisItem для вашего списка:

ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.customizedlistitem,arrListView);
myList.setAdapter(listAdapter);

b.В папке макета создайте файл customlistiteite.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"/>   

c.В папке drawable создайте custombackground.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>

d.Убедитесь, что цвета 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>
1 голос
/ 28 мая 2013

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);
0 голосов
/ 28 мая 2013

Возможно, nullPointerException вызвано тем, что вы находитесь в сенсорном режиме, setSelection на самом деле не выбирает элемент в listView, когда вы находитесь в сенсорном режиме, он просто «смотрит» на него, если вы понимаете, о чем я. *

Вы должны создать настроенный адаптер (создав класс, расширяющий используемый адаптер:])

И в своем пользовательском классе адаптера вы должны переопределить метод 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 из вашего listView до того, как вы установите выбор (если вы вызываете invalidateViews после выбора, выбор будет проигнорирован (по крайней мере, в сенсорном режиме:]))

0 голосов
/ 25 сентября 2012

Я попытался следующим способом и решил проблему.

Создан 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.

0 голосов
/ 19 мая 2011

Изменить строку

myList.getSelection().getSelectedView().setBackgroundColor(Color.Red);

до

myList.getSelectedView().setBackgroundColor(getResources().getColor(Color.RED));
0 голосов
/ 19 мая 2011

Вероятно, самый простой способ - использовать список состояний, который можно нарисовать для фона. Это позволяет применять разные стили в зависимости от того, выбран ли соответствующий элемент управления / выбран ли он / отключен / и т. Д.

Для ознакомления с Drawables State State, посмотрите эту статью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...