0

私は SQLite DB を持っており、クエリされた値を listView に表示しようとしています。このチュートリアルに従って、listView 用のカスタム アダプターを作成しました。こちらの質問も参考にさせていただきました。


listView にデータが表示されません。

カスタム listView 行には、説明、日付、金額 (このxml で定義されたビュー) の 3 つの項目が必要です。これらの値はデータベースから取得されます。db からのフェッチは正常に見えます。

私のカスタムアダプターコード:

public class TransactionListAdapter extends BaseAdapter {
    Context context;
    ArrayList<TransactionItem> transactionList; 
    // Code for TransactionItem class : https://gist.github.com/bharatkrishna/5175105

    public TransactionListAdapter(Context context, ArrayList<TransactionItem> list) {

        this.context = context;
        transactionList = list;
    }

    @Override
    public int getCount() {
        return transactionList.size();
    }

    @Override
    public Object getItem(int position) {
        return transactionList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.d("adpater", "I am in adapter"); // Doesn't seem to get to this point as I don't see the log message
        View element;
        TransactionItem transactionItem = transactionList.get(position);        
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            element = inflater.inflate(R.layout.row_entry, null);

         } else {
             element = convertView;
         }
        // Code of XML file with these widgets defined: https://gist.github.com/bharatkrishna/5175158
        TextView descTextView = (TextView) convertView.findViewById(R.id.descText_Report);
        descTextView.setText(transactionItem.getDescription());

        TextView dateTextView = (TextView) convertView.findViewById(R.id.dateText_Report);
        dateTextView.setText(transactionItem.getDate());

        TextView amountTextView = (TextView) convertView.findViewById(R.id.amountText_Report);
        amountTextView.setText(Float.toString(transactionItem.getAmount()));        

        return convertView;
    }

}

次のように、アクティビティでこのアダプターを使用しています。

public class ReportsActivity extends Activity {
ListView listView;  
private DatabaseHelper db;
private Cursor transactions;
...
...
private void showList() {
    ArrayList<TransactionItem> transactionList = new ArrayList<TransactionItem>();
    db = new DatabaseHelper(this);          
    transactions = db.getTransaction();

    // This successfully dumps the db contents to log output. Querying from DB seems to be working fine.    
    Log.d("db", DatabaseUtils.dumpCursorToString(transactions)); 

        if (transactions != null && transactions.getCount() != 0) {
            do {
                TransactionItem transactionItem = new TransactionItem();

                transactionItem.setDescription(transactions.getString(transactions.getColumnIndex("description")));

                transactionItem.setDate(transactions.getString(transactions.getColumnIndex("date")));

                transactionItem.setAmount(transactions.getFloat(transactions.getColumnIndex("amount")));
            } while (transactions.moveToNext());
    }           
        TransactionListAdapter transactionListAdapter = new TransactionListAdapter(ReportsActivity.this, transactionList);
        listView.setAdapter(transactionListAdapter); //listView is defined in onCreate() method
  }
}

どこが間違っていますか。

ありがとう。


EDIT : TransactionListAdapter の getView() メソッドのコードを変更し、else ケースを取り除きました。コードを変更していて、ここにバグのあるコードを貼り付けました。これは @James Baca によって発見されました。私は今持っています:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TransactionItem transactionListItems = transactionList.get(position);
    Log.d("adpater", "I am in adapter");
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.row_entry, null);

    }       

    TextView descTextView = (TextView) convertView.findViewById(R.id.descText_Report);
    descTextView.setText(transactionListItems.getDescription());

    TextView dateTextView = (TextView) convertView.findViewById(R.id.dateText_Report);
    dateTextView.setText(transactionListItems.getDate());

    TextView amountTextView = (TextView) convertView.findViewById(R.id.amountText_Report);
    amountTextView.setText(Float.toString(transactionListItems.getAmount()));       

    return convertView;
}
4

3 に答える 3

2

convertview を element に置き換える必要があると思います..このように

     TextView descTextView = (TextView) element.findViewById(R.id.descText_Report);
    descTextView.setText(transactionItem.getDescription());

    TextView dateTextView = (TextView) element.findViewById(R.id.dateText_Report);
    dateTextView.setText(transactionItem.getDate());

    TextView amountTextView = (TextView) element.findViewById(R.id.amountText_Report);
    amountTextView.setText(Float.toString(transactionItem.getAmount())); 

    return element;
于 2013-03-16T07:44:38.393 に答える
2

これを試して

トランザクション オブジェクトを listに設定していないため、リストは空です

これを追加

transactionList.add(transactionItem);

showList()メソッドのwhileループで

于 2013-03-16T06:44:20.453 に答える
1

convertView が null の場合、 convertView.findViewById() にバグがあり、失敗する可能性があります。これは、アダプターが最初に使用され、最初に convertView が渡されていないときに発生します。

私はお勧め:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d("adpater", "I am in adapter"); // Doesn't seem to get to this point as I don't see the log message

    TransactionItem transactionItem = transactionList.get(position);        
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.row_entry, null);

     } 
    // Code of XML file with these widgets defined: https://gist.github.com/bharatkrishna/5175158
    TextView descTextView = (TextView) convertView.findViewById(R.id.descText_Report);
    descTextView.setText(transactionItem.getDescription());

    TextView dateTextView = (TextView) convertView.findViewById(R.id.dateText_Report);
    dateTextView.setText(transactionItem.getDate());

    TextView amountTextView = (TextView) convertView.findViewById(R.id.amountText_Report);
    amountTextView.setText(Float.toString(transactionItem.getAmount()));        

    return convertView;
}
于 2013-03-16T06:31:34.890 に答える