1

Android アプリに問題があります。行ごとにテキストビューとチェック済みテキストビューを含むリストビューを作成しようとしています。レイアウトとアダプターを作成し、すべてのアイテムを正しく表示しますが、問題は次のとおりです。最初の 7 つのアイテム (最初に表示されているアイテム) を完全にチェックできますが、下にスクロールしていずれかをチェックすると、次の項目 (最初は表示されない項目) でヌル ポインター例外が発生します。私は何をすべきか?

アダプターコード:

private class myAdapter extends ArrayAdapter<Orders> {

private ArrayList<Orders> items;

public myAdapter(Context context, int resource, ArrayList<Orders> items) {
    super(context, resource, items);
    this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = getLayoutInflater().inflate(R.layout.orderslist_row,
                null);
    }

    Orders o = items.get(position);

    CheckedTextView txtSymbol = (CheckedTextView) convertView
            .findViewById(R.id.checkedTextView1);
    txtSymbol.setText(o.getInstrumentID());

    CheckedTextView txtQuantity = (CheckedTextView) convertView
            .findViewById(R.id.checkedTextView2);
    Double qty = o.getQuantity();
    txtQuantity.setText(FormatNumber.Number(qty, 0));

    if (o.getStatus().toString().equals("Rejected"))
        txtQuantity.setTextColor(Color.RED);
    if (o.getStatus().toString().equals("Active"))
        txtQuantity.setTextColor(Color.GREEN);

    return convertView;
}

}

および OnItemClickCode:

public void onItemClick(AdapterView<?> adapter, View view, int position,
    long id) {
View v = (View)lstOrders.getChildAt(position);
CheckedTextView ctv = (CheckedTextView) v.findViewById(R.id.checkedTextView2);
ctv.toggle();

}

4

1 に答える 1

1

getChildAt(i)表示されているインデックスのセットから機能します。スクロールして位置 3 が最初に表示される行になると、それがメソッドの位置 0 になります。したがって、任意の時点で、画面に収まるリストビュー行の数が最大である場合、インデックスは約 7 までしか許可されません。この方法を続けている場合は、スケールを好きなように傾ける方法があります。最初に表示されている行インデックスが何であるかを調べてから、合計から差し引きます。リストビューにはそのようなメソッドがあります。

    public void onItemClick(AdapterView<?> adapter, View view, int position,
            long id) {
        View v = (View)lstOrders.getChildAt(position - lstOrders.getFirstVisiblePosition());
        CheckedTextView ctv = (CheckedTextView) v.findViewById(R.id.checkedTextView2);
        ctv.toggle();
}
于 2012-12-11T12:56:17.957 に答える