2017-08-29 74 views
0

我有一些数据要呈现给用户。
呈现这些数据的最合理的方式是一个表,我真的很喜欢这个材质设计表:如何实现二维ListView

Material Design Data Table

项目的数量可能会不同,我想就像一个ListFragment实现它。我遇到的问题是列数也不相同。 我试图查找关于此的一些信息,但我无法找到任何如何实现这一点。我应该在另一个里面创建另一个ListFragment吗?

我认为这会使它比应该更复杂。

+0

列数是否固定? –

+2

我觉得GridView可能在某处看起来,它会让你选择列数:https://www.tutorialspoint.com/android/android_grid_view.htm – jampez77

+0

@PronoyMukherjee“我遇到的问题是列的数量是也不同“noope – Ravenix

回答

3

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

创建了一个黑色的片段,并将TableLayout添加到我编程添加了TableRows和TextView的XML中。

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

在数据表的java文件I中使用的newInstance方法来创建与标题,标题和该数据作为paramters一个新的片段:我创建的所有TableRows

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方法和TextViews。

@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

我不想依赖于另一个库,我并不需要就是为什么我实现了所有这些额外的功能它自己。