проверьте метод onCheckedChanged, вызываемый в notifyDataSetChanged

У меня есть флажок onCheckedChanged в адаптере recyclerView. Я изменил метод onChecked пользовательского класса. Вот источник моего адаптера.

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private List<PackagesList> transactionList;
private Context mContext;
private int layoutID;
private static Typeface mediumTypeface, lightTypeface;
private int valueInPixels;
private boolean isLoading;


public interface OnLoadMoreListener {
    void onLoadMore();
}

public void setmOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener) {
    this.mOnLoadMoreListener = mOnLoadMoreListener;
}

private OnLoadMoreListener mOnLoadMoreListener;


private final int VIEW_TYPE_ITEM = 0;
private final int VIEW_TYPE_LOADING = 1;

public void setCheckAllcheckbox(boolean checkAllcheckbox) {
    this.checkAllcheckbox = checkAllcheckbox;
}

public boolean isShowingCheckbox;
public boolean checkAllcheckbox;

public void setIsShowingCheckbox(boolean isShowingCheckbox) {
    this.isShowingCheckbox = isShowingCheckbox;
}

public boolean isShowingCheckbox() {
    return isShowingCheckbox;
}


public RecyclerAdapter(int layoutID, final List<PackagesList> transactions, Context context, NestedScrollView nestedScrollView) {

    this.layoutID = layoutID;
    this.mContext = context;
    this.transactionList = transactions;
    mediumTypeface = Typeface.createFromAsset(mContext.getAssets(), "fonts/Roboto-Medium.ttf");
    valueInPixels = (int) mContext.getResources().getDimension(R.dimen.u_common_text_size_large);
    lightTypeface = Typeface.createFromAsset(mContext.getAssets(), "fonts/Roboto-Light.ttf");


    if (nestedScrollView != null) {
        nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (v.getChildAt(v.getChildCount() - 1) != null) {
                    if ((scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight())) &&
                            scrollY > oldScrollY) {
                        if (!isLoading) {

                            if (mOnLoadMoreListener != null) {

                                mOnLoadMoreListener.onLoadMore();
                            }
                            isLoading = true;

                        }
                    }
                }
            }
        });
    }

}

public void setLoaded() {
    isLoading = false;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if (viewType == VIEW_TYPE_LOADING) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_loading_more, parent, false);
        return new LoadingViewHolder(v);
    } else if (viewType == VIEW_TYPE_ITEM) {
        View v = LayoutInflater.from(parent.getContext()).inflate(layoutID, parent, false);
        return new TransactionHolder(v);
    }
    return null;
}

@Override
public long getItemId(int position) {
    return position;
}


@Override
public int getItemViewType(int position) {
    return transactionList.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
}


@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    if (holder instanceof TransactionHolder) {
        final TransactionHolder transactionHolder = (TransactionHolder) holder;
        final PackagesList packagesList = transactionList.get(position);

        if (packagesList != null) {
            transactionHolder.title.setText(packagesList.getTitle());
            transactionHolder.tracking.setText("Tr. Code: " + packagesList.getTracking());
            transactionHolder.desc.setText(packagesList.getDesc());
            transactionHolder.date.setText(packagesList.getDate());
            transactionHolder.price.setText(packagesList.getPrice() + "$");

            String backgroundColor = packagesList.getColor().replace("0x", "#");


            transactionHolder.mainLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onclickListerner != null)
                        onclickListerner.onClickListener("enter", position);
                }
            });

            if (transactionHolder.swipeLayout != null) {
                transactionHolder.swipeLayout.setOnSwipeItemClickListener(new SwipeLayout.OnSwipeItemClickListener() {
                    @Override
                    public void onSwipeItemClick(boolean left, int index) {
                        if (left) {
                            if (onclickListerner != null)
                                onclickListerner.onClickListener("editAction", position);

                        } else {
                            if (onclickListerner != null)
                                onclickListerner.onClickListener("deleteAction", position);
                        }
                    }
                });


            }
            if (isShowingCheckbox) {
                if (!transactionHolder.appCompatCheckBox.isShown())
                    transactionHolder.appCompatCheckBox.setVisibility(View.VISIBLE);
                transactionHolder.circleImageView.setVisibility(View.GONE);
                transactionHolder.letterImageView.setVisibility(View.GONE);


                transactionHolder.appCompatCheckBox.setChecked(packagesList.isChecked());


                transactionHolder.appCompatCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton compoundButton, boolean ischecked) {

                        if (packagesList.isChecked())
                            packagesList.setChecked(false);
                        else
                            packagesList.setChecked(true);


                    }
                });

                transactionHolder.appCompatCheckBox.setChecked(packagesList.isChecked());

            } else {
                transactionHolder.appCompatCheckBox.setVisibility(View.GONE);
                transactionHolder.appCompatCheckBox.setChecked(false);
                if (packagesList.getLogo().length() > 0) {
                    Picasso.with(mContext).load(packagesList.getLogo()).into(transactionHolder.circleImageView);
                    transactionHolder.letterImageView.setVisibility(View.INVISIBLE);
                    transactionHolder.circleImageView.setVisibility(View.VISIBLE);

                } else if (packagesList.getTitle().length() > 0) {

                    transactionHolder.letterImageView.setOval(true);
                    transactionHolder.letterImageView.setInitAllProperties(Color.parseColor("#ffffff"),
                            Color.parseColor(backgroundColor),
                            mediumTypeface, valueInPixels);
                    transactionHolder.letterImageView.setLetter(packagesList.getNickname());
                    transactionHolder.letterImageView.setVisibility(View.VISIBLE);
                    transactionHolder.circleImageView.setVisibility(View.INVISIBLE);


                } else {

                    Picasso.with(mContext).load(packagesList.getDefaultLogo()).into(transactionHolder.circleImageView);
                    transactionHolder.letterImageView.setVisibility(View.INVISIBLE);
                    transactionHolder.circleImageView.setVisibility(View.VISIBLE);
                }
            }

            transactionHolder.mainLayout.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {

                    setIsShowingCheckbox(true);
                    notifyDataSetChanged();

                    return true;
                }
            });


        }
    } else if (holder instanceof LoadingViewHolder) {
        LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
        loadingViewHolder.progressBar.setVisibility(View.VISIBLE);


    }

}


