在android中的表视图中显示数据

时间:2011-02-11 11:00:06

标签: android

我想从我的android database中获取table view的数据。

我应该使用循环吗?这对静态有好处吗?

6 个答案:

答案 0 :(得分:10)

这可能对你有用..

try{
    JSONArray jArray = new JSONArray(result);

    TableLayout tv=(TableLayout) findViewById(R.id.table);
    tv.removeAllViewsInLayout();
    int flag=1;

    // when i=-1, loop will display heading of each column
    // then usually data will be display from i=0 to jArray.length()
    for(int i=-1;i<jArray.length();i++){

        TableRow tr=new TableRow(Yourclassname.this);

        tr.setLayoutParams(new LayoutParams(
        LayoutParams.MATCH_PARENT,
        LayoutParams.WRAP_CONTENT));

        // this will be executed once
        if(flag==1){

            TextView b3=new TextView(Yourclassname.this);
            b3.setText("column heading 1");
            b3.setTextColor(Color.BLUE);
            b3.setTextSize(15);
            tr.addView(b3);

            TextView b4=new TextView(Yourclassname.this);
            b4.setPadding(10, 0, 0, 0);
            b4.setTextSize(15);
            b4.setText("column heading 2");
            b4.setTextColor(Color.BLUE);
            tr.addView(b4);

            TextView b5=new TextView(Yourclassname.this);
            b5.setPadding(10, 0, 0, 0);
            b5.setText("column heading 3");
            b5.setTextColor(Color.BLUE);
            b5.setTextSize(15);
            tr.addView(b5);
            tv.addView(tr);

            final View vline = new View(Yourclassname.this);
            vline.setLayoutParams(new       
            TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, 2));
            vline.setBackgroundColor(Color.BLUE);
            tv.addView(vline); // add line below heading
            flag=0;
        } else {
            JSONObject json_data = jArray.getJSONObject(i);

            TextView b=new TextView(Yourclassname.this);
            String str=String.valueOf(json_data.getInt("column1"));
            b.setText(str);
            b.setTextColor(Color.RED);
            b.setTextSize(15);
            tr.addView(b);

            TextView b1=new TextView(Yourclassname.this);
            b1.setPadding(10, 0, 0, 0);
            b1.setTextSize(15);
            String str1=json_data.getString("column2");
            b1.setText(str1);
            b1.setTextColor(Color.WHITE);
            tr.addView(b1);

            TextView b2=new TextView(Yourclassname.this);
            b2.setPadding(10, 0, 0, 0);
            String str2=String.valueOf(json_data.getInt("column3"));
            b2.setText(str2);
            b2.setTextColor(Color.RED);
            b2.setTextSize(15);
            tr.addView(b2);
            tv.addView(tr);
            final View vline1 = new View(Yourclassname.this);
            vline1.setLayoutParams(new                
            TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, 1));
            vline1.setBackgroundColor(Color.WHITE);
            tv.addView(vline1);  // add line below each row   
        }
    }
}catch(JSONException e){
    Log.e("log_tag", "Error parsing data " + e.toString());
    Toast.makeText(getApplicationContext(), "JsonArray fail", Toast.LENGTH_SHORT).show();
}

答案 1 :(得分:4)

这取决于。如果你确定你只有几行,那么你可以膨胀将它们循环添加到TableLayout。但请注意,您为每一行创建视图。

大量数据创建ListView和适配器,例如基于CursorAdapter:

public class MyCursorAdapter extends CursorAdapter {
private static final String TAG                = "MyCursorAdapter";
private final int           NAME_COLUMN;
private final int           ADDRESS_COLUMN;
private final int           STATE_COLUMN;

public MyCursorAdapter(Context context, Cursor c) {
    super(context, c);
    NAME_COLUMN        = c.getColumnIndexOrThrow("name");
    ADDRESS_COLUMN     = c.getColumnIndexOrThrow("address");
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    LayoutInflater      inflater = LayoutInflater.from(context);
    View                view     = inflater.inflate(R.layout.custom_row, null);

    MyRowViewHolder rowData  = new MyRowViewHolder();

    rowData.name                 = (TextView) view.findViewById(R.id.name);
    rowData.address              = (TextView) view.findViewById(R.id.address);

    rowData.name.setText(cursor.getString(NAME_COLUMN));
    rowData.address.setText(cursor.getString(ADDRESS_COLUMN));

    view.setTag(rowData);

    return view;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    MyRowViewHolder rowData = (MyRowViewHolder) view.getTag();
    rowData.name.setText(cursor.getString(NAME_COLUMN));
    rowData.address.setText(cursor.getString(ADDRESS_COLUMN));
}

public static class MyRowViewHolder {
    TextView  name;
    TextView  address;
}
}

