Android RecyclerView为每十个图标按钮设置状态,而不仅仅是按下的按钮

Android RecyclerView为每十个图标按钮设置状态,而不仅仅是按下的按钮,android,android-layout,android-recyclerview,Android,Android Layout,Android Recyclerview,我的recyclerview包含星形按钮的图像按钮。 因此,当用户单击imagebutton时,它必须变为黄色。 当用户再次单击此图像按钮时,它必须变为灰色。 我将按钮的位置和状态保存在hashmap中。状态可以是-1或1。当状态为1时,按钮变为黄色;当状态为-1时,按钮变为灰色 我要做的第一件事是为onBindViewHolder方法中的每个位置设置一个状态,比如hashMap中每个位置的状态为-1,这意味着按钮未被选中且为灰色。因此,位置是键,状态(-1或1)是hashMap中的值 pub

我的recyclerview包含星形按钮的图像按钮。 因此,当用户单击imagebutton时,它必须变为黄色。 当用户再次单击此图像按钮时,它必须变为灰色。 我将按钮的位置和状态保存在hashmap中。状态可以是-1或1。当状态为1时,按钮变为黄色;当状态为-1时,按钮变为灰色

我要做的第一件事是为onBindViewHolder方法中的每个位置设置一个状态,比如hashMap中每个位置的状态为-1,这意味着按钮未被选中且为灰色。因此,位置是键,状态(-1或1)是hashMap中的值

 public void onBindViewHolder(final MyViewHolder holder, final int position){
      if(!hashMapStarButtons.containsKey(position)){
         hashMapStarButtons.put(position), -1);
      }
因此,当按下图像按钮时

onBindViewHolder(最终MyViewHolder,最终int位置)

方法我采取的立场,我检查的状态,并改变它

holder.starButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
           int currentStat = hashMapStarButtons.get(position);   
           currentStat = currentStat * (-1);

           if(currentStat==1){
                holder.starButton.setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_on));
           }else{
                holder.starButton.setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_off));
           }
这里的问题是,当我按下位置2上的按钮时,该按钮必须变为黄色,因为状态变为1,recyclerView将位置12、22、32上的按钮也变为黄色。 当我按下位置13上的按钮时,位置3、23、33上的按钮颜色也会改变。 真奇怪。 当我检查HAshMap中的所有值时,只有已按下按钮的状态发生了更改,而其他按钮的状态则没有更改

这是我的课程

class MyViewHolder extends   RecyclerView.ViewHolder {

    View view;

    // final
    private ImageButton starButton;
    private TextView movie;


    public MyViewHolder(View viewItem){
        super(viewItem);

        starButton = (ImageButton)viewItem.findViewById(R.id.starButton);
        movie = (TextView)viewItem.findViewById(R.id.movie);

    }


    public void setMovie(String movie){
        movie.setText(movie);
    }

}
这是适配器类

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

private List<String> list;
private HashMap<Integer, Integer> hashMapStarButtons;

public MyAdapter(List<Movie> list){
    this.list = list;
    hashMapStarButtons = new HashMap<Integer, Integer>();

}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    // Hole das Layout für die Row
    return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_row, parent, false));
}

