我在视图中的每张卡片上都有一个带有复选框的回收站视图。当我点击视图中的特定复选框时,我想取消选中所有其他复选框(条件可能像卡包含奇数等)。我怎样才能做到这一点?我的适配器代码如下。
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类中,有一个名为isTrue()的参数; if,courseSlug.isTrue()== true;然后哪个卡的复选框满足我的条件,它会被检查,其他未选中/选中的复选框将被取消选中。这就是我想要的。
public class CourseSlug {
String name;
String slug;
boolean preselect;
boolean istrue;
public boolean isTrue() {
return istrue;
}
public void setisTrue(boolean isTrue) {
this.isTrue = istrue;
}
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;
}}
答案 0 :(得分:0)
<强>更新强>
由于您已经提到它足以提供支持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);
}
}
<强> PlatformAdapter.java 强>
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);
}
}
<强> CourseSlug.java 强>
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)的真实环境中对此进行了检查,我可以肯定地说它有效。
答案 1 :(得分:0)
将以下方法添加到适配器,并在按下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();
}
使用:
yourCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unselectAll(position);
}
});
答案 2 :(得分:0)
这是一个很好的解决方案。
在interface
adapter
public interface OnCheckChangedListener {
void onItemCheckedChange(yourList list , Index indexOfCheckedItem);
}
同样在适配器中创建它的实例
OnCheckChangedListiner listener;
现在将interface
传递到constructor
的{{1}}。或者您可以在recyleview
中创建其设置器。
adapter
现在public void setListiner (OnCheckChangedListiner listener ){
this.listener = listener;
}
implement
listener
或activity
中的fragment
,并且在创建instance
的{{1}}之后,您可以设置此adapter
listener
1}}喜欢这个
platformAdapter.setListener(YourFragmentName.this);
现在使用adapter
onCheckChanged
方法执行此操作
if (listener !=null ) {
listener.onItemCheckedChange(yourList list , Index indexOfCheckedItem);
}
由于implemented
或listener
中有fragment
个activity
,因此您获得了已检查项目的索引和整个列表(列表已通过,因为您可能实现滚动以加载或删除可能更改片段中原始列表的功能。 Loop
遍历整个列表并更改currentChecked项的数据并调用notifyDataSetChanged();
。
通过这种方式,您还可以防止糟糕的用户体验。如果需要,您还可以重新创建adapter
的新实例。