我为列表视图创建了Adapter。我想点击按钮并更改它上面的文字。但是当我点击按钮时,几个按钮不仅会改变,而且还会改变。
这是ListViewAdapter.java
public class ListViewAdapter extends ArrayAdapter<Post> {
private List<Post> mPostList;
private Context mContext;
public ListViewAdapter(List<Post> postList, Context context){
super(context, R.layout.post, postList);
mPostList = postList;
mContext = context;
}
public View getView(final int position, View convertView, ViewGroup parent){
final ViewHolderItem viewHolder;
if(convertView==null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.post, parent, false);
viewHolder = new ViewHolderItem();
convertView.setTag(viewHolder);
viewHolder.mPlusImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.mPlusImageButton.setText("A");
}
});
}else{
viewHolder = (ViewHolderItem) convertView.getTag();
}
return convertView;
}
static class ViewHolderItem {
public Button mPlusImageButton;
public int position;
}
@Override
public int getCount(){
return mPostList.size();
}
}
答案 0 :(得分:1)
您可能会绕过一些步骤。
<强>第一强> 您的适配器正在使用实时对象,而不是使用实际的数据模型。我的意思是你实时创建列表项而不是从你存储的数据中加载它。
这意味着有几件事情,第一件事就是如果重新创建特定视图(对滚动视图时会发生什么),您对创建的对象所做的更改将不会持久存在。
<强>第二强> 您创建的实时对象是 final 变量,这意味着它是不可更改的。这意味着当您尝试设置文本变量时,它不应该在初始化之后更改。我很惊讶你在这次测试中看到了任何积极的结果。
我假设您已将其设为最终版,因此您可以将其传递到OnClick
方法中。有一个原因你无法传递非最终变量。如果您的适配器发生了变化,并保留了一个超出该变量范围的视图,那么您将会遇到令人讨厌且难以找到的错误。
修复 为了解决这个问题,你将不得不进行一些装修。第一种是创建数据源。
因此,您可能希望将适配器更改为ArrayAdapter
并使用字符串或类似的变量,然后使用这些字符串创建视图(如果您的OnCreateView
方法中的对象。您可以将最后一个整数传递到按钮的onClick
处理程序中,并使用该整数来访问适配器中的字符串以及当前按钮视图。
你可以做到!
答案 1 :(得分:1)
这里是你可以做什么在你的Post类中创建一个布尔变量,并在点击按钮时将其实例化为false使其成为true并且在getView方法内部使用此变量。你的getView方法如下所示。
public View getView(final int position, View convertView, ViewGroup parent){
final ViewHolderItem viewHolder;
if(convertView==null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.post, parent, false);
viewHolder = new ViewHolderItem();
viewHolder.mPlusImageButton = convertView.findViewById(R.id.someid);
viewHolder.mPlusImageButton = convertView.findViewById(R.id.someid);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolderItem) convertView.getTag();
}
Post post = mPostList.get(position);
viewHolder.mPlusImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.mPlusImageButton.setText("A");
post.isClicked = true;
}
});
if(post.isClicked)
viewHolder.mPlusImageButton.setText("A");
else
viewHolder.mPlusImageButton.setText("B");
return convertView;
}