これは以前に議論されたことを知っており、多くの結果を検索しましたが、どれも私の問題を解決しませんでした.
私が得る: 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 メソッドは前の位置にあるオブジェクトを見つけられません (知識ではなく私の仮定)。
ありがとう