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