带有复选框的RecyclerView会检查具有相同索引值的子类别中的所有项目

时间:2017-04-14 12:31:50

标签: android checkbox android-recyclerview

我有一个回收视图,其中列出了许多项目并点击了1项目打开了一个对话框,其中包含该项目的子类别。每个子类别都有一个checkbpx。问题是,当我点击1复选框并单击确定然后返回要选择另一个类别,还要检查另一个子类别中相同索引的项目。这是我在“对话框”中列出子类别的代码

 @Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.bt_ok:
          //  Updatecatagory();
            for (int i = 0; i < mysubcatagoryAdapter.catagory_list.size(); i++) {

                if (!mysubcatagoryAdapter.isChecked) {
                   // mysubcatagoryAdapter.removehash.get(i).;
                    //mysubcatagoryAdapter.removehash.clear();
                    mysubcatagoryAdapter.removehash.remove(i);
                }
            }

            finish();
    }
}

这是我的适配器

public class CustomRecycleViewAdapter_Language extends 
RecyclerView.Adapter<CustomRecycleViewAdapter_Language.MyLanguageViewHolder> 
{
private Context context;
public ArrayList<String> catagory_list;
private View resourceLayout;
private OnSelected onSelected;
private String checkForAction;
public ArrayList<String> removehash;
public boolean isChecked=false;
int count = 1;
SharedPreferences selection = 
getApplicationContext().getSharedPreferences("MyLang", MODE_PRIVATE);

SharedPreferences.Editor editor = selection.edit();

public CustomRecycleViewAdapter_Language(Context context, ArrayList<String> 
catagory_list, String checkForAction) {
    this.context = context;
    this.catagory_list = catagory_list;
    this.checkForAction = checkForAction;

}

public class MyLanguageViewHolder extends RecyclerView.ViewHolder {
    private TextView tv_option;
    private CheckBox cb_option;
    private RelativeLayout rl_option;

    public MyLanguageViewHolder(View itemView) {
        super(itemView);
        tv_option = (TextView) itemView.findViewById(R.id.tv_option);
        cb_option = (CheckBox) itemView.findViewById(R.id.cb_option);
        rl_option = (RelativeLayout) itemView.findViewById(R.id.rl_option);
    }
}

@Override
public MyLanguageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    resourceLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.resource_selectfilter, null);
    MyLanguageViewHolder mcv = new MyLanguageViewHolder(resourceLayout);
    return mcv;
}

@Override
public void onBindViewHolder(final MyLanguageViewHolder holder, final int position) {
     holder.tv_option.setText(catagory_list.get(position).split("#")
    [1].substring(0, 1).toUpperCase() + 
    catagory_list.get(position).split("#")[1].substring(1));
    removehash = new ArrayList<>();
    removehash.clear();

    Common.languageselection.add(position);

    for (int i = 0; i < catagory_list.size(); i++) {

        removehash.add(catagory_list.get(i).split("#")[0]);
    }


    if (!Common.isFlag) {


        try {
            if(Common.languageselection.size()!=0) {

                if 
           (Common.setid.get(position).equals(String.valueOf(position))) {

                    holder.cb_option.setChecked(true);


                }
            }
            count = 2;
        } catch (Exception e) {

        }


    }


    if (checkForAction.equals("UPLOAD")) {
        holder.cb_option.setVisibility(View.GONE);

    }


    holder.rl_option.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (onSelected != null) {

                if (count == 2) {
                    if (!holder.cb_option.isChecked()) {
                        holder.cb_option.setChecked(true);
                        removehash.get(position);
                        isChecked=true;
                        Common.setid.add(String.valueOf(position));
                    } else if (holder.cb_option.isChecked()) {

                        holder.cb_option.setChecked(false);
                        Common.setid.remove(String.valueOf(position));
                        removehash.remove(position);


                    }

                    onSelected.onClicked(view, removehash.get(position));
                    isChecked=true;

                } else {

                    if (!holder.cb_option.isChecked()) {
                        holder.cb_option.setChecked(true);
                        Common.setid.add(String.valueOf(position));
                        removehash.get(position);
                        isChecked=true;

                    } else if (holder.cb_option.isChecked()) {
                        holder.cb_option.setChecked(false);
                        removehash.remove(position);
                        Common.setid.remove(String.valueOf(position));
                    }
                    if (checkForAction.equals("UPLOAD")) {
                        holder.cb_option.setVisibility(View.GONE);
                        onSelected.onClicked(view, catagory_list.get(position));
                    } else
                        onSelected.onClicked(view, removehash.get(position));
                    Common.holdvalues.add(removehash.get(position));

                }


                Log.v("SHOW", removehash.toString());


            }
        }
    });


  //        try
  //        {
  //
  //            if(Common.languageselection.size()>0)
 //            {
