【问题标题】:RecyclerView OnBindViewHolder unexpectedRecyclerView OnBindViewHolder 意外
【发布时间】:2017-05-23 18:28:35
【问题描述】:

onBindViewHolder 在数据绑定到视图后的第一个位置和最后一个位置意外调用。这造成了问题,因为当我尝试将项目添加到列表时,最后一项的ImageViews(喜欢和不喜欢)正在与列表中的第一项交换/回收。我怎样才能防止这种情况发生?

回收站适配器代码:

public class RecyclerAdapterForOpinion extends RecyclerView.Adapter<RecyclerAdapterForOpinion.OpinionViewHolder> {

private LayoutInflater inflater;
private List<ParseObject> opinionList;
private String currentUsername = Application.currentUser.getString("Name");

public RecyclerAdapterForOpinion(Context context, List<ParseObject> opinionList) {
    inflater = LayoutInflater.from(context);
    this.opinionList = opinionList;
}

@Override
public OpinionViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    Log.d("RecyclerAdapter", "OnCreateViewHolder called");
    View itemView = inflater.inflate(R.layout.item_view_poll, viewGroup, false);
    return new OpinionViewHolder(itemView);
}

@Override
public void onBindViewHolder(final OpinionViewHolder opinionViewHolder, final int position) {

    Log.d("RecyclerAdapter", "OnBindViewHolder called for position: " + position);
    ParseObject current = opinionList.get(position);
    opinionViewHolder.entry.setText(current.getString("entry"));
    opinionViewHolder.rationale.setText(current.getString("rationale"));
    opinionViewHolder.priority.setText("" + current.getInt("priority"));

    List<String> userLikes = (List<String>) current.get("userLike");
    List<String> userUnlikes = (List<String>) current.get("userUnlike");

    if (userLikes != null) {
        if(userLikes.size() != 0){
            if (userLikes.contains(currentUsername)) {
                    opinionViewHolder.like.setChecked(true);
            }
        }
    }
    if (userUnlikes != null) {
        if(userUnlikes.size() != 0) {
            if (userUnlikes.contains(currentUsername)) {
                    opinionViewHolder.unlike.setChecked(true);
            }
        }
    }  
}

@Override
public int getItemCount() {
    return opinionList.size();
}

public void addItem(ParseObject opinion) {
    opinionList.add(opinion);
    notifyDataSetChanged();
}

public class OpinionViewHolder extends RecyclerView.ViewHolder {

    TextView entry;
    TextView rationale;
    TextView priority;
    CheckBox like, unlike;
    ImageButton trash;

    public OpinionViewHolder(View itemView) {
        super(itemView);
        entry = (TextView) itemView.findViewById(R.id.opinionEntry);
        like = (CheckBox) itemView.findViewById(R.id.opinionLike);
        unlike = (CheckBox) itemView.findViewById(R.id.opinionUnlike);
        rationale = (TextView) itemView.findViewById(R.id.opinionRationale);
        priority = (TextView) itemView.findViewById(R.id.opinionPriority);
        trash = (ImageButton) itemView.findViewById(R.id.trash);


        like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ParseObject current = opinionList.get(getAdapterPosition());
                CheckBox check = (CheckBox) v;
                if (check.isChecked()) {
                    Application.likeOpinion(current);
                } else {
                    Application.removeLike(current);
                }
                priority.setText("" + current.getInt("priority"));
            }
        });

        unlike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ParseObject current = opinionList.get(getAdapterPosition());
                CheckBox check = (CheckBox) v;
                if (check.isChecked()) {
                    Application.unlikeOpinion(current);
                } else {
                    Application.removeUnlike(current);
                }
                priority.setText("" + current.getInt("priority"));
            }
        });
    }
 }

}

Logcat 输出:

06-30 19:47:01.499    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnCreateViewHolder called

06-30 19:47:01.519    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnBindViewHolder called for position: 0

06-30 19:47:01.529    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnCreateViewHolder called

06-30 19:47:01.539    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnBindViewHolder called for position: 1

06-30 19:47:01.539    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnCreateViewHolder called

06-30 19:47:01.549    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnBindViewHolder called for position: 2

06-30 19:47:01.549    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnBindViewHolder called for position: 0

06-30 19:47:01.549    8579-8579/com.nishantjain.dime.dime D/RecyclerAdapter﹕ OnBindViewHolder called for position: 2

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    在适配器中始终使用else 和每个if 语句。特别是在处理视图时。

    if (userLikes != null && userLikes.size() != 0 && userLikes.contains(currentUsername)) {
        opinionViewHolder.like.setChecked(true);
    }else{
       opinionViewHolder.like.setChecked(false);
    }
    

    对另一个做同样的事情。希望它能解决你的问题。

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2021-08-07
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多