[英]How to change button Image like toggle button RecyclerView button click programmatically
我有一个用ListView
填充的RecyclerView
。 在每个ListView
都有一个Button
,它会添加列表。
这是未按下按钮时的外观
这是按下按钮时的外观,
如何保持每个ListView
分别按下按钮的状态?
这是我的适配器
public class BuildCustomAdapter extends RecyclerView.Adapter<BuildCustomAdapter.MyViewHolder> implements Filterable {
private int previousTotal = 0;
private boolean loading = true;
private List<Build> buildList;
private List<Build> buildListCopy;
private ItemFilter mFilter = new ItemFilter();
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.build_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Build build = buildList.get(position);
holder.imageView.setImageResource(build.getImages());
holder.name.setText(build.getName());
}
@Override
public int getItemCount() {
return buildList.size();
}
@Override
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ItemFilter();
}
return mFilter;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public ImageView imageView;
public TextView name;
public Button button;
public MyViewHolder(View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.ivPerson);
name = (TextView) itemView.findViewById(R.id.tvPersonName);
button = (Button) itemView.findViewById(R.id.addbn);
}
}
private class ItemFilter extends Filter {
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
List<Build> filterList = new ArrayList<Build>();
for (int i = 0; i < buildList.size(); i++) {
if ((buildList.get(i).getName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Build builddata = new Build(buildList.get(i).getImages(), buildList.get(i).getName());
filterList.add(builddata);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = buildList.size();
results.values = buildList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
buildList = (ArrayList<Build>) results.values;
notifyDataSetChanged();
}
}
public BuildCustomAdapter(List<Build> buildList) {
this.buildList = buildList;
}
}
Build.class
public class Build {
private String name;
private int images;
public Build(int images, String name) {
this.images = images;
this.name = name;
}
public int getImages() {
return images;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
如果在pojo类中使用selected作为布尔变量会更好,它将帮助适配器根据状态设置图像。 实际上,每当您向上滚动和向下滚动不可见的项目时,就会从内存中删除这些内容,并且我们已经根据button事件更新了列表,因此第二次它将获取所需的状态并再次显示先前的状态图像。
BuildCustomAdapter 始终在您创建适配器时传递上下文,上下文将帮助您
Context context;
public BuildCustomAdapter(List<Build> buildList,Context context) {
this.buildList = buildList;
this.context = context;
}
Build.java
public class Build {
private String name;
private int images;
private boolean selected;
public Build(boolean selected, String name,int images) {
this.images = images;
this.selected=selected;
this.name = name;
}
public int getImages() {
return images;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setSeleted(boolean selected){
this.selected=selected;
}
public boolean isSelected(){
return selected;
}
}
YourAdapter
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Build build = buildList.get(position);
holder.imageView.setImageResources(build.getImages());
holder.name.setText(build.getName());
setImageIntoButton(holder.button,build.isSelected());
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
build.setSelected(!build.isSelected());
setImageIntoButton(holder.button,build.isSelected());
}
});
}
private void setImageIntoButton(Button buttonView,boolean isSelected){
if(isSelected)
buttonView.setBackgroundResource(R.drawable.clicked_image);
else
buttonView.setBackgroundResource(R.drawable.cross_image);
}
ItemFilter更改此语句
Build builddata = new Build(buildList.get(i).isSelected(), buildList.get(i).getName(),buildList.get(i).getImages());
选中此选项可为您的可绘制状态(选中,已激活等):
https://developer.android.com/guide/topics/resources/drawable-resource.html#StateList
另外,ListView具有您可以使用的choiceMode。
https://developer.android.com/reference/android/widget/AbsListView.html#attr_android:choiceMode
转到布局R.layout.build_list_row
然后将背景设置为要执行此操作的按钮,然后使用选择器drawable设置加号和刻度线图像,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_tick" android:state_selected="true" />
<item android:drawable="@drawable/ic_plus" />
</selector>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.