1

22 個のアイテムを持つデータベースから取り込まれた listView があります。データベースの項目を listView にバインドすると、すべての項目がリストに表示されます。

しかし、ここに問題があります.. listView から上位 7 項目のみを選択できます。ビューで 8 番目から 22 番目のアイテムを選択しようとすると、nullpointerException が発生します。

この問題を解決する理由と方法を知っている人はいますか?

リスト内の項目を選択するときの私のコード:

        listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
              //ListView lv = (ListView) arg0;
              TextView tv = (TextView) ((ListView) findViewById(R.id.list_view)).getChildAt(arg2);
              //error here \/
              if (tv == null) {
                  Log.v("TextView", "Null");
              }

              String s = tv.getText().toString();
              _listViewPostion = arg2;

              Toast.makeText(CustomerPick.this, "Du valde: " + s, arg2).show();
        }
    });

値を listView にバインドするときのコード:

    public ArrayAdapter<Customer> BindValues(Context context){
    ArrayAdapter<Customer> adapter = null;
    openDataBase(true);

    try{ 

        List<Customer> list = new ArrayList<Customer>(); 
        Cursor cursor = getCustomers();

        if (cursor.moveToFirst()) 
        {
            do 
            {  
                list.add(new Customer(cursor.getInt(0), cursor.getString(1)));   
            } 
            while (cursor.moveToNext());  
        } 
        _db.close();  
        Customer[] customers = (Customer []) list.toArray(new Customer[list.size()]);  
        Log.v("PO's",String.valueOf(customers.length));  


        adapter = new ArrayAdapter<Customer>(context, android.R.layout.simple_list_item_single_choice, customers);

        }  
        catch(Exception e)  
        {  
            Log.v("Error", e.toString());
        }  
        finally{
            close();
        }
    return adapter;
}
4

2 に答える 2

2

リストビュー要素から直接データを取得しようとしていますが、これは決して良い考えではありません。画面には実際には7つのアイテムしかないため、nullが発生しています。スクロールすると、7 つの項目がデータが変更されて再配置されるため、スクロールしているように見え、リソースを意識した状態に保たれます。リストビューは、表示のみを目的として表示する必要があります。データが必要な場合は、位置、ID、またはその他の方法でデータ ソースを参照します。この場合は配列リストです。

于 2012-11-12T09:32:05.387 に答える
1

参照: http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

変更されたコード:

    listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {

            //arg1 -> The view within the AdapterView that was clicked (this will be a view provided by the adapter)
            //arg0 -> The AdapterView where the click happened.
            //arg2 -> The position of the view in the adapter.
            //arg3 -> The row id of the item that was clicked. 

          TextView tv = (TextView) arg1.findViewById(R.id.list_view);

          if (tv == null) {
              Log.v("TextView", "Null");
          }

          String s = tv.getText().toString();
          _listViewPostion = arg2;

          Toast.makeText(CustomerPick.this, "Du valde: " + s, arg2).show();
    }
});
于 2012-11-12T09:36:22.633 に答える