как установить режим выбора для списка с изображениями

У меня есть listview с изображением. Когда я выбираю каждый элемент, изображение меняет клик на изображении. Но когда я выбираю другой элемент, оба изображения меняются. Я хочу, чтобы только выбранный элемент менял изображение. Он должен функционировать как переключатель с единственным выбором help.pls help.

public class ProvierActivity extends Activity { private String text[] = { "BroadStripe-Cable (Seattle)", "BroadStripe-Digital (Seattle)", "BroadStripe-Cable (Seattle)", "Comcast king county south)", "BroadStripe-Cable (Seattle)", "Comcast king county south", "BroadStripe-Digital (Seattle)", "BroadStripe-Digital (Seattle)", "BroadStripe-Cable (Seattle)", "Comcast king county south" }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final ListView list = (ListView) findViewById(R.id.listview_id); list.setAdapter(new ArrayAdapter(this, R.layout.list, R.id.title, text)); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View view, int position, long arg3) { // TODO Auto-generated method stub if (view.findViewById(R.id.img).getVisibility() == ImageView.VISIBLE) { ImageView icon = (ImageView) view.findViewById(R.id.img); icon.setImageResource(R.drawable.checked); } } }); } } 

Рекомендуемое решение здесь – полагаться на встроенную поддержку выбора ListView, определяющую для него режим одного выбора:

 list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Затем вы должны позволить вашему элементу списка реализовать интерфейс Checkable ; что требует некоторой настройки корневого представления вашего макета. Предполагая, что он имеет LinearLayout в качестве корня, реализация может выглядеть так:

 public class MyListItem extends LinearLayout implements Checkable { public MyListItem(Context context, AttributeSet attrs) { super(context, attrs); } public MyListItem(Context context) { super(context); } private boolean checked = false; private ImageView icon; @Override protected void onFinishInflate() { super.onFinishInflate(); icon = (ImageView)findViewById(R.id.img); // optimisation - you don't need to search for image view every time you want to reference it } @Override public boolean isChecked() { return checked; } @Override public void setChecked(boolean checked) { this.checked = checked; if (icon.getVisibility() == View.VISIBLE) { icon.setImageResource((checked) ? R.drawable.checked : R.drawable.unchecked); } } @Override public void toggle() { setChecked(!checked); } } 

Разумеется, ваш файл макета должен быть обновлен для ссылки на class MyListItem вместо LinearLayout.

Это может быть несколько сложным подходом, но он имеет преимущества, такие как автоматическое восстановление отмеченного элемента при восстановлении активности.

Другой вариант – снова использовать режим выбора списка и переопределить getView адаптера, чтобы узнать, проверен ли элемент и соответственно обновить изображение:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final ListView list = getListView(); list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); list.setAdapter(new ArrayAdapter(this, R.layout.list_item, R.id.title, text) { @Override public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); ImageView icon = (ImageView) v.findViewById(R.id.img); if (list.isItemChecked(position)) { icon.setImageResource(R.drawable.checked); } else { icon.setImageResource(R.drawable.unchecked); } return v; } }); } 

Однако эта версия имеет некоторые проблемы с производительностью – findViewById и setImageResource – относительно трудоемкие операции, поэтому вам следует рассмотреть возможность использования некоторого кэширования. Я рекомендую посмотреть видео «Мир ListView», чтобы узнать некоторые полезные советы об этом виджетах.

Последний подход также связывает адаптер со списком, который вводит ненужную связь.

  1. Установите правильный режим выбора в своем списке. setChoiceMode соответствии с setChoiceMode потребностями.
  2. Создайте дискретный селектор, чтобы использовать изображение, которое вы хотите, в соответствии с состоянием.
  3. Установите селектор в качестве фона.

     android:background="@drawable/your_selector" 

    FYI:

  • Как реализовать поиск в CustomListView на основе classа classа POJO в Android?
  • SearchView In ListView с пользовательским адаптером
  • Использование ListView: как добавить представление заголовка?
  • Обнаружение прокрутки вверх и прокрутка вниз в ListView
  • notifyDataSetChanged () делает обновление списка и прокручивает подсказки назад
  • ListFragment не принимает мой макет
  • Как добавить нижний колонтитул в ListView?
  • Просмотр элементов списка изменений при прокрутке андроида?
  • Ошибка Listview: «В вашем контенте должен быть ListView с атрибутом id« android.R.id.list »
  • Есть ли разница между «ListView.invalidateViews ()» и «Adapter.notifyDataSetChanged ()»?
  • Android - ListView слайд влево / вправо, как и Samsung
  • Давайте будем гением компьютера.