感谢@Divyesh,我找到了解决问题的方法。
创建一个自定义的 ArrayAdapter 就可以了:
- 创建额外的布局视图以包含所需的小部件。在我的情况下,
data_view.xml 下创建了 3 个 TextView
- 创建了一个列表解析器以从数据库中找到的每一行中提取数据,并将其构造为
DataItem 到listFromDB。
- 然后定义自定义适配器,扩展
ArrayAdapter 并在 data_view.xml 膨胀后将值分配给 TextViews。
- 最后,
MainActivity 中使用了新的自定义适配器,并将列表中的项目分配给适当的 TextViews
以下是上述步骤的示例,稍后我将对其进行重构。
data_view.xml
<TextView
android:id="@+id/accountName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Account Name" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Description" />
<TextView
android:id="@+id/balance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Balance" />
列表解析器
public class ListParser {
public String accountName;
public String description;
public String balance;
public ListParser(String accountName, String description, String balance) {
this.accountName = accountName;
this.description = description;
this.balance = balance;
}
}
自定义适配器
public class AccountAdapter extends ArrayAdapter<ListParser> {
public AccountAdapter(Context context, ArrayList<ListParser> users) {
super(context, 0, users);
}
public static class ViewHolder {
TextView accountName;
TextView description;
TextView balance;
public ViewHolder(View convertView) {
accountName = (TextView) convertView.findViewById(R.id.accountName);
description = (TextView) convertView.findViewById(R.id.description);
balance = (TextView) convertView.findViewById(R.id.balance);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
ListParser user = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.account_view, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder)convertView.getTag();
}
// Lookup view for data population
TextView accountName = viewHolder.accountName;
TextView description = viewHolder.description;
TextView balance = viewHolder.balance;
// Populate the data into the template view using the data object
accountName.setText(user.accountName);
description.setText(user.description);
balance.setText(user.balance);
// Return the completed view to render on screen
return convertView;
}
}
MainActivity(单行)
ArrayList<ListParser> arrayOfListParsers = new ArrayList<ListParser>();
AccountAdapter adapter = new AccountAdapter(this, arrayOfListParsers);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
ListParser newUser = new ListParser(String.valueOf(listFromDB.get(0).getaccountName()), String.valueOf(listFromDB.get(0).getDescription()), String.valueOf(listFromDB.get(0).getBalance()));
adapter.add(newUser);
MainActivity 类需要做更多的工作,但这只是一次试运行。
附加信用:https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView