ListView使用自定义适配器不显示任何内容

问题描述:

我有SQLite数据库,我试图在列表视图中显示查询的值。 我跟着this教程为listView创建一个自定义适配器。也用this作为参考。ListView使用自定义适配器不显示任何内容


我无法看到显示在我的listView上的任何数据。

定制的ListView行应该有3项 - 描述,日期&金额(视图this XML定义)。这些值是从数据库中获取的。从数据库获取看起来很好。

我的自定义适配器代码:

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 
    } 
} 

我要去哪里错了。

谢谢。


编辑:改变摆脱其他情况下为TransactionListAdapter的getView()方法的代码。我正在更改代码&在这里粘贴了一个错误代码。这被@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; 
} 
+0

你检查,如果TransactionItem有数据? – KDeogharkar 2013-03-16 06:15:42

+0

我已经把一个登录在那里,我可以看到它达到setDescription&打印描述的价值,但不getDescription。这是我的TransactionItem代码:https://gist.github.com/bharatkrishna/5175105 – Bharat 2013-03-16 06:17:37

试试这个

您没有交易对象设定为名单,所以你的列表是空的

添加此

transactionList.add(transactionItem); 

showList()方法的while循环

+0

谢谢!这是一个愚蠢的错误。再次感谢您的帮助:) – Bharat 2013-03-16 13:57:59

您有convertView.findViewById()中的错误时convertView为null,这必将会失败。当第一次使用的适配器会发生这种情况并没有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; 
} 
+0

谢谢。我意识到这一点,现在就改变它。这是一个错误,但真正的错误是@Pragnani发现的错误。现在修复它。 – Bharat 2013-03-16 14:06:22

我觉得你应该更换convertview到元素..like这个

 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; 
+0

是的,我同意。我正在摆弄改变代码。我现在完全摆脱了元素,而其他条件和我只使用contextView。这个错误与Pragnani提到的一样。 谢谢你的帮助:) – Bharat 2013-03-16 14:00:20