【问题标题】:ListView using Custom Adapter not displaying anything使用自定义适配器的 ListView 不显示任何内容
【发布时间】:2013-03-16 06:00:20
【问题描述】:

我有 SQLite DB,我正在尝试在 listView 中显示查询的值。 我按照this 教程为listView 创建了一个自定义适配器。也使用this问题作为参考。


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

自定义 listView 行应该有 3 个项目 - 描述、日期和金额(在 this xml 中定义的视图)。这些值是从数据库中获取的。从 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
  }
}

我哪里错了。

谢谢。


编辑:更改了 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;
}

【问题讨论】:

  • 你检查过TransactionItem是否有数据吗?
  • 我在那里输入了一个日志,我可以看到它达到了 setDescription 并打印了描述的值,但没有达到 getDescription。这是我的 TransactionItem 代码:​​gist.github.com/bharatkrishna/5175105

标签: android listview adapter


【解决方案1】:

试试这个

您还没有将交易对象设置到列表中,所以您的列表是空的

添加这个

transactionList.add(transactionItem);

showList() 方法的 while 循环中

【讨论】:

    【解决方案2】:

    我认为你应该将 convertview 替换为 element ..like this

         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;
    

    【讨论】:

    • 是的,我同意。我正在摆弄更改代码。我现在完全摆脱了元素和其他条件,并且只使用了 contextView。这个错误正如 Pragnani 所提到的。谢谢你的帮助:)
    【解决方案3】:

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

    【讨论】:

    • 谢谢。我意识到了这一点并改变了它。这是一个错误,但真正的错误是@Pragnani 发现的。现在修好了。
    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多