// onBindViewHolder is called for every single item in the RecyclerView
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position){
    Movie movie = list.get(position);
    holder.setMovie(movie.getMovie());

    if(!hashMapStarButtons.containsKey(position)){
        hashMapStarButtons.put(position, -1);
    }

    holder.starButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            int currentStat = hashMapStarButtons.get(position);
            currentStat = currentStat * (-1);

            if(currentStat==1){
                holder.starButton.setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_on));
            }else{
                holder.starButton.setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_off));
            }



        }
    });

}
公共类MyAdapter扩展了RecyclerView.Adapter{ 私人名单; 私有HashMap hashMapStarButtons; 公共MyAdapter(列表){ this.list=列表; hashMapStarButtons=新建HashMap(); } @凌驾 公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ //冲模排孔das布局图 返回新的MyViewHolder(LayoutInflater.from(parent.getContext()).flate(R.layout.movie_行,parent,false)); } //对RecyclerView中的每个项目调用onBindViewHolder @凌驾 公共无效onBindViewHolder(最终MyViewHolder,最终int位置){ 电影=列表。获取(位置); holder.setMovie(movie.getMovie()); 如果(!hashMapStarButtons.containsKey(位置)){ hashMapStarButtons.put(位置-1); } holder.starButton.setOnClickListener(新视图.OnClickListener(){ 公共void onClick(视图){ int currentStat=hashMapStarButtons.get(位置); currentStat=currentStat*(-1); 如果(currentStat==1){ setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_on)); }否则{ holder.starButton.setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_off)); } } }); } }

这是我的活动,我从中从firebase加载数据

public class MyActivity  extends AppCompatActivity {

private FirebaseAuth mAuth;
private DatabaseReference mStatusDB;

// everything for RecyclerView
private RecyclerView recyclerView;
private List<String> list;
private MyAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mymovies);

    mStatusDB = FirebaseDatabase.getInstance().getReference().child("movies");

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView = (RecyclerView)findViewById(R.id.movRecylerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(linearLayoutManager);
    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);

    list = new ArrayList<>();
    getList();

    adapter = new MyAdapter(list);
    recyclerView.setAdapter(adapter);
}

private void getList(){
    mStatusDB.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Movie movie = new Movie();

            for(DataSnapshot snapshot:dataSnapshot.getChildren()){

                String key = snapshot.getKey();
                String mov = snapshot.getValue().toString();
                movie.setMovie(value);
            }

            list.add(movie);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
公共类MyActivity扩展了AppCompatActivity{
私人消防队;
私人数据库参考mStatusDB;
//回收站查看的所有内容
私人回收站;
私人名单;
专用MyAdapter适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u mymovies);
mStatusDB=FirebaseDatabase.getInstance().getReference().child(“电影”);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(此);
linearLayoutManager.setOrientation(linearLayoutManager.VERTICAL);
recyclerView=(recyclerView)findViewById(R.id.movRecylerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(linearLayoutManager);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
列表=新的ArrayList();
getList();
适配器=新的MyAdapter(列表);
recyclerView.setAdapter(适配器);
}
私有void getList(){
mStatusDB.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
电影=新电影();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
String key=snapshot.getKey();
字符串mov=snapshot.getValue().toString();
movie.setMovie(值);
}
列表。添加(电影);
adapter.notifyDataSetChanged();
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
}

在这里,您只能看到十行的问题:

请帮我找出问题出在哪里? 它不在状态的hashmap中。
在图片中,第10行的状态为-1,这意味着按钮应为灰色。

问题是您没有在
OnBindViewHolder(final MyViewHolder holder,final int position)
中进行检查,这是位于
位置的项目状态。查看代码,您只在OnClickListener()中检查它

代码中出现的情况是,项目1的视图被回收并用于放置项目10,但视图中的星形是黄色的,而在OnBindViewHolder中,您没有将其颜色重置为白色

我的建议是:

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position){
    Movie movie = list.get(position);
    holder.setMovie(movie.getMovie());

    if(!hashMapStarButtons.containsKey(position)){
        hashMapStarButtons.put(position, -1);
    }
    if(hashMapStarButtons.get(position)==-1){
        holder.starButton.setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_off));
    } else {
         holder.starButton.setImageDrawable(ContextCompat.getDrawable(view.getContext(),android.R.drawable.btn_star_big_on));
    }
    ...
}

问题是您没有在
OnBindViewHolder(最终MyViewHolder,最终int位置)
内部进行检查,这是
位置处项目的状态。查看代码,您只在OnClickListener()中检查它

代码中发生的事情是项目1的视图被回收并用于放置项目10,但是视图中的星星是colo
public void setItemViewCacheSize(int size)
 list = new ArrayList<>();
    getList();
    adapter = new MyAdapter(list);
recyclerView.setItemViewCacheSize(list.size());
    recyclerView.setAdapter(adapter);