Android - ToggleButton теряет свое состояние после прокрутки ListView

Уже два дня пытаюсь решить эту проблему. Я видел много вопросов, связанных с этой проблемой. Но мне они не подошли.
У меня есть ListView. Каждая строка содержит один ImageView, два TextView и один ToggleButton. Все эти загрузки в порядке. Когда я меняю состояние ToggleButton на true, затем, когда я прокручиваю вниз и снова прокручиваю вверх, ToggleButton теряет свое состояние. Это снова идет к false.

Вот мой ArrayAdapter

private class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] strings) {
        super(context, resource, textViewResourceId, strings);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        LayoutInflater inflater  = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.friends_list_item_layout, parent, false);

        RoundedImageView friendThumb = (RoundedImageView) row.findViewById(R.id.friendDp);
        TextView friendName = (TextView) row.findViewById(R.id.friendName);
        TextView friendNumber = (TextView) row.findViewById(R.id.friendNumber);
        ToggleButton shareToggle = (ToggleButton) row.findViewById(R.id.shareLocatioToggle);

        friendName.setText(myItems[position]);
        friendNumber.setText("8888888888");
        //friendThumb.setImageResource(R.drawable.friend_dp_thumb);

        shareToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                // TODO Auto-generated method stub
                if (arg1) {
                    Toast.makeText(getApplicationContext(), "Shared with "+myItems[position], Toast.LENGTH_SHORT).show();
                }
            }
        });

        shareToggle.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Share your location", Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        return row;
    }



}

Спасибо


person Community    schedule 26.02.2015    source источник
comment
вы должны явно установить состояние переключения на вашем getView() на основе текущего элемента, так же, как вы устанавливаете текст для вашего TextView   -  person hidro    schedule 26.02.2015
comment
а как это сделать в коде? я сбит с толку   -  person    schedule 26.02.2015
comment
возможный дубликат Проблема с выбором ViewHolder   -  person Sufian    schedule 09.03.2015


Ответы (3)


Вам нужны две вещи: массив для запоминания того, какие элементы были переключены, и явно setChecked() те, которые были переключены.

private boolean[] myChecks = new boolean[myItems.length];
private class MyAdapter extends ArrayAdapter<String> {
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ...
        shareToggle.setChecked(myChecks[position]);
        shareToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                ...
                myChecks[position] = arg1;
            }
        });
}
person hidro    schedule 26.02.2015
comment
Идеальное решение. Большое спасибо :) - person ; 26.02.2015

Вы должны поддерживать флаг для переключения с помощью метода setter getter, по умолчанию он отключен, затем вам нужно включить / выключить переключение и вызвать notifydatasetchanged () для поддержания его состояния.

person Jignesh Jain    schedule 26.02.2015
comment
Проверьте эту ссылку wptrafficanalyzer.in/blog/ - person Jignesh Jain; 26.02.2015

Состояние переключения воссоздается, если его представление находится вне видимости представления списка. Можно сделать всю активность прокручиваемой. Чтобы кнопка-переключатель не теряла своего состояния

person Shanu S    schedule 26.02.2015