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;
}
试试这个
您没有交易对象设定为名单,所以你的列表是空的
添加此
transactionList.add(transactionItem);
在showList()
方法的while循环
谢谢!这是一个愚蠢的错误。再次感谢您的帮助:) – 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;
}
谢谢。我意识到这一点,现在就改变它。这是一个错误,但真正的错误是@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;
是的,我同意。我正在摆弄改变代码。我现在完全摆脱了元素,而其他条件和我只使用contextView。这个错误与Pragnani提到的一样。 谢谢你的帮助:) – Bharat 2013-03-16 14:00:20
你检查,如果TransactionItem有数据? – KDeogharkar 2013-03-16 06:15:42
我已经把一个登录在那里,我可以看到它达到setDescription&打印描述的价值,但不getDescription。这是我的TransactionItem代码:https://gist.github.com/bharatkrishna/5175105 – Bharat 2013-03-16 06:17:37