【问题标题】:check onCheckedChanged method called on notifyDataSetChanged检查在 notifyDataSetChanged 上调用的 onCheckedChanged 方法
【发布时间】:2017-12-14 18:35:37
【问题描述】:

我在 recyclerView 适配器中有复选框的 onCheckedChanged。我更改了自定义类的 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;
}
}

我在我的 recyclerView 中有 onLoad more 方法。在加载更多方法中,我在我的 recyclerView 中添加了新元素并调用 notifyDataSetChanged。在 notifyDataSetChanged 之后,onCheckedChanged 自动调用并且 isChecked 在复选框中为 false。

这是我的加载更多方法的sn-p

 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 后保存复选框状态? 谢谢

【问题讨论】:

    标签: android android-recyclerview android-adapter android-checkbox


    【解决方案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);
    }
    

    现在这些方法将在同一个适配器中,因此您现在可以检查复选框

    【讨论】:

    • 我检查过了,但是当我第一次检查你的解决方案时调用 setOnCheckedChangeListener 的问题是这样的:tr​​ansactionHolder.appCompatCheckBox.setChecked(packagesList.isChecked()); @Prits Ramani。
    • 如何重写这个方法?如果你的意思是 if(ischecked),也许这是一个错误的解决方案,因为在 notifyDataSetChanged @Prits Ramani 之后,ischecked 是错误的
    • 你必须在notidyDataSetChanged()之前检查它。你确定你以前检查过吗?
    • 不。我没有。如何在适配器外部检查它?你能给我看一个sn-p吗? @Prits Ramani
    • 为什么在 notidyDataSetChanged 之后调用 onCheckedChanged 方法? @Prits Ramani
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多