//            for(int i=0;i<Common.languageselection.size();i++)
//            {
//
//
//                
            if(Common.languageselection.get(i).equals(Common.setid.get(i)))
//                {
//
//                    holder.cb_option.setChecked(true);
//                }
//                else
//                    holder.cb_option.setChecked(false);
//
//            }
//            }
//
//        }catch (Exception e)
//        {
//
//        }

   /* holder.tv_option.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (onlanguageSelected != null) {
                onlanguageSelected.onLanguageClicked(view,catagory_list.get(position));
            }
        }
    });*/
}

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

public void setOnSelected(OnSelected onSelected) {
    this.onSelected = onSelected;
}

public interface OnSelected {
    public void onClicked(View view, String selectedVal);
}


}

这是布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/white">

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_subcatagories"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="2dp"
        android:padding="20dp"
        android:scrollbars="vertical">
         </android.support.v7.widget.RecyclerView>

        <LinearLayout
        android:id="@+id/ll_respondcontainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
        android:layout_below="@+id/rv_subcatagories"
        android:orientation="horizontal"
        android:padding="10dp">

        <Button
            android:id="@+id/bt_ok"
            android:layout_width="80dp"
            android:layout_height="30dp"
            android:layout_marginRight="2dp"
            android:background="@drawable/btn_background"
            android:text="OK"
            android:textColor="@color/white" />

    </LinearLayout>
   </RelativeLayout>
   </RelativeLayout>

RecyclerView项目

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingRight="3dp"
android:paddingTop="2dp">

<RelativeLayout
    android:id="@+id/rl_option"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:orientation="horizontal"
    android:padding="5dp"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true">
    <CheckBox
        android:id="@+id/cb_option"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:clickable="false"
        android:button="@drawable/checkbox_selector"
        android:gravity="left" />

    <TextView
        android:id="@+id/tv_option"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:text="Arindom"
        android:background="@drawable/edittext_bg"
        android:gravity="center"
        android:padding="2dp"
        android:textColor="@color/filtertextcolor"
        android:textSize="15dp" />

    <View
        android:id="@+id/UnderPassword"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_below="@+id/tv_option"
        android:layout_centerHorizontal="true"
        android:background="@color/linecolor" />
</RelativeLayout>
</RelativeLayout>

2 个答案:

答案 0 :(得分:0)

从你的问题我做了一个例子,请检查它是否有帮助。

  

主类RecyclerView活动

public class RecyclerViewActivity extends AppCompatActivity implements CategoryClickListener {
    private RecyclerView recyclerViewCategory;
    private RecyclerView.LayoutManager mLayoutManager;
    private Context context = RecyclerViewActivity.this;
    private Activity activity = RecyclerViewActivity.this;


        private CategoryAdapter categoryAdapter;
        private CategoryClickListener categoryClickListener;

        ArrayList<ArrayList<SubcategoryModel>> listData = new ArrayList<>();
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_recycler_view);

            categoryClickListener = this;
            getDummyData();
            recyclerViewCategory = (RecyclerView) findViewById(R.id.recycler_view);
            mLayoutManager = new LinearLayoutManager(context);
            recyclerViewCategory.setHasFixedSize(true);
            recyclerViewCategory.setLayoutManager(mLayoutManager);

            categoryAdapter = new CategoryAdapter(context, listData, categoryClickListener);
            recyclerViewCategory.setAdapter(categoryAdapter);


        }

        public void getDummyData() {
            for (int i = 0; i < 10; i++) {
                ArrayList<SubcategoryModel> subCategoryData = new ArrayList<>();
                subCategoryData.add(new SubcategoryModel("Sub category 1", false));
                subCategoryData.add(new SubcategoryModel("Sub category 2", false));
                subCategoryData.add(new SubcategoryModel("Sub category 3", false));
                subCategoryData.add(new SubcategoryModel("Sub category 4", false));
                subCategoryData.add(new SubcategoryModel("Sub category 5", false));
                listData.add(subCategoryData);
            }
        }
        private void showDialog(ArrayList<SubcategoryModel> listSubcategory) {
            try {

                final Dialog dialog = new Dialog(context);
                dialog.setCancelable(true);
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.getWindow().getAttributes().windowAnimations
                        = R.style.Animation_AppCompat_DropDownUp;

                dialog.setContentView(R.layout.dialog_subcategory);

                WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                Window window = dialog.getWindow();
                lp.copyFrom(window.getAttributes());
                lp.width = WindowManager.LayoutParams.MATCH_PARENT;
                lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
                window.setAttributes(lp);

                RecyclerView recyclerViewSubcategory = (RecyclerView) dialog.findViewById(R.id.recycler_view_subcategory);
                RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context);
                recyclerViewSubcategory.setHasFixedSize(true);
                recyclerViewSubcategory.setLayoutManager(mLayoutManager);

                SubCategoryAdapter adapter = new SubCategoryAdapter(context, listSubcategory);
                recyclerViewSubcategory.setAdapter(adapter);


                dialog.show();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }



        @Override
        public void categoryClick(int position) {
               showDialog(listData.get(position));
        }
    }
  

