Просмотр списка, содержащий флажок и текст, сбрасывается при прокрутке

Я нарисовал настраиваемый ящик навигации с ListView и заголовком, но когда я прокручиваю список, флажок в списке снимается.

Во-вторых, когда я нажимаю кнопку сброса в части заголовка, я хочу, чтобы все флажки в Listview были сняты. Я пытался заставить его работать, но не могу найти никакого решения.

Фрагменты

public class NavigationDrawer extends Fragment{
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.filter_navigation_drawer, container,false);
        drawerListView= ( ListView ) view.findViewById( R.id.listDrawer );
        drawerListView.setOnItemClickListener(new FilterDrawerItemClickListener());

        dataList.add(new FilterDrawerItem("sample1",true));
        dataList.add(new FilterDrawerItem("sample2",true));
        dataList.add(new FilterDrawerItem("sample3",true));
        dataList.add(new FilterDrawerItem("sample4",true));
        dataList.add(new FilterDrawerItem("sample5",true));
        dataList.add(new FilterDrawerItem("sample2",true));
        dataList.add(new FilterDrawerItem("sample2",true));
        dataList.add(new FilterDrawerItem("sample2",true));
        dataList.add(new FilterDrawerItem("sample2",true));

        adapter = new FilterCustomDrawerAdapter(getActivity(), R.layout.drawer_filter,dataList,drawerStatus);
        drawerListView.setAdapter(adapter);
        adapter.getFilterList();

        resetBtn = (TextView)view.findViewById(R.id.filterby_reset);
        if(resetBtn != null){
            resetBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    application.setFilterStatus("reset");
                    for(int i=0; i<dataList.size(); i++){
                       dataList.get(i).setCheckBoxId(false);
                    }
                    adapter.notifyDataSetChanged();
                    // this.onCreateView();
                }
            });
        }

        return view;
    }
}

FilterCustomDrawerAdapter.java

public class FilterCustomDrawerAdapter extends ArrayAdapter<FilterDrawerItem> {

    Context context;
    List<FilterDrawerItem> drawerItemList;
    int layoutResID;
    int item = 0;
    String status;
    List<Integer> filterList = new ArrayList<Integer>();
    DrawerStatus drawerStatus;
    StataApplication application = StataApplication.getInstance();

    HashMap<Integer, Boolean> checked;   // newly added code

    public FilterCustomDrawerAdapter(Context context, int layoutResourceID,
                                     List<FilterDrawerItem> listItems,DrawerStatus drawerStatus) {
        super(context, layoutResourceID, listItems);
        this.context = context;
        this.drawerItemList = listItems;
        this.layoutResID = layoutResourceID;
        this.drawerStatus = drawerStatus;
        checked = new HashMap<Integer, Boolean>(getCount());
    }

    public FilterCustomDrawerAdapter(Context context, int layoutResourceID,
                                     List<FilterDrawerItem> listItems) {
        super(context, layoutResourceID, listItems);
        this.context = context;
        this.drawerItemList = listItems;
        this.layoutResID = layoutResourceID;
    }

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

        final FilterDrawerItemHolder drawerHolder;
        View view = convertView;

        if (view == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            drawerHolder = new FilterDrawerItemHolder();

            view = inflater.inflate(layoutResID, parent, false);
            drawerHolder.ItemName = (TextView) view.findViewById(R.id.drawer_filterName);
            drawerHolder.checkBox = (CheckBox) view.findViewById(R.id.drawer_cbox);

            view.setTag(drawerHolder);
        } else {
            drawerHolder = (FilterDrawerItemHolder) view.getTag();
        }

        FilterDrawerItem dItem = (FilterDrawerItem) this.drawerItemList.get(position);

        drawerHolder.ItemName.setText(dItem.getItemName());
        TextView resetView = (TextView)view.findViewById(R.id.filterby_reset);
        CheckBox checkBox = (CheckBox) view.findViewById(R.id.drawer_cbox);

        // Newly added code
        Boolean isChecked = checked.get(position);
        checkBox.setChecked(isChecked == null ? false : isChecked);

      // if(application.getFilterStatus() != null) {
           if(checkBox.isChecked()){
               drawerHolder.checkBox.setChecked(false);
           }
      // }

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                if (isChecked) {
                    filterList.add(new Integer(position));
                    checked.put(position, true);
                } else {
                    filterList.remove(new Integer(position));
                    checked.put(position, false);
                }
            }
        });

        drawerHolder.checkBox.setTag(position);
        Log.d("FILTER_LIST_SIZE",String.valueOf(filterList.size()));

        return view;
    }

    private static class FilterDrawerItemHolder {
        TextView ItemName;
        CheckBox checkBox;
    }

    public List<Integer> getFilterList(){
        return filterList;
    }
}

