2

我知道这之前已经讨论过,我搜索了很多结果,但没有一个能解决我的问题。

我得到: android.widget.AdapterView.getPositionForView(AdapterView.java:581) 处的 NullPointerException

我有一个带复选框的 ListView。我想要的行为是,在检查一个项目后,它被移动到列表的底部,列表首先显示未选中的项目,然后显示选中的项目。

以下是 Adapter 实现 getView 的相关部分:

    final ViewHolder holder;
    if (convertView == null) {
        layoutProductItem = new LinearLayout(ctx);
        mInflater.inflate(R.layout.product_in_list, layoutProductItem, true);
        holder = new ViewHolder();
        holder.chk = (CheckBox) layoutProductItem.findViewById(R.id.chk_in_cart);
        layoutProductItem.setTag(holder);
    } else {
        layoutProductItem = (LinearLayout) convertView;
        holder = (ViewHolder) convertView.getTag();
    }
    TextView viewProdName = (TextView) layoutProductItem.findViewById(R.id.txt_prod_name);
    TextView viewRequiredQttyName = (TextView) layoutProductItem.findViewById(R.id.txt_required_qtty);
    EditText fldQtty = (EditText) layoutProductItem.findViewById(R.id.fld_qtty);
    EditText fldPrice = (EditText) layoutProductItem.findViewById(R.id.fld_price);
    holder.chk.setOnCheckedChangeListener(checkedChangeListener);
    viewProdName.setText(prod.getProduct().getName());
    fldQtty.setText("" + prod.getBoughtQuantity());
    fldPrice.setText("" + prod.getPricePerSingleItem());
    viewRequiredQttyName.setText("" + prod.getRequiredQuantity());
    Runnable runnable = new Runnable() {
        public void run() {
            holder.chk.setChecked(prod.isInCart());
        }
    };
    layoutProductItem.post(runnable);

没有线 holder.chk.setChecked(prod.isInCart()); 也不例外,但是当用户选中其中一个复选框时,所有复选框都会被标记。

我假设的问题是根据检查状态对列表进行重新排序。没有它,就没有问题。

我考虑放弃复选框,并使用上下文菜单操作,但我认为重新排序会再次导致这种情况。如果我想使用 ExpandableListView 也是这种情况。一旦发生重新排序,getPositionForView 方法将不会在前一个位置找到对象(我的假设,不是知识)。

谢谢

4

0 回答 0