此方法不会为每一行创建视图。我认为这更好但需要更多的努力。要获取表格布局样式,请将LinearLayout用于包含layout_weight列的行

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
    android:id="@+id/name"
    android:layout_weight="0.25"
    android:layout_width="0"
    android:layout_height="wrap_content">
</TextView>
<TextView
    android:id="@+id/address"
    android:layout_weight="0.75"
    android:layout_width="0"
    android:layout_height="wrap_content">
</TextView>
</LinearLayout>

如果需要,可以向ListView添加页眉和页脚。

答案 2 :(得分:4)

我看到这篇文章很老了,但是如果其他人也面临在Android中的表格中显示自定义数据的问题,我想提供我的TableView尽可能的解决方案。
因此,您不必关心如何将数据填充到表中,您只需为要显示的数据创建自定义适配器(就像我们在Android中已经从ListView等视图中了解到的那样)。

我们的代码如下所示:

List<Flight> myData = new ArrayList<>();
myData.add(new Flight(...));
myData.add(new Flight(...));
myData.add(new Flight(...));

TableView<Flight> table = findViewById(R.id.table);
table.setHeaderAdapter(new SimpleHeaderAdapter("Time", "Airline", "Flight", "Destination"));
table.setDataAdapter(new FlightDataAdapter(myData));

结果可能如下所示:

Example

答案 3 :(得分:3)

rs1 = stmt.executeQuery("SELECT * from message");               

            StringBuilder sb = new StringBuilder();
            while (rs1.next())
            {
                String script = rs1.getString(1);
                String call =  rs1.getString(2);
                String price =  rs1.getString(3);
                String stoploss =  rs1.getString(4);
                String target =  rs1.getString(5);
                String ltp =  rs1.getString(6);
                String exit =  rs1.getString(7);
                sb.append(script).append(";").append(call).append(";").append(price).append(";").append(stoploss).append(";").append(target).append(";").append(ltp).append(";").append(exit).append("_");
            }
            out.print(sb.toString());
            out.flush();

为此你有XML 为此你有一个类似

的XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:orientation="horizontal" android:layout_marginTop="20dip">  
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/tab"       
    >
      <TableRow>        
      </TableRow>    
    </TableLayout>
</LinearLayout> 

显示您编写的Android中的数据。

        String st = new String(str);    
        Log.e("Main",st);
        String[] rows  = st.split("_");
        TableLayout tableLayout = (TableLayout)findViewById(R.id.tab);
        tableLayout.removeAllViews();


        for(int i=0;i<rows.length;i++){
            String row  = rows[i];
            TableRow tableRow = new TableRow(getApplicationContext());
            final String[] cols = row.split(";");

            Handler handler = null;

            for (int j = 0; j < cols.length; j++) {

                final String col = cols[j];                                 
                final TextView columsView = new TextView(getApplicationContext());
                columsView.setText(String.format("%7s", col));                              
                tableRow.addView(columsView);

答案 4 :(得分:0)

当您要在表中填充要定义的永不更改的行/列数时,可以使用静态。否则,我建议使用循环并在循环中的每个步骤的表视图中添加一行。

答案 5 :(得分:0)

我们可以想象一下Android的自定义组件:TableView。

它的代码类似于:

public class TableView extends TableLayout {

    public TableView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TableView(Context context) {
        super(context);
    }

    public void setAdapter(TableAdapter<?> adapter) {
        removeAllViews();

        for (int row = 0; row < adapter.getRowCount(); row++) {
            TableRow tableRow = new TableRow(getContext());
            TableLayout.LayoutParams params = new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
            tableRow.setLayoutParams(params);
            addView(tableRow);
            for (int column = 0; column < adapter.getColumnCount(); column++) {
                View cell = adapter.getView(row, column);
                tableRow.addView(cell);
                TableRow.LayoutParams cellParams = (android.widget.TableRow.LayoutParams) cell.getLayoutParams();
                cellParams.weight = adapter.getColumnWeight(column);
                                    cellParams.width = 0;
            }
        }
    }
}

它会使用这样的适配器:

public interface TableAdapter<T> {
    int getRowCount();

    int getColumnWeight(int column);

    int getColumnCount();

    T getItem(int row, int column);

    View getView(int row, int column);
}