Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式更改按钮图像,如切换按钮回收查看按钮单击_Java_Android_Listview_Android Recyclerview_Android Button - Fatal编程技术网

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());