我有一个ListView,我使用SimpleCursorAdapter
从数据库发送数据,但我需要动态行布局,因为每个表可以有不同的列数。
假设我根据列数创建TextViews
:
public int getColumnNumbers() {
int i = 0;
cursor = db.rawQuery("PRAGMA table_info("+DATABASE_TABLE_NAME+")", null);
if (cursor.moveToFirst()) {
do {
i++;
} while (cursor.moveToNext());
}
cursor.close();
return i;
}
........
int rowsNumber = getColumnNumbers();
textViews = new TextView[rowsNumber];
for(i = 0; i < rowsNumber; i++) {
textViews[i] = new TextView(this);
textViews[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
我基本上寻找的是将这些TextViews
传递给CursorAdapter
(或其他适配器)参数的方法int[] to
我对此很新,所以我很感激任何帮助或建议。
修改
我正在添加bindView
方法的实现,我在此处提供的链接的帮助下,以防将来有人不得不面对类似的问题。
@Override
public void bindView(View view, Context context, Cursor cursor) {
int i, count = myHelper.getColumnNumbers();
String[] columnNames = myHelper.getColumnNamesString();
String text;
LinearLayout layout = (LinearLayout) view.findViewById(R.id.linear_layout_horizontal);
for(i = 0; i < (count-1); i++) {
TextView textView = new TextView(context);
textView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));
text = cursor.getString(cursor.getColumnIndexOrThrow(columnNames[i+1]));
textView.setText(text);
layout.addView((TextView)textView);
}
}
编辑2:
昨天我发现上面提到的实现工作直到你需要滚动。滚动后,ListView变形。 所以再次,如果有人想做类似的事情,我正在添加我的整个Adapter类。
public class DatabaseCursorAdapter extends CursorAdapter {
private DatabaseHelper myHelper;
private int count;
private String[] columnNames;
public DatabaseCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
myHelper = new DatabaseHelper(context);
count = myHelper.getColumnNumbers();
columnNames = myHelper.getColumnNamesString();
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = LayoutInflater.from(context).inflate(R.layout.text_select, parent, false);
LinearLayout layout = (LinearLayout) view.findViewById(R.id.linear_layout_horizontal);
int i;
for(i = 0; i < count; i++) {
TextView textView = new TextView(context);
textView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1f));
textView.setTag(Integer.valueOf(i));
layout.addView(textView);
}
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
int i;
String text;
for(i = 0; i < count; i++) {
TextView textView = (TextView) view.findViewWithTag(Integer.valueOf(i));
text = cursor.getString(cursor.getColumnIndexOrThrow(columnNames[i]));
textView.setText(text);
}
}
}
在和大多数问题一样,解决方案非常简单。技术几乎与使用静态布局相同,除了使用findViewById
之外,您只需标记布局的元素并使用findViewWithTag
方法。
答案 0 :(得分:1)
您需要查看好的教程,链接是 Populating a ListView with a CursorAdapter。该网页有一些很好的解释。
查看TodoCursorAdapter
和bindView
方法,以检查数据库中可用的列/数据。教程中的代码片段:
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Find fields to populate in inflated template
TextView tvBody = (TextView) view.findViewById(R.id.tvBody);
// Extract properties from cursor
String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
// Populate fields with extracted properties
tvBody.setText(body);
}
我认为这是一个简单的代码设计。 网页中的代码将数据填充到Listview:
// Find ListView to populate
ListView lvItems = (ListView) findViewById(R.id.lvItems);
// Setup cursor adapter using cursor from last step
TodoCursorAdapter todoAdapter = new TodoCursorAdapter(this, todoCursor);
// Attach cursor adapter to the ListView
lvItems.setAdapter(todoAdapter);
您可以实现 ArrayAdapter 而不是CursorAdapter。如果您的应用程序没有连续与数据库连接,这是有道理的。链接是Using an ArrayAdapter with ListView。这是同一个网站。
在这种情况下,请查看getView
方法而不是类似的bindView。