Java 如何以编程方式更改按钮图像,如切换按钮回收查看按钮单击
我有一个Java 如何以编程方式更改按钮图像,如切换按钮回收查看按钮单击,java,android,listview,android-recyclerview,android-button,Java,Android,Listview,Android Recyclerview,Android Button,我有一个RecyclerView,其中填充了ListView。在每个列表视图上都有一个按钮,用于向上添加列表 以下是按钮未按下时的外观 以下是按钮按下时的外观, 如何使每个列表视图的按钮保持按下状态 这是我的适配器 public class BuildCustomAdapter extends RecyclerView.Adapter<BuildCustomAdapter.MyViewHolder> implements Filterable { private in
RecyclerView
,其中填充了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;
}
}
@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);
}
勾选此项可为您的可绘图状态(已选择、已激活等):
此外,ListView还有一个可供使用的choiceMode
转到您的布局R.layout.构建列表行
并将背景设置为要执行此操作的按钮,并使用选择器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>
如果在pojo类中使用selected作为布尔变量会更好,它将帮助适配器根据状态设置映像。实际上,无论何时上下滚动,不可见的项目都会从内存中删除,并且我们已经根据按钮事件更新了列表,所以第二次它将获取所需的状态并再次显示上一个状态图像
BuildCustomAdapter始终传递上下文无论何时创建适配器,上下文都会帮助您
您的适配器
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;
}
}
@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());
这个方法是合适的,但是我已经通过编程实现了!在您的场景设置中,使用XML的选择器被认为是一种最好的方法。但是,如果想以编程方式切换,而不是使用IF条件,我将不建议通过这个代码,您就不必使用<代码> Bug =新建(R.Dababel.AK,“Aksahy Kumar”);code>Hi Abdul Rizwan在我的例子中,我没有在活动类`Build=new Build(R.drawable.ak,“Aksahy Kumar”)中放置`public Build(boolean selected,String name){//this.images=images;this.selected=selected;this.name=name;}`;buildList.add(build)`你能把你的活动代码。你到底想做什么?首先,如果您遇到困难,请检查代码和流程,然后告诉我。如果您正在创建一个对象并将其放入活动列表中,请通过类似Build(null,“alok kumar”)代码>它将工作,我传递的第一个参数为null,因此默认情况下,它将布尔值设置为false。所以根据false,适配器将把crossImage设置到imageView中。我希望它能对您有所帮助。我已经尝试过这段代码,但错误是:(96,43)错误:不兼容的类型:int不能在活动类中转换为boolean,错误build=newbuild(R.drawable.ps,“Pramukh Swami”);
Build builddata = new Build(buildList.get(i).isSelected(), buildList.get(i).getName(),buildList.get(i).getImages());