类别适配器类

public class CategoryAdapter  extends RecyclerView.Adapter<CategoryAdapter.CustomViewHolder> {

    private ArrayList<ArrayList<SubcategoryModel>> listData;
    private Context context;
    private CategoryClickListener categoryClickListener;

    public CategoryAdapter(Context context, ArrayList<ArrayList<SubcategoryModel>> listData, CategoryClickListener categoryClickListener) {
        this.listData = listData;
        this.context = context;
        this.categoryClickListener = categoryClickListener;
    }

    @Override
    public CategoryAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_category_view, parent, false);

        CategoryAdapter.CustomViewHolder viewHolder = new CategoryAdapter.CustomViewHolder(view);
        return viewHolder;
    }

    //This method binds all widgets with a value
    @Override
    public void onBindViewHolder(final CategoryAdapter.CustomViewHolder holder, int position) {
        try {

            holder.textViewCategory.setText("Category "+(position+1));


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView textViewCategory;


        public CustomViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            textViewCategory = (TextView) itemView.findViewById(R.id.textViewCategory);


        }

        @Override
        public void onClick(View v) {

               categoryClickListener.categoryClick(getAdapterPosition());


        }
    }
}
  

子类别适配器类

class SubCategoryAdapter   extends RecyclerView.Adapter<SubCategoryAdapter.CustomViewHolder> {

    private ArrayList<SubcategoryModel> listData;
    private Context context;

    public SubCategoryAdapter(Context context, ArrayList<SubcategoryModel> listData) {
        this.listData = listData;
        this.context = context;
    }

    @Override
    public SubCategoryAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_subcategory_view, parent, false);

        SubCategoryAdapter.CustomViewHolder viewHolder = new SubCategoryAdapter.CustomViewHolder(view);
        return viewHolder;
    }

    //This method binds all widgets with a value
    @Override
    public void onBindViewHolder(final SubCategoryAdapter.CustomViewHolder holder, int position) {
        try {

            SubcategoryModel subCategory = listData.get(position);
            holder.textViewSubCategory.setText(subCategory.name);
            if(subCategory.isChecked)
            {
                holder.checkBox.setChecked(true);
            }else{
                holder.checkBox.setChecked(false);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    class CustomViewHolder extends RecyclerView.ViewHolder {

        private TextView textViewSubCategory;
        private CheckBox checkBox;


        public CustomViewHolder(View itemView) {
            super(itemView);
            textViewSubCategory = (TextView) itemView.findViewById(R.id.textViewSubCategory);
            checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    listData.get(getAdapterPosition()).isChecked=isChecked;

                }
            });

        }

    }
}
  

子类别模型类

public class SubcategoryModel {

    String name;
    boolean isChecked;

    public SubcategoryModel(String name, boolean isChecked)
    {
        this.name = name;
        this.isChecked = isChecked;
    }

}
  

类别点击监听器

public interface CategoryClickListener {

    public void categoryClick(int position);

}
  

activity_recycler_view

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:scrollbars="none">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>
  

dialog_subcategory

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view_subcategory"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:scrollbars="none">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>
  

row_category_view

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white"
    android:padding="10dp">

    <TextView
        android:id="@+id/textViewCategory"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"/>


</LinearLayout>
  

row_subcategory_view

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/textViewSubCategory"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"/>



</LinearLayout>

可能对您有所帮助。

答案 1 :(得分:0)

您需要在 onBindViewHolder 中分配选中状态之前将侦听器设置为 null

holder.rl_option.setOnClickListener(null)

我使用复选框侦听器 here

创建了一个示例