【问题标题】:Updating data in the list within setOnCheckedChangeListener for BaseAdapter更新 BaseAdapter 的 setOnCheckedChangeListener 列表中的数据
【发布时间】:2014-02-13 13:38:02
【问题描述】:

我有以下代码:

    public class MyListAdapter extends BaseAdapter {

    private final List<MyClass> mItems = new ArrayList<MyClass>();
...

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    final MyClass myItem = mItems.get(position);
    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.my_item, null);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.cbView = (CheckBox) rowView.findViewById(R.id.cbCheckBox);
        viewHolder.cbView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                myItem.setState(isChecked);
            }
        });
        rowView.setTag(viewHolder);
    }

我对听众很不舒服。它指的是在 convertView 为 null 时创建的 myItem。如果我从列表中删除该项目(位置更改)怎么办?或者如果我在它前面添加一些项目?我的代码会因“空异常”而失败吗?还是执行不正确? 我应该如何构建它?

【问题讨论】:

  • 在哪一行出现空指针异常?
  • 我还没有得到任何东西。但我怀疑myItem.setState(isChecked); 行。

标签: android listview oncheckedchanged


【解决方案1】:

如果 convertView 为 null 则只需创建视图对象... 现在,如果从列表中间删除视图,则从底部抬起并替换已删除视图的空间。并且当视图被提升时,viewHolder 对象将创建新的并且视图保持更新后的 viewHolder 对象。

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    final MyClass myItem = mItems.get(position);
    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.my_item, null);
       }
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.cbView = (CheckBox) rowView.findViewById(R.id.cbCheckBox);
        viewHolder.cbView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                myItem.setState(isChecked);
            }
        });
        rowView.setTag(viewHolder);
    }

【讨论】:

  • final MyClass myItem = mItems.get(position); 怎么样?每次调用 getView 时都会创建它。但是onCheckedChanged内部只使用了FIRST。
  • 是的,每次调用getView都会创建。
  • 但是监听器是创建一次的。这意味着如果原始项目被删除,监听器就会崩溃。
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多