Android 回收器视图中的复选框问题

Android 回收器视图中的复选框问题,android,android-recyclerview,Android,Android Recyclerview,我在视图中的每张卡上都有一个带有复选框的recycler视图。当我单击视图中的某个特定复选框时,我想取消选中所有其他复选框(条件可能类似于卡片包含奇数等)。我该怎么做?我的适配器代码如下 public class PlatformAdapter extends RecyclerView.Adapter<PlatformAdapter.ViewHolder> { ArrayList<Batch> batches; ArrayList<CourseSlug> c

我在视图中的每张卡上都有一个带有复选框的recycler视图。当我单击视图中的某个特定复选框时,我想取消选中所有其他复选框(条件可能类似于卡片包含奇数等)。我该怎么做?我的适配器代码如下

public class PlatformAdapter extends RecyclerView.Adapter<PlatformAdapter.ViewHolder> {

ArrayList<Batch> batches;
ArrayList<CourseSlug> courses;
boolean isInstituteStudent;

public void setBatches(ArrayList<Batch> batches) {
    this.batches = batches;
    notifyDataSetChanged();
}

public void setCourses(ArrayList<CourseSlug> courses) {
    this.courses = courses;
    notifyDataSetChanged();
}

public ArrayList<CourseSlug> getCourses() {
    return courses;
}

public ArrayList<Batch> getBatches() {
    return batches;
}

public void setInstituteStudent(boolean instituteStudent) {
    isInstituteStudent = instituteStudent;
}

public boolean isInstituteStudent() {
    return isInstituteStudent;
}

public PlatformAdapter() {
    courses = new ArrayList<>();
    batches = new ArrayList<>();
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell_platform_item, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    if (isInstituteStudent) {
        Batch batch = batches.get(position);
        holder.enrolment.setText(batch.getName());
        holder.selectEnrollment.setChecked(batch.isPreselect());
    } else {
        final CourseSlug course = courses.get(position);
        holder.enrolment.setText(course.getName());
        holder.selectEnrollment.setChecked(course.isPreselect());


    }
}

@Override
public int getItemCount() {
    return isInstituteStudent ? batches.size() : courses.size();
}

class ViewHolder extends RecyclerView.ViewHolder {

    TextView enrolment;
    CheckBox selectEnrollment;

    public ViewHolder(final View itemView) {
        super(itemView);
        enrolment = (TextView) itemView.findViewById(R.id.tv_entrollment);
        selectEnrollment = (CheckBox) itemView.findViewById(R.id.cb_select_entrollment);
        selectEnrollment.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                int index = getLayoutPosition();
                if(isInstituteStudent) {
                    Batch batch = batches.get(index);
                    batch.setPreselect(b);
                } else {
                    CourseSlug course = courses.get(index);
                    course.setPreselect(b);



                        }
                    }


        });

    }
}

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}
}

已更新

既然您提到提供支持
CourseSlug
类的解决方案就足够了,我现在已经删除了
Batch
类,并根据您的需要提出了一个解决方案。检查以下内容:

Example.java

package com.rencsaridogan.stackoverflow;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ArrayList<CourseSlug> courseSlugs = new ArrayList<>();
    for (int i = 0; i < 10; i++){
      courseSlugs.add(new CourseSlug());
    }

    final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    final PlatformAdapter platformAdapter = new PlatformAdapter();
    platformAdapter.setCourses(courseSlugs);
    PlatformAdapter.Listener listener = new PlatformAdapter.Listener() {
      @Override public void onCheckedChanged(int position) {
        for (int i = 0; i < courseSlugs.size(); i++){
          if (i != position){
            Log.i("Checked",i + " false" + " (Other)");
            courseSlugs.get(i).setPreselect(false);
          }
        }
        runOnUiThread(new Runnable() {
          @Override public void run() {
            if (!recyclerView.isComputingLayout()) {
              platformAdapter.notifyDataSetChanged();
            }
          }
        });
      }
    };
    platformAdapter.setListener(listener);

    recyclerView.setAdapter(platformAdapter);
  }
}
package com.rencsaridogan.stackoverflow;

import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import java.util.ArrayList;

/**
 * Created by rencsaridogan on 16/02/2017.
 */

public class PlatformAdapter extends RecyclerView.Adapter<PlatformAdapter.ViewHolder> {

  ArrayList<CourseSlug> courses;
  Listener listener;

  public void setListener(Listener listener) {
    this.listener = listener;
  }

  public void setCourses(ArrayList<CourseSlug> courses) {
    this.courses = courses;
    notifyDataSetChanged();
  }

  public ArrayList<CourseSlug> getCourses() {
    return courses;
  }

  public PlatformAdapter() {
    courses = new ArrayList<>();
  }