@Override
public int getItemCount() {
    return transactionList == null ? 0 : transactionList.size();

}

public PackagesList getItem(int position) {
    return transactionList.get(position);
}

public interface onclickListerner {
     void onClickListener(String type, int pos);

     void onLongClickListener(String type, int pos);

}

class LoadingViewHolder extends RecyclerView.ViewHolder {
    public MaterialProgressBar progressBar;

    public LoadingViewHolder(View itemView) {
        super(itemView);
        progressBar = itemView.findViewById(R.id.progressBar);
    }
}

public class TransactionHolder extends RecyclerView.ViewHolder {

    private TextView title;
    private TextView tracking;
    private TextView desc;
    private TextView price;
    private TextView date;
    private CircleImageView circleImageView;
    private LetterImageView letterImageView;
    private SwipeLayout swipeLayout;
    private LinearLayout mainLayout;

    private AppCompatCheckBox appCompatCheckBox;

    public TransactionHolder(final View view) {
        super(view);
        title = view.findViewById(R.id.u_title);
        tracking = view.findViewById(R.id.u_tracking);
        desc = view.findViewById(R.id.u_desc);
        price = view.findViewById(R.id.u_price);
        date = view.findViewById(R.id.u_date);
        letterImageView = view.findViewById(R.id.iv_avatar);

        appCompatCheckBox = view.findViewById(R.id.checkbox);

        swipeLayout = itemView.findViewById(R.id.swipe_layout);
        mainLayout = view.findViewById(R.id.mainLayout);

        circleImageView = view.findViewById(R.id.circle_image);
        title.setTypeface(mediumTypeface);
        tracking.setTypeface(mediumTypeface);
        price.setTypeface(mediumTypeface);
        desc.setTypeface(lightTypeface);
        date.setTypeface(mediumTypeface);

    }


}

private onclickListerner onclickListerner;

public void setOnclickListerner(onclickListerner onclickListerner) {
    this.onclickListerner = onclickListerner;
}
}

У меня есть метод onLoad more в моем recyclerView. В методе load more я добавил новые элементы в свой recyclerView и вызвал notifyDataSetChanged. После notifyDataSetChanged, onCheckedChanged вызывается автоматически, а isChecked - false в поле флажка.

Вот фрагмент моего метода загрузки

 if (loadMore) {

                    Log.e("recyclerAdapter after",recyclerAdapter.isShowingCheckbox()+"");
                    if (serverStatus==4 &&!recyclerAdapter.isShowingCheckbox())
                        recyclerAdapter.setIsShowingCheckbox(true);
                    packagesLists.remove(packagesLists.size() - 1);
                    recyclerAdapter.notifyItemRemoved(packagesLists.size());

                    recyclerAdapter.setLoaded();
                    recyclerAdapter.notifyDataSetChanged();


                }

если флажок установлен, после того, как статус флажка notifyDataSetChanged снят. Как я могу переписать свой код, чтобы сохранить статус флажка после notifyDataSetChanged? Спасибо


person BekaKK    schedule 14.12.2017    source источник


Ответы (1)


Сохраните отмеченные позиции флажков в массиве, а затем после notifyDataSetChanged () получите позиции из массива и установите флажки в соответствии с позициями с помощью метода setChecked ().

РЕДАКТИРОВАТЬ: вы можете обновить recylerview со своего адаптера, как это

public void updateData(ArrayList<ViewModel> viewModels) {
    items.clear();
    items.addAll(viewModels);
    notifyDataSetChanged();
}

public void removeItem(int position) {
    items.remove(position);
    notifyItemRemoved(position);
}

Теперь, поскольку эти методы будут в одном адаптере, вы можете установить флажок сейчас

person Prits Ramani    schedule 14.12.2017
comment
Я проверил это, но проблема с setOnCheckedChangeListener вызывается в первый раз, когда я проверял ваше решение следующим образом: transactionHolder.appCompatCheckBox.setChecked (packagesList.isChecked ()); @ Приц Рамани. - person BekaKK; 14.12.2017
comment
Как я могу переписать этот метод? если вы имеете в виду if (ischecked), возможно, это неправильное решение, потому что ischecked ложно после notifyDataSetChanged @Prits Ramani - person BekaKK; 14.12.2017
comment
вы должны проверить это перед notidyDataSetChanged (). Вы уверены, что проверяли раньше? - person Prits Ramani; 14.12.2017
comment
Нет, как это проверить вне адаптера? можешь показать мне отрывок? @Prits Ramani - person BekaKK; 14.12.2017
comment
Почему метод onCheckedChanged вызывается после notidyDataSetChanged? @Prits Ramani - person BekaKK; 14.12.2017
comment
хорошо, я получил ваш метод загрузки еще в recyclerView, верно? @Baggio - person Prits Ramani; 14.12.2017
comment
вы также можете удалять элементы и обновлять элементы из адаптера recyclerview @Baggio, поэтому нет необходимости писать метод load more в recyclerview - person Prits Ramani; 14.12.2017
comment
нет, это не сработает. Я говорю, что вы перемещаете свой notifydatasetchanged на свой адаптер из представления ресайклера - person Prits Ramani; 14.12.2017