如何在Android中的tableLayout中动态添加行

时间:2014-06-06 09:17:48

标签: android dynamic row add tablelayout

我有一个从网页上获取产品列表的函数,我想在tableLayout中为列表的每个元素添加一行。

public void getProductsOfCategory() throws IOException{
        new Thread(){
            public void run(){
                //background code...
                try {
                    Bundle extras = getIntent().getExtras();
                    String categoryName = extras.getString("categoryName");

                    HttpGet httpget = new HttpGet("http://romal.hopto.org/foodadvisor/users/getProductsOfCategory.json?category="+categoryName);
                    HttpResponse httpresp = httpClient.execute(httpget);
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    httpresp.getEntity().writeTo(baos);
                    final String content = new String(baos.toByteArray());
                    CategoryActivity.this.runOnUiThread(new Runnable(){
                        public void run(){
                            //foreground code (UI)
                            //update user interface, for example, showing messages
                            try {
                                JSONObject jObject = new JSONObject(content);
                                JSONArray productsList = jObject.getJSONArray("response");
                                for(int i=0; i<productsList.length();i++){
                                    JSONObject product = productsList.getJSONObject(i);
                                    JSONObject productData = product.getJSONObject("Product");
                                    String productDescription = productData.getString("description");
                                }
                            } catch (JSONException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }   
                        }
                    });
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }.start();
    }

在我的布局xml文件中,我已经像这样定义了表格布局:

<TableLayout
            android:id="@+id/tableOfProducts"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <TextView
                android:id="@+id/productDescription"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView"
                android:paddingBottom="7dp"
                android:paddingLeft="14dp"
                android:paddingRight="14dp"
                android:paddingTop="7dp"
                android:textSize="20dp" />

        </TableLayout>

我想我必须在for循环中添加一些额外的代码,为每个元素添加一个新行和一个新的textview,并使用包含产品描述的字符串设置文本视图的内容。 我怎么能这样做?

4 个答案:

答案 0 :(得分:10)

检查一下,这是动态创建表行的一般方法。相应地修改

XML文件

<TableLayout 
xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/main_table"
android:layout_height="wrap_content" 
android:layout_width="match_parent">
</TableLayout> 

JAVA PART

TableLayout t1;

TableLayout tl = (TableLayout) findViewById(R.id.main_table);

创建表格行标题以保存列标题

TableRow tr_head = new TableRow(this);
tr_head.setId(10);
tr_head.setBackgroundColor(Color.GRAY);        // part1
tr_head.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));

我正在向表格行添加两个数据部分

TextView label_hello = new TextView(this);
         label_hello.setId(20);
         label_hello.setText("HELLO");
         label_hello.setTextColor(Color.WHITE);          // part2
         label_hello.setPadding(5, 5, 5, 5);
         tr_head.addView(label_hello);// add the column to the table row here

         TextView label_android = new TextView(this);    // part3
         label_android.setId(21);// define id that must be unique
         label_android.setText("ANDROID..!!"); // set the text for the header  
         label_android.setTextColor(Color.WHITE); // set the color
         label_android.setPadding(5, 5, 5, 5); // set the padding (if required)
         tr_head.addView(label_android); // add the column to the table row here

将列添加到表格行后,添加表格行的时间是我们在开始时提取的主表格布局

tl.addView(tr_head, new TableLayout.LayoutParams(
                 LayoutParams.FILL_PARENT,                    //part4
                 LayoutParams.MATCH_CONTENT));      

编辑:您可以按照您的代码进行操作

 TextView[] textArray = new TextView[productsList.length()];
 TableRow[] tr_head = new TableRow[productsList.length()];

 for(int i=0; i<productsList.length();i++){
 JSONObject product = productsList.getJSONObject(i);
 JSONObject productData = product.getJSONObject("Product");
 String productDescription = productData.getString("description");

//Create the tablerows
tr_head[i] = new TableRow(this);
tr_head[i].setId(i+1);
tr_head[i].setBackgroundColor(Color.GRAY);
tr_head[i].setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));

 // Here create the TextView dynamically

 textArray[i] = new TextView(this);
         textArray[i].setId(i+111);
         textArray[i].setText(productDescription);
         textArray[i].setTextColor(Color.WHITE);
         textArray[i].setPadding(5, 5, 5, 5);
         tr_head[i].addView(textArray[i]);

//将每个表行添加到表格布局

tl.addView(tr_head[i], new TableLayout.LayoutParams(
                     LayoutParams.MATCH_PARENT,
                     LayoutParams.WRAP_CONTENT));

} // end of for loop

不需要创建TextView和TableRow数组。您可以在for循环中包含part1part2part3(如果您需要多于1个字段)和part4

答案 1 :(得分:1)

看,我认为你必须修改你的xml以向你的tableview添加行:

首先,inflater:

 LayoutInflater inflater = mContext.getLayoutInflater();

或以这种方式:

 LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);



 //Here you can set up the layoutparameters from your tableview and the rowview.
 //Maybe you don't have to modify nothing from the parameters of your tableview so
 //you can dismiss it.

 TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);
 TableRow.LayoutParams rowParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);

 //Here were we take the tablelayout from your xml
 TableLayout tableLayout = (TableLayout)inflater.inflate(R.layout.tableOfProducts, null);

 //Like a told you before, maybe you don't need set the parameters of the tablelayout
 //so you can comment next line.
 tableLayout.setLayoutParams(this.tableParams);

 TableRow tableRow = new TableRow(context);
 tableRow.setLayoutParams(this.tableParams);

 //Here you have to create and modify the new textview.
 TextView textView = new TextView(context);
 textView.setLayoutParams(this.rowParams);

 tableRow.addView(textView);

 tableLayout.addView(tableRow);

如果您需要更多帮助,请告诉我,如果有帮助,请给我评分! ;)Un saludo Gallega! O como se dice en gallego:una aperta!

答案 2 :(得分:0)

为此,您必须为行创建一个xml文件,然后您必须修改layout.xml文件,如

<ScrollView>
  <LinearLayout orientation=vertical id="+id/rowHolder">
  </LinearLayout
</scrollview>

然后在for循环中,膨胀行布局并将其运行时添加到rowHolder对象。

答案 3 :(得分:0)

我是Android的新手,经过Python / Gtk多年的努力,如果我无法用Model / View / Presenter来思考,我就会迷失方向。

我设法应用的一种有用的方法,它让我重新回到光学中,即使它与桌子不相关,我也很确定它可以扩展到那个(我猜{ {3}}对我来说也是一个好的开始)。

首先声明片段(或活动)中的两个对象:

List<String> stringList;  // think of it as the model.
ArrayAdapter<String> listAdapter;  // and this would be the presenter

在片段构造函数中定义模型:

stringList = new ArrayList<>();

接下来,当我的片段的onCreateView被调用时,我会这样做(如果您使用Activity而不是片段,则相应地进行编辑):

View rootView = inflater.inflate(R.layout.fragment_taxonomy, container, false);
ListView mainListView = rootView.findViewById(R.id.taxonomy_results);

// Create ArrayAdapter using the string list.  think of it as the presenter.
// see how it's being handled a model and a view.
listAdapter = new ArrayAdapter<>(
        rootView.getContext(), R.layout.textrow, stringList);

// Set the ArrayAdapter as the ListView's adapter.
mainListView.setAdapter( listAdapter );

textrow.xml是一个额外的布局,每次我向stringList模型添加元素时都会重复使用。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rowTextView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="16sp" >
</TextView>

在剩下的代码中,我只是&#34;说&#34;到listAdapter,我只需要两个addclear方法,添加元素或清除列表。