如何在Recyclerview中实现复选框



我有一个用于recyclerview的适配器。我从我的活动中传递数组列表,例如 data 是具有一些数据的arraylist。

 AlternativeAdapter alternativeAdapter= new AlternativeAdapter(AlternativeActivity.this, data);
    recyclerView.setAdapter(alternativeAdapter);

在替代性研究类中,我有一个文本视图和复选框。我可以显示所有带有复选框的文本项目。

在替代性研究类中

public class AlternativeCurrencyAdapter extends RecyclerView.Adapter<AlternativeCurrencyAdapter.ViewHolder>{
 ArrayList<String> currencyListArray;
    Context context;
    View view1;
    ViewHolder viewHolder1;
    TextView textView;
    private int selectedPosition = -1;// no selection by default
    public AlternativeCurrencyAdapter(Context context1, ArrayList<String> currencyListArray){
        this.currencyListArray = currencyListArray;
        context = context1;
    }    
    public  class ViewHolder extends RecyclerView.ViewHolder{
        public TextView username;
        public CheckBox chkSelected;
        public ViewHolder(View v){
            super(v);
            username = (TextView)v.findViewById(R.id.username);
            chkSelected = (CheckBox) v.findViewById(R.id.chkSelected);
            itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    // get position
                    int pos = getAdapterPosition();
                    // check if item still exists
                    if(pos != RecyclerView.NO_POSITION){
                        String clickedDataItem = currencyListArray.get(pos);
                        Toast.makeText(v.getContext(), "You clicked " + clickedDataItem, Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }
    @Override
    public AlternativeCurrencyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        view1 = LayoutInflater.from(context).inflate(R.layout.alternative_currency_adapter_list,parent,false);
        viewHolder1 = new ViewHolder(view1);
        return viewHolder1;
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position){
        holder.username.setText(currencyListArray.get(position));
    }
    @Override
    public int getItemCount(){
        return currencyListArray.size();
    }
}

这样,数组列表的项目正在显示,但我的需求应在左角显示,每个项目的复选框应在右角显示。当您在复选框上单击一些单击时,应该像您选择的XYZ项目一样出现吐司消息。只需要单个选择,而不是多选择。

当我使用

 holder.chkSelected.setChecked(currencyListArray.get(position).isSelected());

i显示编译时间错误。无法解析 ISSELECTED()

请指导我。

第一件事,您的crurnersListArray是字符串的arraylist,因此它不返回" isselected()"对不起!

现在要满足您的要求,您需要在选择任何复选框时显示消息。

因此,这样的代码:

   @Override
public void onBindViewHolder(ViewHolder holder, final int position){
    holder.username.setText(currencyListArray.get(position));
    holder.chkSelected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            //do your toast programming here.
        }
    });
}

现在要提出您的第二个要求,一次仅选择一个项目:以下是代码::

 chkSelected.setChecked(position== selectedPosition);
        chkSelected.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    selectedPosition =  position;
                }
                else{
                     selectedPosition = -1;
                }
                notifyDataSetChanged();
            }
        });

工作示例

    class ApplicationsAdapter(val userList: ArrayList<DataX>, var callBack: AdapterCallback) :
        RecyclerView.Adapter<ApplicationsAdapter.ViewHolder>() {
        interface AdapterCallback {
            fun onAppLockedUnlocked(position: Int, status: Boolean)
        }
    
        //this method is returning the view for each item in the list
        override fun onCreateViewHolder(
            parent: ViewGroup,
            viewType: Int
        ): ViewHolder {
            val v =
                LayoutInflater.from(parent.context).inflate(R.layout.item_view_app_list, parent, false)
            return ViewHolder(v)
        }
    
        //this method is binding the data on the list
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder.bindItems(userList[position], callBack)
        }
    
        //this method is giving the size of the list
        override fun getItemCount(): Int {
            return userList.size
        }
    
        //the class is hodling the list view
        class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    
            fun bindItems(
                dataX: DataX,
                callBack: AdapterCallback
            ) {
                val tvAppName = itemView.findViewById(R.id.tvAppName) as TextView
                val checkboxLockUnlock = itemView.findViewById(R.id.checkboxLockUnlock) as CheckBox
                tvAppName.text = dataX.appName
                // set listener null here
                checkboxLockUnlock.setOnCheckedChangeListener(null)
                if (dataX.isLocked) {
                    checkboxLockUnlock.isChecked = true
                } else {
                    checkboxLockUnlock.isChecked = false
                }
               // initialize listener after checkbox state changed 
checkboxLockUnlock.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
                    if (isChecked) {
                        callBack.onAppLockedUnlocked(adapterPosition, true)
                    } else {
                        callBack.onAppLockedUnlocked(adapterPosition, false)
                    }
                }
                )
            }
        }
    }

最新更新