【问题标题】:How to implement a two dimensional ListView如何实现一个二维的ListView
【发布时间】:2017-08-29 13:57:01
【问题描述】:

我有一些数据要呈现给用户。
呈现这些数据的最合乎逻辑的方式是表格,我非常喜欢 Material Design 表格:

项目的数量可能会有所不同,所以我正在考虑像 ListFragment 一样实现它。我遇到的问题是列数也在变化。 我试图查找有关此的一些信息,但我真的找不到任何如何实现这一点。我应该在另一个里面创建另一个 ListFragment 吗?

我认为这会使事情变得比应有的复杂。

【问题讨论】:

  • 列数是固定的吗?
  • 我觉得 GridView 可能在某个地方可以看,它会让你选择列数:tutorialspoint.com/android/android_grid_view.htm
  • @PronoyMukherjee “我遇到的问题是列数也在变化”不
  • 使用 GridView 的问题是数据没有真正排序。您设置了它应该适合的列数。感觉有点“hacky”。​​

标签: android android-listfragment


【解决方案1】:

我从头开始解决了这个问题。

创建了一个黑色 Fragment 并将 TableLayout 添加到我以编程方式添加 TableRows 和 TextViews 的 XML。

<TableLayout
    android:id="@+id/dataTableLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="64dp">
</TableLayout>

在 DataTable java 文件中,我使用 newInstance 方法创建了一个带有标题、标题和数据作为参数的新片段:

public static DataTable newInstance(ArrayList<String> headers, ArrayList<ArrayList<String>> data, String title) {
    DataTable fragment = new DataTable();
    fragment.setTableTitle(title);
    fragment.setHeaders(headers);
    fragment.setData(data);
    return fragment;
}

onCreateView 方法中,我创建了所有的TableRows 和TextView。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_data_table, container, false);

    TableLayout tableContainer = view.findViewById(R.id.dataTableLayout);

    LinearLayout ll = new LinearLayout(this.getContext());
    ll.setBackground(ContextCompat.getDrawable(this.getContext(),R.drawable.bottom_border));

    tableContainer.addView(ll);

    for (int headerCount = 0; headerCount < columns; headerCount++){
        TextView tvn = new TextView(this.getContext());
        tvn.setText(headers.get(headerCount));
        tvn.setLayoutParams(new TableLayout.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));

        tvn.setPadding(24,10,10,10);
        tvn.setMinWidth(200);
        tvn.setTextColor(ContextCompat.getColor(this.getContext(),R.color.table_header_font_color));
        tvn.setTextSize(getResources().getDimension(R.dimen.data_table_text_size_header));
        ll.addView(tvn);
    }

    for(int rowCount = 0 ; rowCount < rows-1 ; rowCount++){
        LinearLayout lld = new LinearLayout(this.getContext());

        tableContainer.addView(lld);
        for(int columnCount = 0; columnCount < columns; columnCount++){
            TextView tvd = new TextView(this.getContext());
            tvd.setText(data.get(rowCount).get(columnCount));
            tvd.setLayoutParams(new TableLayout.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
            tvd.setPadding(24,10,10,10);
            tvd.setTextColor(ContextCompat.getColor(this.getContext(),R.color.table_data_font_color));
            lld.addView(tvd);
        }
        if(rowCount+2 < columns){
            lld.setBackground(ContextCompat.getDrawable(this.getContext(),R.drawable.bottom_border));
        }
    }
    if(tableTitle != null){
        TextView tableTitleVw = (TextView)view.findViewById(R.id.table_header);
        tableTitleVw.setText(tableTitle);
    }

    return view;
}

我想对标题和数据做不同的事情,这就是我添加两个 for 循环的原因,如果你只想添加数据,一个循环就足够了。

如果需要对表格进行排序,可以使用我找到的一个库:https://github.com/ISchwarz23/SortableTableView

我不想依赖另一个库,也不需要所有这些额外的功能,这就是我自己实现它的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多