Расширяемая проблема повторного использования списка - PullRequest
0 голосов
/ 08 мая 2019

Друзья, я использую расширяемый просмотр списка для отображения различных категорий и их подпунктов. Я использую флажок для выбора подэлементов, так что несколько подэлементов могут быть выбраны из различных категорий. Но здесь я сталкиваюсь с проблемой из-за повторного использования представлений. Когда я раскрываю категорию и ставлю флажок в подпунктах в ней, то, когда я нажимаю на другую категорию, в ней уже установлен какой-то флажок. Я предполагаю, что это происходит из-за повторного использования представлений. Я хочу решить эту проблему. Я сталкивался с подобной проблемой и с Recyclerview. Пожалуйста, ведите меня в этом. Заранее спасибо. Я добавляю код моего адаптера для справки -

 public class DayBookAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<DayBookData> listDataHeader;
    String msubItem,mcategory;
    ArrayList<String>  selecteditems;
    ArrayList<String>  selectedcategories;
    public DayBookAdapter(Context context, List<DayBookData> listDataHeader, ArrayList<String> selectedItems,ArrayList<String> selectedcategories) {
        this._context = context;
        this.listDataHeader = listDataHeader;
        this.selecteditems = selectedItems;
        this.selectedcategories = selectedcategories;
    }

    @Override
    public ArrayList<DayBookDetailsData> getChild(int groupPosition, int childPosititon) {
        return this.listDataHeader.get(groupPosition).getCh_list();
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @SuppressLint("InflateParams")
    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

        final DayBookDetailsData childText = listDataHeader.get(groupPosition).getCh_list().get(childPosition);
        Boolean checkstatus = childText.isIschecked();
        Log.d("checkstatus", "getChildView: "+checkstatus);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.day_book_details_data_item, null);
        }

        TextView item_txt_sub_cat_id = convertView.findViewById(R.id.item_id);
        item_txt_sub_cat_id.setText(childText.getItem_id());

        CheckBox item_txt_sub_cat_name = convertView.findViewById(R.id.item_name);
        item_txt_sub_cat_name.setText(childText.getItem_name());

        item_txt_sub_cat_name.setOnClickListener(new View.OnClickListener() {


            public void onClick(View v) {
                final CheckBox cb = (CheckBox) v;


                msubItem = listDataHeader.get(groupPosition).getCh_list().get(childPosition).getItem_id();
                mcategory = listDataHeader.get(groupPosition).getCategory_id();
                if (cb.isChecked()) {

                    childText.setIschecked(true);
                    selecteditems.add(msubItem);
                    selectedcategories.add(mcategory);
                    Log.d("itemschecked", "items -"+selecteditems+"categories-"+selectedcategories);
                } else {
                    childText.setIschecked(false);
                    selecteditems.remove(msubItem);
                    selectedcategories.remove(mcategory);
                    Log.d("itemschecked", "items -"+selecteditems+"categories-"+selectedcategories);
                }
            }
        });
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this.listDataHeader.get(groupPosition).getCh_list().size();
    }

    @Override
    public DayBookData getGroup(int groupPosition) {
        return this.listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this.listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @SuppressLint("InflateParams")
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        DayBookData headerTitle = getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.day_book_data_item, null);
        }
        TextView item_txt_category_id = convertView.findViewById(R.id.category_id);
        TextView item_txt_category_name = convertView.findViewById(R.id.category_name);
        item_txt_category_id.setText(headerTitle.getCategory_id());
        item_txt_category_name.setText(headerTitle.getCategory_name());
        return convertView;
    }
    @Override
    public boolean hasStableIds() {
        return false;
    }
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

Дайте мне знать, если вам нужно что-нибудь еще. Спасибо.

Отредактировано - Вот мой файл pojo для подразделов, кто-нибудь может сказать мне, какие изменения должны быть сделаны?

public class DayBookDetailsData {

    private String item_name;
    private String item_id;

    public boolean isIschecked() {
        return ischecked;
    }

    public void setIschecked(boolean ischecked) {
        this.ischecked = ischecked;
    }

    boolean ischecked;

    public DayBookDetailsData(String item_name, String item_id,boolean ischecked) {
        this.item_name = item_name;
        this.item_id = item_id;
        this.ischecked = ischecked;
    }

    public String getItem_name() {
        return item_name;
    }

    public String getItem_id() {
        return item_id;
    }


}

А вот мой код синтаксического анализа JSON, где я устанавливаю логическое значение -

  bData.setCategory_id(jObjIn.getString("cat_id"));
                bData.setCategory_name(jObjIn.getString("c_name"));

                JSONArray jArrItemData = new JSONArray(jObjIn.getString("itemdata"));

                for (int j = 0; j < jArrItemData.length(); j++) {

                    JSONObject jObjItem = new JSONObject(jArrItemData.getString(j));

                    try {

                        String item_id = jObjItem.getString("id");
                        String item_name = jObjItem.getString("item");
                        Boolean checkstatus = false;
                        bData.getCh_list().add(new DayBookDetailsData(item_name, item_id,checkstatus));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                listData.add(bData);
            }

            exp_listview.setAdapter(new DayBookAdapter(getActivity(), listData,selectedItems,selectedcategory));

Я обновил файл в соответствии с вашим предложением, но он не помогает мне. Не могли бы вы сказать мне, что не так с моим кодом.

1 Ответ

0 голосов
/ 08 мая 2019

В каждом дочернем объекте модели сохраните логическое значение isChecked и обновляйте его, когда вы проверяете / снимаете флажки элементов.Затем явно установите проверенное состояние флажка, когда вы получите представление.

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

ex:

getChildView(...){

  checkbox.setChecked(getChild(groupPosition, childPosition).getCheckedStatus());
}

onChildClick(){
getChild(groupPosition, childPosition).setCheckedStatus(...)
}
...