ListView的动态行布局

时间:2015-02-20 19:19:22

标签: android android-layout listview textview

我有一个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方法。

1 个答案:

答案 0 :(得分:1)

您需要查看好的教程,链接是 Populating a ListView with a CursorAdapter。该网页有一些很好的解释。

查看TodoCursorAdapterbindView方法,以检查数据库中可用的列/数据。教程中的代码片段:

@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。