На изображении ниже, когда я прокручиваю список и устанавливаю флажки sample1 и sample 2, он становится не отмеченным при прокрутке. а также нажав кнопку сброса в заголовке, я хочу, чтобы все мои флажки были сняты. Не могу заставить это работать ...

ОБНОВЛЕНИЕ 1

 resetBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    List<FilterDrawerItem> adapterDataList = adapter.getDrawerItemList();
                    for(int i=0; i<adapterDataList.size(); i++){  // At this place i am getting the size as 9
                        adapterDataList.get(i).setCheckBoxId(false);
                    }
                    adapter.setDrawerItemList(adapterDataList);
                    adapter.notifyDataSetChanged();
                }
            });

введите описание изображения здесь


person anand    schedule 19.11.2014    source источник


Ответы (2)


Это из-за повторного использования представлений в ListView. Вы должны создать HashMap:

HashMap<Integer, Boolean> checked;

Затем в своем конструкторе сделайте следующее:

checked = new HashMap<Integer, Boolean>(getCount());

После установки OnCheckedChangeListener на ваши флажки и в методе события сделайте следующее:

checked.put(position, yourCheckBoxCheckedState);

А в методе getView () сделайте так:

Boolean isChecked = checked.get(position);
checkBox.setChecked(isChecked == null ? false : isChecked)

Попробуйте это, я думаю, это должно помочь

ОБНОВИТЬ

resetBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.deselectAll();
            }
        });

Затем в методе создания адаптера:

 public void deselectAll() {
   checked = new HashMap<Integer, Boolean>(getCount());
   notifyDataSetChanged();
 }
person Orest Savchak    schedule 19.11.2014
comment
Я получаю, что флажок первой части теперь не устанавливается, но как сбросить все флажки при нажатии кнопки сброса - person anand; 19.11.2014
comment
Просто напишите еще раз checked = new HashMap ‹Integer, Boolean› (getCount ()); - person Orest Savchak; 19.11.2014
comment
Я отредактировал свой ответ вашим кодом ... не могли бы вы посоветовать мне, как заставить это свойство сброса работать, чтобы все флажки были сняты ... - person anand; 19.11.2014
comment
Извините, я не смог. Попробуйте мой обновленный ответ, он должен делать то, что вам нужно. - person Orest Savchak; 19.11.2014

В вашем классе FilterDrawerItem создайте логическую переменную isChecked.

Теперь в своем классе адаптера напишите что-то вроде этого:

if(dItem.isChecked){
    drawerHolder.checkBox.setChecked(true);
}
else{
    drawerHolder.checkBox.setChecked(false);
}

и в вашем OnCheckedChangeListener:

if (isChecked) {
    //your other code
    dItem.setChecked(true);
    notifyDataSetChanged();
} else {
    //your other code
    dItem.setChecked(false);
    notifyDataSetChanged();
}

Ответ @Orest Savchak также правильный, но отслеживание флажков в ваших классах POJO поможет вам позже получить отмеченные элементы, а также сделать другие вещи проще, например, вы хотите снять все флажки при нажатии кнопки «Сброс». Для этого в onClick() на кнопке сброса вам просто нужно сделать:

for(int i=0; i<FilterDrawerItem.size; i++){
    FilterDrawerItem.get(i).setChecked(false);
}
adapterObject.notifyDataSetChanged();

ИЗМЕНИТЬ 1:

Создайте установщик геттера для drawerItemList в вашем адаптере, а затем в onClick() кнопки сброса вместо dataList выполните следующие действия:

List<FilterDrawerItem> adapterDataList=adapter.getDataList();
for(int i=0; i<adapterDataList.size(); i++){
    adapterDataList.get(i).setCheckBoxId(false);
}
adapter.setDataList(adapterDataList);
adapter.notifyDataSetChanged();
person DroidDev    schedule 19.11.2014
comment
мне нужно поддерживать POJO флажков - person anand; 19.11.2014
comment
при сбросе Onclick фрагмент выглядит так ... но я не получаю никаких результатов. для (int i = 0; i ‹dataList.size (); i ++) {dataList.get (i) .setCheckBoxId (false); } adapter.notifyDataSetChanged (); - person anand; 19.11.2014
comment
извините, я не понимаю, что вы имеете в виду, когда не получаете результатов @anand. Не могли бы вы уточнить? Кроме того, не нужно вызывать это в onClick() кнопки сброса. - person DroidDev; 19.11.2014
comment
Я отредактировал свой ответ для кнопки OnClick () на кнопке сброса. Я также получаю вызов адаптера, но он не сбрасывает флажки ... - person anand; 19.11.2014
comment
Я обновил код вашим в ОБНОВЛЕНИЕ 1, но флажок не сбрасывается .. @ DroidDev - person anand; 19.11.2014