【问题标题】:How to add a row dynamically in a tableLayout in Android如何在Android的tableLayout中动态添加一行
【发布时间】:2014-07-27 12:20:10
【问题描述】:

我有一个从网页获取产品列表的函数,我想在 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 循环中添加一些额外的代码,为每个元素添加一个新行和一个新文本视图,并使用具有产品描述的字符串设置文本视图的内容。 我该怎么做?

【问题讨论】:

    标签: android dynamic row add tablelayout


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      首先,充气机:

       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!

      【讨论】:

      • 这给我带来了问题,因为我的函数是可运行的,在以下行中:LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);你猜为什么?非常感谢;)
      • 对于 LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE),请使用 yourActivityName.this 而不是仅使用“this”。
      • Pankaj 是否帮助您解决了上一个问题?如果没有,我认为还有其他解决方案。
      • @Julia 你能看看我的答案吗?
      • 嗨 Aniruddha,我正在尝试,但它不起作用。错误在这里:tr_head.addView(textArray[i]);
      【解决方案3】:

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

      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 部分

      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

      【讨论】:

      • @JuanPedroMartinez 请用英文评论,让大家看懂。
      • 他试图说你做得很好。但是,它给了我一个错误,我不知道如何解决它。 :)
      • tr_head.addView(textArray[i]); tr_head 没有方法 addView
      • 哎呀,请改成tr_head[i].addView(textArray[i]);
      • 现在解决了,但是当我运行应用程序时,它崩溃了。日志猫说 nullPointerException
      【解决方案4】:

      我是 Android 新手,在使用 Python/Gtk 多年之后,如果我无法从模型/视图/演示者的角度思考,我会迷失方向。

      我设法应用了一个有用的方法,它让我回到了那个光学,即使它不是相对于一个表,我很确定它可以扩展到那个(我猜 this page 会很好开始,对我来说也是)。

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

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

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

      stringList = new ArrayList<>();
      

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

      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>
      

      在其余的代码中,我只与listAdapter“交谈”,我只需要它的两个addclear 方法来添加元素或清除列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        相关资源
        最近更新 更多