  @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.list_cell_platform_item, parent, false);
    return new ViewHolder(view);
  }

  @Override public void onBindViewHolder(final ViewHolder holder, final int position) {
    final CourseSlug course = courses.get(position);
    holder.enrolment.setText(course.getName());
    holder.selectEnrollment.setChecked(course.isPreselect());
    holder.selectEnrollment.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View view) {
        Log.i("Checked", holder.getAdapterPosition() + " " + holder.selectEnrollment.isChecked());
        course.setPreselect(holder.selectEnrollment.isChecked());
        if (holder.selectEnrollment.isChecked() && listener != null) {
          listener.onCheckedChanged(holder.getAdapterPosition());
        }
      }
    });
  }

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

  class ViewHolder extends RecyclerView.ViewHolder {

    TextView enrolment;
    CheckBox selectEnrollment;

    public ViewHolder(final View itemView) {
      super(itemView);
      enrolment = (TextView) itemView.findViewById(R.id.tv_entrollment);
      selectEnrollment = (CheckBox) itemView.findViewById(R.id.cb_select_entrollment);
    }
  }

  @Override public long getItemId(int position) {
    return super.getItemId(position);
  }

  public interface Listener {
    void onCheckedChanged(int position);
  }
}
package com.rencsaridogan.stackoverflow;

/**
 * Created by rencsaridogan on 16/02/2017.
 */

public class CourseSlug {
  String name;
  String slug;
  boolean preselect;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSlug() {
    return slug;
  }

  public void setSlug(String slug) {
    this.slug = slug;
  }

  public boolean isPreselect() {
    return preselect;
  }

  public void setPreselect(boolean preselect) {
    this.preselect = preselect;
  }
}

您不需要在
CourseSlug
中使用另一个布尔值,因为您有
preselect
变量。我已经在一台设备(LG Nexus 5)的真实环境中对此进行了检查,我可以肯定地说它是有效的。

将下面的方法添加到适配器中,并在按下selectAll复选框时调用它

public void unselectAll(int checkedIndex){
        for(int i=0; i<courses.size(); i++){
            if(i == checkedIndex){
                courses.get(i).setPreselect(true);
                continue;
            }
            courses.get(i).setPreselect(false);
        }
        notifyDataSetChanged();
    }
这里有一个很好的解决方案。 在
适配器中创建
接口

public interface OnCheckChangedListener {
    void onItemCheckedChange(yourList list , Index indexOfCheckedItem);
}
还可以在适配器中创建它的实例

 OnCheckChangedListiner listener;
现在在
recyleview
构造函数中传递这个
接口。或者您可以在
适配器中创建其setter

public void setListiner (OnCheckChangedListiner listener ){
this.listener = listener;
}
现在
活动
片段
中实现
侦听器
,在创建
适配器的
实例
后,您可以像这样设置此
侦听器

 platformAdapter.setListener(YourFragmentName.this);
现在,在您的
适配器
onCheckChanged
方法中执行此操作

if (listener !=null ) {
listener.onItemCheckedChange(yourList list , Index indexOfCheckedItem);
}
由于您已在
片段
活动
中实现了
侦听器
,因此您获得了选中项的索引和整个列表(该列表被传递,因为您可能实现了滚动加载或删除功能,这可能会更改片段中的原始列表)
循环
整个列表,同时更改当前选中项的数据,并调用
notifyDataSetChanged()
通过这样做,您还可以防止糟糕的用户体验。如果需要,您还可以重新创建您的
适配器的新实例。

请共享您的适配器代码是的。请立即检查@phanvanlinhy是否要选中该活动中特定列表项或所有列表项的复选框?是的,我要。如果该特定项属于某个条件(我可以实现),则应取消选中所有其他选中项,并选中当前项@例如,如果回收视图有7个项目。用户勾选第一项复选框六个复选框中的其余复选框必须更改为未勾选?如果您有15个项目,您的应用程序将在此屏幕上变慢,请使用此方法。即糟糕的用户体验。notifySetDataChanged();可以在for语句之外使用,您是对的@NoumanGhaffar。我对你的建议改变了一下自己的解决办法。然而,如果架构是由我设计的,我会采用完全不同的方法,但要修改给定的代码,这似乎是一个很好的解决方案。这种方法会使我的应用程序崩溃。在我的Courseslug类中,有一个名为isTrue()的参数;如果,courseSlug.isTrue()==true;然后哪个卡的复选框满足我的条件,它被选中,其他未选中/选中的框被选中。这就是我想要做的。你能分享这门课程和批次的课程代码吗?这样我就可以为你提供一个全新的设计和解决方案@AtHulAntony@rencsaridogan请再次检查我的问题。我已经说得更具体了,请再读一遍我的问题。我已经说得更清楚了。这不是我想要的。这部分有效。当我点击奇数卡时,其他卡复选框将被取消选中。但我不能取消选中奇数卡,或者如果我在检查奇数卡后检查其他卡,奇数卡不会自动取消选中。请更新代码。根据我在questionplatformAdapter.setListener(YourFragmentName.this)中的代码,您在这里的列表是什么;这一行显示一个错误。请给出一个修复。它应该是您的片段类名称。您的列表是您想要更改数据的列表。我正在使用名为sample的活动。那么如何添加我的活动呢?
 platformAdapter.setListener(YourFragmentName.this);
if (listener !=null ) {
listener.onItemCheckedChange(yourList list , Index indexOfCheckedItem);
}