如何从linearlayout中的动态创建的EditText和TextView获取数据?

时间:2016-06-25 18:27:47

标签: java android android-layout android-edittext textview

在我的main.xml中,我有一个LinearLayout:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/linearMain"
        >
</LinearLayout>

然后,在我的Main.java中,我正在从DB(项目的名称和价格)中检索值。然后,我使用以下代码动态创建了我的表单:

 Cursor cursor = mydb.getAllJuice();

 lm = (LinearLayout) findViewById(R.id.linearMain);

 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);

while (cursor.moveToNext()) {
            int cid = cursor.getInt(0);
            String id = Integer.toString(cid);
            String name = cursor.getString(1);
            String price = cursor.getString(2);

            // Create LinearLayout
            LinearLayout ll = new LinearLayout(this);
            ll.setOrientation(LinearLayout.HORIZONTAL);

            // Create TextView
            TextView product = new TextView(this);
            product.setText(name+"    ");
            ll.addView(product);

            // Create TextView
            TextView pricetxt = new TextView(this);
            pricetxt.setText("      "+price);
            ll.addView(pricetxt);

            // Create TextView
            TextView currency = new TextView(this);
            currency.setText("  LL      ");
            ll.addView(currency);

            // Create TextView
            TextView qtylabel = new TextView(this);
            qtylabel.setText("QTY      ");
            ll.addView(qtylabel);

            EditText qty = new EditText(this);
            qty.setMinLines(1);
            qty.setMaxLines(3);
            ll.addView(qty);
            lm.addView(ll);

        }

        // Create LinearLayout
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.HORIZONTAL);



        final Button btn = new Button(this);
        // Give button an ID
        int j = 122;
        btn.setId(j+1);
        btn.setText("Add To Cart");
        // set the layoutParams on the button
        btn.setLayoutParams(params);
        //Add button to LinearLayout
        ll.addView(btn);
        //Add button to LinearLayout defined in XML
        lm.addView(ll);

用户将能够输入项目数量,因此单击按钮将操纵TextView。

要填写此textview,我需要循环创建所有项目以检查价格并检查用户输入的数字。我尝试使用下面的代码,但是我无法访问我想要的特定项目,因为我在每行中都有2个TextView和1个editText:

 btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // code will be here
                btn.setOnClickListener(new View.OnClickListener() {

                    public void onClick(View v) {
                        total = 0 ;

                        View v1 = null;
                        for(int i=0; i<lm.getChildCount(); i++) {
                            v1 = lm.getChildAt(i);


                        }


                    }
                });

如何访问v1中的其他元素?

2 个答案:

答案 0 :(得分:1)

您可以使用Views(TextView,EditText等)的tag参数:setTag(Object)。标签本质上是可以与视图相关联的额外信息。它们通常用作存储与视图本身中的视图相关的数据的便利,而不是将它们放在单独的结构中。查看Android documentation了解详情。

P.S。您可以将RecyclerView(或更旧的ListView)与ViewHolder一起使用,而不是使用您的方法。这已在评论中提到过。

答案 1 :(得分:1)

回答你的问题: 问题是你的“产品”,“pricetxt”,“btn”变量是局部变量,并在你当前的循环迭代结束后收集垃圾。

您可以在项目中实现视图持有者模式。

创建一个名为ViewHolder的类

  class ViewHolder{

  LinearLayout ll;
  TextView product;
  TextView pricetxt ;
  TextView currency ;
  TextView qtylabel ;
  EditText qty ;}
  public ViewHolder(LinearLayout ll TextView product TextView pricetxt TextView currency TextView qtylabel EditText qty)
  {
    this.l1= l1;
    this.product=product;
    this.pricetxt=pricetxt;
    this.currency = currency;
    this.qtylabel = qtylevel;
    this.qty = qty;

  }

此类可以通过传递所有这些参数(qty,pricetxt等)来保存所有数据。 现在,您必须在顶部维护此ViewHolder对象的List。你可以这样做 -

  List myList<ViewHolder> = new ArrayList<ViewHolder>();

在每次迭代结束时,创建并添加ViewHolder对象; 您可以按照以下方式执行此操作

  ViewHolder currentView = new ViewHolder(l1.product,pricetxt,currency,qtylabel,qty);

myList.add(currentView);         myList.add(currentView);

您可以在“index”位置访问列表中维护的任何ViewHolder对象

    myList.get(index);

或者EditText“qty”为

     myList.get(index).qty;

通过这种方式,即使在循环迭代结束后,您也可以访问创建的EditTexts和TextView。

我的建议: - 没有人这样做。正如在这里建议一些人你应该安装推荐的RecyclerView,这比当前的实现更有效。如果你甚至可以ListView