Выделение элемента в ListView - PullRequest
0 голосов
/ 25 ноября 2011

Хорошо, я знаю, что этот вопрос уже задавался ранее на этом сайте, но, честно говоря, я не получил никаких результатов от решений, которые я видел.Например, этот пост: выделение выделенного элемента в виде списка в android предполагает, что все, что вам нужно сделать, это установить параметр choiceMode для ListView.Я пробовал это, и это не работает вообще.

В моем коде у меня есть прослушиватель для ListView (onListItemClick), и каждый раз, когда он запускается, у меня появляется что-то вроде этого ... getListView().setItemChecked(position, true), и, кроме того, у меня есть селектор XML, который яприкрепил к моему ListView ...

<ListView                       
  android:id="@id/android:list"
  android:layout_width="wrap_content"
  android:layout_height="fill_parent"
  android:scrollbars="none"
  android:layout_weight="1.5"
  android:choiceMode="singleChoice"
  android:listSelector="@drawable/bounty_list_selector"/>

Я что-то упустил здесь?setItemChecked() не влияет на селектор ListView?

1 Ответ

0 голосов
/ 25 ноября 2011

У меня была похожая проблема, и я решил ее с помощью кода. Возможно, это не самое светлое и не самое эффективное решение, но оно работает над проблемами рисования ListView и пока, похоже, работает хорошо.

Файл активности:

private ListView listView;
private View selectedView;
private int selectedPosition;
private MyAdapter arrayAdapter;

...
// set a state machine for when a list item is clicked
    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (selectedPosition == -1) {
                // no item is selected, mark as selected
                selectedView = view;
                view.setBackgroundResource(R.drawable.bg_selected);
                selectedPosition = position;
            } else if (selectedPosition == position) {
                // the same item is selected as the previous one, deselect
                selectedView = null;
                view.setBackgroundResource(R.drawable.bg_unselected);
                selectedPosition = -1;
            } else {
                // another item is selected, deselect the previous and select the new one
                selectedView.setBackgroundResource(R.drawable.bg_unselected);
                selectedView = view;
                view.setBackgroundResource(R.drawable.bg_selected);
                selectedPosition = position;
            }

            arrayAdapter.setSelectedPosition(selectedPosition);
        }
    });

Код адаптера:

public class MyAdapter extends ArrayAdapter<MyObject> {
    private int selectedPosition;

    private static class ViewHolder {
        RelativeLayout layout;
        ...
    }

    public void setSelectedPosition(int selectedPosition) {
        this.selectedPosition = selectedPosition;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, null);
            holder = new ViewHolder();
            holder.layout = (RelativeLayout) convertView.findViewById(R.id.rl_item);
            ...

            convertView.setTag(holder);
        }
        else
            holder = (ViewHolder) convertView.getTag();

        ...
        if (position == selectedPosition)
            holder.layout.setBackgroundResource(R.drawable.bg_selected);
        else
            holder.layout.setBackgroundResource(R.drawable.bg_unselected);
        ...

        return convertView;
     }

     ...
}

Надеюсь, это поможет!

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