1

In meinem main.xml habe ich ein Linearlayout:Wie man Daten von dynamisch erzeugtem EditText und TextView innerhalb eines linearen Layouts erhält?

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

Dann in meinem Main.java ich Werte aus der DB bin Abrufen (Name und Preis eines Artikels). Dann habe ich erstellt dynamisch meine Form den folgenden Code verwendet:

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); 

Der Benutzer wird die Anzahl der Elemente eingeben können, und folglich onClick der Taste ein Textview manipuliert werden.

Um diese Textansicht zu füllen, muss ich alle Elemente, die erstellt wurden, um den Preis zu überprüfen, überprüfen und überprüfen, wie die Zahl, die der Benutzer eingegeben hat. Ich habe versucht, den Code unten verwenden, aber ich bin nicht in der Lage, die spezifischen Artikel zuzugreifen, die ich will, wie ich in jeder Zeile 2 Textview und 1 editText haben:

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); 


         } 


        } 
       }); 

Wie kann ich das andere Element in der v1 zugreifen?

+0

Sieht so aus, als könnten Sie das ViewHolder-Muster verwenden –

+1

Sind Sie sicher, dass Sie RecyclerView nicht für Ihren Anwendungsfall verwenden können? – Sharj

Antwort

1

Sie können Tag-Parameter Ihrer Ansichten verwenden (TextView, EditText usw.): setTag (Object). Tags sind im Wesentlichen eine zusätzliche Information, die einer Ansicht zugeordnet werden kann. Sie werden am häufigsten als Zweck verwendet, um Daten in Bezug auf Ansichten in den Ansichten selbst zu speichern, anstatt sie in einer separaten Struktur zu speichern. Überprüfen Sie Android documentation für weitere Details.

P.S. Anstatt Ihren Ansatz zu verwenden, können Sie RecyclerView (oder älteres ListView) mit ViewHolder verwenden. Dies wurde bereits in Kommentaren erwähnt.

1

Beantworten Sie Ihre Frage: Das Problem ist, dass Ihre "Produkt", "Pricetxt", "Btn" Variablen lokale Variablen sind und Garbage gesammelt, nachdem Ihre aktuelle Schleife Iteration vorbei ist.

Nun, Sie können Ansichtshalter-Muster in Ihrem Projekt implementieren.

Erstellen Sie eine Klasse ViewHolder namens

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; 

    } 

Diese Klasse kann, indem man alle diese Parameter (Menge, pricetxt, usw.) alle Ihre Daten halten. Jetzt müssen Sie eine Liste für dieses ViewHolder-Objekt oben verwalten. Sie können dies wie folgt tun:

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

Am Ende jeder Iteration, erstellen und fügen Sie das ViewHolder-Objekt hinzu; Sie können dies wie folgt

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

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

Sie können auf jede ViewHolder Objekt in der Liste an Position "index" gehalten, wie

myList.get(index); 

Oder EditText "Menge", wie

 myList.get(index).qty; 

Auf diese Weise können Sie Ihre erstellten EditTexts zugreifen können und TextView, selbst nachdem die Schleifeniteration vorüber ist.

Mein Vorschlag: - Niemand macht es auf diese Weise.Wie vorgeschlagen, einige Jungs hier sollten Sie Android implementieren empfohlen RecyclerView, die viel effizienter als die aktuelle Implementierung ist. In Fällen können Sie sogar ListView.

Verwandte Themen