繁体   English   中英

如何更改按钮像切换按钮RecyclerView按钮这样的图像以编程方式单击

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM