Подтвердить что ты не робот

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

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

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<String>(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);
                }
            }
        });
    }
}
4b9b3361

Ответ 1

Рекомендуемое решение здесь - полагаться на встроенную поддержку выбора 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);
    }
}

Ваш файл макета должен быть обновлен для ссылки на класс 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<String>(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" , чтобы узнать некоторые полезные советы об этом виджетах.

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

Ответ 2