RecyclerView onBindViewHolder onclicklistener 行为
RecyclerView onBindViewHolder onclicklistener behavior
我正在尝试加载列出卡片的回收器视图,每张卡片有四个元素。两个文本视图(posttext,score 是 id)和两个按钮(minusOne 和 plusOne)。
下面的代码在所有卡片上正确加载 textview 的内容和按钮。
我尝试实现以下行为。
onbuttonclick plusOne 按钮,分数将改变,minusOne 按钮被隐藏。
奇怪的是,各个卡片上的分数会正确更新。但是当在一张卡片上执行操作时,隐藏部分似乎发生在多张卡片中。(每 n+5 张卡片)。我该如何解决?我哪里错了?谢谢。
P.S : 建议标题编辑
@Override
public void onBindViewHolder(
final MyViewHolder viewHolder, final int position) {
ParseObject model = items.get(position);
viewHolder.posttext.setText(model.getString("postText"));
viewHolder.score.setText(Integer.toString(model.getInt("score")));
viewHolder.plusOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ParseObject model = items.get(position);
final int score = model.getInt("score");
model.increment("score", 1);
model.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if(e==null)
{
viewHolder.score.setText(Integer.toString(score+1));
viewHolder.minusOne.setVisibility(View.GONE);
}
else{
e.printStackTrace();
}
}
});
}
});
您需要为减号按钮创建布尔数组列表,您可以在模型或适配器中根据需要进行设置,此数组列表将包含按钮的状态,因此默认情况下它将为真,除非用户单击因此它将更改为 false,更新后只需通过 notifyDataSetChanged() 通知适配器,它将显示的视图更新为布尔数组。
@Override
public void onBindViewHolder(
final MyViewHolder viewHolder, final int position) {
ParseObject model = items.get(position);
viewHolder.posttext.setText(model.getString("postText"));
viewHolder.score.setText(Integer.toString(model.getInt("score")));
if (miusButtonStatus.get(position)) {
viewHolder.minusOne.setVisibility(TextView.VISIBLE);
} else {
viewHolder.minusOne.setVisibility(TextView.GONE);
}
viewHolder.plusOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ParseObject model = items.get(position);
final int score = model.getInt("score");
model.increment("score", 1);
model.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if(e==null)
{
viewHolder.score.setText(Integer.toString(score+1));
miusButtonStatus.get(position) = false;
notifyDataSetChanged();
}
else{
e.printStackTrace();
}
}
});
}
});
我正在尝试加载列出卡片的回收器视图,每张卡片有四个元素。两个文本视图(posttext,score 是 id)和两个按钮(minusOne 和 plusOne)。
下面的代码在所有卡片上正确加载 textview 的内容和按钮。
我尝试实现以下行为。
onbuttonclick plusOne 按钮,分数将改变,minusOne 按钮被隐藏。
奇怪的是,各个卡片上的分数会正确更新。但是当在一张卡片上执行操作时,隐藏部分似乎发生在多张卡片中。(每 n+5 张卡片)。我该如何解决?我哪里错了?谢谢。
P.S : 建议标题编辑
@Override
public void onBindViewHolder(
final MyViewHolder viewHolder, final int position) {
ParseObject model = items.get(position);
viewHolder.posttext.setText(model.getString("postText"));
viewHolder.score.setText(Integer.toString(model.getInt("score")));
viewHolder.plusOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ParseObject model = items.get(position);
final int score = model.getInt("score");
model.increment("score", 1);
model.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if(e==null)
{
viewHolder.score.setText(Integer.toString(score+1));
viewHolder.minusOne.setVisibility(View.GONE);
}
else{
e.printStackTrace();
}
}
});
}
});
您需要为减号按钮创建布尔数组列表,您可以在模型或适配器中根据需要进行设置,此数组列表将包含按钮的状态,因此默认情况下它将为真,除非用户单击因此它将更改为 false,更新后只需通过 notifyDataSetChanged() 通知适配器,它将显示的视图更新为布尔数组。
@Override
public void onBindViewHolder(
final MyViewHolder viewHolder, final int position) {
ParseObject model = items.get(position);
viewHolder.posttext.setText(model.getString("postText"));
viewHolder.score.setText(Integer.toString(model.getInt("score")));
if (miusButtonStatus.get(position)) {
viewHolder.minusOne.setVisibility(TextView.VISIBLE);
} else {
viewHolder.minusOne.setVisibility(TextView.GONE);
}
viewHolder.plusOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ParseObject model = items.get(position);
final int score = model.getInt("score");
model.increment("score", 1);
model.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if(e==null)
{
viewHolder.score.setText(Integer.toString(score+1));
miusButtonStatus.get(position) = false;
notifyDataSetChanged();
}
else{
e.printStackTrace();
}
}
});
}
});