ListViewAdapter更改几个按钮

时间:2015-05-14 18:14:32

标签: android android-listview

我为列表视图创建了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();
}

}

2 个答案:

答案 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;
}