如何在android中选择和取消选择recycleview
我已经创建了recycleview。该recycleview包含复选框。如果我单击recycleview中的第一个项目,复选框将被选中,然后我单击第二个项目意味着选中了第一个和第二个项目复选框。该复选框工作正常,但如果我单击第二个项目复选框,我想取消选中第一个选中项目。`如何在android中选择和取消选择recycleview,android,Android,我已经创建了recycleview。该recycleview包含复选框。如果我单击recycleview中的第一个项目,复选框将被选中,然后我单击第二个项目意味着选中了第一个和第二个项目复选框。该复选框工作正常,但如果我单击第二个项目复选框,我想取消选中第一个选中项目。` public static class AddressAdapter1 extends RecyclerView.Adapter<AddressAdapter1.MyViewHolder> { p
public static class AddressAdapter1 extends RecyclerView.Adapter<AddressAdapter1.MyViewHolder> {
private int lastSelectedPosition = -1;
private final Context mcontext;
private AdapterView.OnItemClickListener onItemClickListener;
private AdapterView.OnItemLongClickListener onItemLongClickListener;
public ArrayList<Child> movieItems;
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView address1,landmark1,building1,others_text;
public ImageView home,work,others,edit;
public CheckBox checkbox;
public MyViewHolder(View view) {
super(view);
address1 = (TextView) view.findViewById(R.id.address);
landmark1 = (TextView) view.findViewById(R.id.landmark);
building1 = (TextView) view.findViewById(R.id.building);
others_text = (TextView) view.findViewById(R.id.others_text);
others = (ImageView) view.findViewById(R.id.others);
home = (ImageView) view.findViewById(R.id.home);
work = (ImageView) view.findViewById(R.id.work);
edit = (ImageView) view.findViewById(R.id.edit);
checkbox = (CheckBox) view.findViewById(R.id.checkbox);
}
}
public AddressAdapter1(Context mcontext,ArrayList<Child> movieItems ) {
this.mcontext = mcontext;
this.movieItems = movieItems;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.profile_list, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
final Child m = movieItems.get(position);
holder.edit.setVisibility(View.GONE);
if (m.getaddress() != null) {
if (!m.getaddress().equals("null")) {
holder.address1.setText(m.getaddress());
}
if (m.getbuilding() != null) {
if (!m.getbuilding().equals("null")) {
holder.building1.setText("Building/Flatno: "+m.getbuilding());
}
if (m.getlandmark() != null) {
if (!m.getlandmark().equals("null")) {
holder.landmark1.setText("Landmark: "+m.getlandmark());
}
if (m.getaddress_type() != null) {
if (!m.getaddress_type().equals("null")) {
String type=m.getaddress_type();
if(type.equals("1")){
holder. home.setVisibility(View.VISIBLE);
holder. others_text.setText("Home");
}
else if(type.equals("2")){
holder. work.setVisibility(View.VISIBLE);
holder. home.setVisibility(View.GONE);
holder. others_text.setText("Work");
}
else{
holder.others.setVisibility(View.VISIBLE);
holder. home.setVisibility(View.GONE);
holder. others_text.setText("Other");
}
}
}
}
}
holder.checkbox.setChecked(m.isSelected());
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
movieItems.get(getPosition).setSelected(buttonView.isChecked());
final Child m=new Child();
m.setSelected(isChecked);
}
});
holder.checkbox.setTag(position);
}
}
@Override
public int getItemCount() {
return movieItems.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
}
`试试这个:
private int lastSelectedPosition = -1; // adapter variable
holder.checkbox.setChecked(m.isSelected());
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
movieItems.get(getPosition).setSelected(buttonView.isChecked());
final Child m=new Child();
if (getPosition != lastSelectedPosition) {
m.setSelected(isChecked);
if (lastSelectedPosition != -1) {
movieItems.get(lastSelectedPosition ).setSelected(false) // unselect last selection
notifyItemChanged(lastSelectedPosition); // notify adapter
}
}
lastSelectedPosition = isChecked ? getPosition : -1; // remember last selected position
}
});
holder.checkbox.setTag(position);
更新
要避免RecyclerView异常,请尝试在处理程序中包含notifyItemChanged调用:
Handler handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
notifyItemChanged(lastSelectedPosition); // notify adapter
}
};
handler.post(r);
在模型类中取一个布尔值:
private boolean isCheck;
public boolean isCheck() {
return isCheck;
}
public void setCheck(boolean check) {
isCheck = check;
}
在适配器的onBindViewHolder中:
private CompoundButton.OnCheckedChangeListener checkedListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag.
boolean flag= movieItems.get(getPosition).isCheck();
for (int i = 0; i < movieItems.size(); i++) {
if (getPosition == i) {
movieItems.get(getPosition).setCheck(true);
} else {
movieItems.get(getPosition).setCheck(false);
}
}
notifyDataSetChanged();
// m.setSelected(isChecked);
});;
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.checkbox.setOnCheckedChangeListener(null);
holder.checkbox.setChecked(movieItems.get(position).isCheck());
holder.checkbox.setOnCheckedChangeListener(checkedListener);
}
private CompoundButton.OnCheckedChangeListener checkedListener=new CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//TODO自动生成的方法存根
int getPosition=(Integer)v.getTag();//这里我们使用setTag获取为复选框设置的位置。
布尔标志=movieItems.get(getPosition).isCheck();
对于(int i=0;i
只需编写一个toggleCheckBox()方法,该方法只需检查一个是否选中,它就会取消选中,反之亦然versa@Abserve技术检查onBindViewHolder()上的POJO类变量调用它的位置?是否要取消选中上一条记录或上一条选择的第二条记录?用一些示例@eenVincibleView解释如何在recycleview中获取getItemAtPosition?您的答案与我预期的一样正常,但出现此错误“当recycleview计算布局或滚动时无法调用此方法”@lubilisprevoius值未选中@Nisarg@Abserve技术人员:您想一次只检查一个,对吗?在更新您的日志后,我已经发布了我的logcat错误answer@AbserveTech尝试notifyItemChanged(getPosition);而不是notifyDataSetChanged();@Abserve Tech如果这不起作用,请告诉我我们还有其他解决方案
private CompoundButton.OnCheckedChangeListener checkedListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
int getPosition = (Integer) v.getTag(); // Here we get the position that we have set for the checkbox using setTag.
boolean flag= movieItems.get(getPosition).isCheck();
for (int i = 0; i < movieItems.size(); i++) {
if (getPosition == i) {
movieItems.get(getPosition).setCheck(true);
} else {
movieItems.get(getPosition).setCheck(false);
}
}
notifyDataSetChanged();
// m.setSelected(isChecked);
});;
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.checkbox.setOnCheckedChangeListener(null);
holder.checkbox.setChecked(movieItems.get(position).isCheck());
holder.checkbox.setOnCheckedChangeListener(checkedListener);
}