在recyclerview中滚动时复选框更改状态

时间:2018-01-31 03:52:01

标签: android checkbox android-recyclerview

我制作了一个小应用程序,向我显示安装到手机上的所有应用程序的列表我想为每个cardview添加一个复选框,以便我可以标记我最喜欢的应用程序和其他分类。问题是当滚动列表时,复选框的状态改变为ex。我检查了铬,当我向下滚动然后向上滚动铬没有标记,并检查随机应用程序。我搜索了与此问题相关的其他问题,但这些解决方案都不适合我。

appsadapter.java的更新版本

 public class AppsAdapter extends RecyclerView.Adapter<AppsAdapter.ViewHolder>{
private final SparseBooleanArray array=new SparseBooleanArray();

public class ViewHolder extends RecyclerView.ViewHolder{

    public CardView cardView;
    public ImageView imageView;
    public TextView textView_App_Name;
    public CheckBox checkBox;

    public ViewHolder (View view){

        super(view);
        checkBox = (CheckBox) view.findViewById(R.id.chckbox);
        cardView = (CardView) view.findViewById(R.id.card_view);
        imageView = (ImageView) view.findViewById(R.id.imageview);
        textView_App_Name = (TextView) view.findViewById(R.id.Apk_Name);
        //textView_App_Package_Name = (TextView) view.findViewById(R.id.Apk_Package_Name);

    }
}

private Context context1;
private List<String> stringList;

public AppsAdapter(Context context, List<String> list){

    context1 = context;
    stringList = list;
}

//viewholder initialized
@Override
public AppsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

    View view2 = LayoutInflater.from(context1).inflate(R.layout.cardview_layout,parent,false);
    ViewHolder viewHolder = new ViewHolder(view2);
    return viewHolder;
}

//DATA IS BOUND TO VIEWS
private SparseBooleanArray sba = new SparseBooleanArray();
@Override
public void onBindViewHolder(ViewHolder viewHolder,final int position){

    viewHolder.setIsRecyclable(false);
    ApkInfoExtractor apkInfoExtractor = new ApkInfoExtractor(context1);
    final String ApplicationPackageName = (String) stringList.get(position);

    //calling apps name and icon
    String ApplicationLabelName = apkInfoExtractor.GetAppName(ApplicationPackageName);
    Drawable drawable = apkInfoExtractor.getAppIconByPackageName(ApplicationPackageName);

    //setting app name and icon for every card
    viewHolder.textView_App_Name.setText(ApplicationLabelName);
    viewHolder.imageView.setImageDrawable(drawable);
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sba.put(position, !sba.get(position));
            notifyDataSetChanged();
        }
    });
    viewHolder.checkBox.setChecked(sba.get(position));


    /*Adding click listener on CardView to open clicked application directly from here
    viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = context1.getPackageManager().getLaunchIntentForPackage(ApplicationPackageName);
            if(intent != null){
                context1.startActivity(intent);
            }
            else {
                Toast.makeText(context1,ApplicationPackageName + " Error, Please Try Again.", Toast.LENGTH_LONG).show();
            }
        }
    });*/
}

@Override
public int getItemCount(){
    return stringList.size();
}

}

3 个答案:

答案 0 :(得分:5)

这是因为在回收商视图中,重新使用项目视图来显示新数据。您必须在数据项中添加一个变量,该变量保存特定位置的复选框状态。然后在var chart = AmCharts.makeChart("chartdiv", { "type": "serial", // ... "marginRight": 200, "categoryAxis": { // ... "guides": [{ "category": "Curious", "label": "Stimulating discussion...", "position":"right" }, { "category": "Compassionate", "label": "Showing concern", "position":"right" }, { // etc... }] } }); 中,您可以检查跟踪变量的值并设置复选框的状态,例如onBindViewHolder设置yourCheckbox.setchecked(item.getSelected())方法中的跟踪变量值

答案 1 :(得分:0)

onclicklistener方法中设置视图BindViewholder,以便您可以使用项目的当前位置,如

 private SparseBooleanArray sba = new SparseBooleanArray();
    @Override
    public void onBindViewHolder(ViewHolder viewHolder,final int position){

        viewHolder.setIsRecyclable(false);
        ApkInfoExtractor apkInfoExtractor = new ApkInfoExtractor(context1);
        final String ApplicationPackageName = (String) stringList.get(position);

        //calling apps name and icon
        String ApplicationLabelName = apkInfoExtractor.GetAppName(ApplicationPackageName);
        Drawable drawable = apkInfoExtractor.getAppIconByPackageName(ApplicationPackageName);

        //setting app name and icon for every card
        viewHolder.textView_App_Name.setText(ApplicationLabelName);
        viewHolder.imageView.setImageDrawable(drawable);
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    sba.put(position,!sba.get(position));
                    notifyDataSetChanged();
                }
            });
        viewHolder.checkBox.setChecked(sba.get(position));
    }

答案 2 :(得分:0)

在checkBox onclickListener

中设置复选框
holder.mCheckBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            CheckBox checkBox = (CheckBox) view;
            mDataModel = (DataModel) checkBox.getTag();
            mDataModel.setChecked(checkBox.isChecked());
            arrayList.get(position).setChecked(checkBox.isChecked());

        }
    });