1

In meiner Android-App habe ich eine Aktivität, um eine RecyclerView zu zeigen, in der jede Zeile von einem TextView und 2 Tasten zusammengesetzt ist. Genau wie die:Wie kann ich OnClickListener auf zwei Schaltflächen in RecyclerView einstellen?

ListAdapter Layout

Nun, nach vielen Erklärungen des Internet habe ich diesen Adapter gemacht:

public class ListAdapter extends 
RecyclerView.Adapter<ListAdapter.ViewHolder> { 

    private LayoutInflater layoutInflater; 
    protected Vector<List> lists; 

    public ListAdapter(Context context, Vector lists) { 
     layoutInflater = (LayoutInflater) 
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.lists = lists; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = layoutInflater.inflate(R.layout.listadapter, null); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     List list = lists.elementAt(position); 
     holder.name.setText(list.getName()); 
     //holder.delete.set HOW DO I GET BUTTON HERE? 
    } 

    @Override 
    public int getItemCount() { 
     return lists.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder 
implements View.OnClickListener { 
     public TextView name; 
     public Button edit; 
     public Button delete; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      name = (TextView) itemView.findViewById(R.id.listname); 
      edit = (Button) itemView.findViewById(R.id.edit); 
      delete = (Button) itemView.findViewById(R.id.delete); 

      edit.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      switch (view.getId()) { 
       case R.id.edit: 
        break; 
       case R.id.delete: 
        break; 
       default: 
        break; 
      } 
     } 
    } 
} 

Ich habe keine Beispiele für mit 2 Tasten zu finden (es gibt nur Beispiele für das Hinzufügen Bilder) in jeder Ansicht der Recyclerview, wie im ersten Bild. Ich meine, schätze ich habe 10 List-Elemente in meinem RecyclerView, wie kann ich in jedem von ihnen auf einer Seite eine TextView mit dem Namen der List und 2 Buttons haben und clickListener behandeln ?. Wie im folgenden Bild, das ich von Hand gemacht haben, damit Sie sehen, was ich rede:

enter image description here

Dies ist die Aktivität, die die recyclerView zeigen; berücksichtige das nicht, weil ich mir ziemlich sicher bin, dass der Weg falsch ist. Ich erhalte Listen Informationen von SQLite-Datenbank:

public class ShowListOfLists extends AppCompatActivity { 

private RecyclerView recyclerView; 
private RecyclerView.LayoutManager layoutManager; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_show_list_of_lists); 
    LocalDB localDB = new LocalDB(this, "localBD", null, 1); 
    Vector <List> ListAdapter = localDB.getAllPrivateList(); 

    recyclerView = (RecyclerView) findViewById(R.id.recyclerviewlistas); 
    recyclerView.setAdapter(new ListAdapter(this, ListAdapter)); 
    layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 
} 

Eine Liste haben folgende Eigenschaften:

-idList int 
-name String 
-Description String 
-creationDate Date 
-active int (0 or 1) 
-deactivationDate Date 

Vielen Dank im Voraus.

/******************************* ÄNDERN ************* ******************************/

Dank Ihnen konnte ich die recyclerView zeigen und es funktioniert gut. Aber ich sehe, dass:

recyclerviewresult

Statt dessen:

enter image description here

Dies ist der XML-Code und Design des Adapters:

ListAdapter Layout

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="60dp" 
android:background="@drawable/rectangle_bg" 
android:orientation="horizontal" 
android:weightSum="1" 
android:layout_marginTop="5dp"> 

<TextView 
    android:id="@+id/listname" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp" 
    android:layout_weight="0.75" 
    android:gravity="center_vertical" 
    android:text="TextView" 
    android:textSize="15sp"/> 

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="0.25" 
    android:gravity="end" 
    android:orientation="vertical"> 

    <ImageButton 
     android:id="@+id/delete" 
     android:layout_width="match_parent" 
     android:layout_height="30dp" 
     android:background="@android:color/transparent" 
     android:contentDescription="Delete" 
     app:srcCompat="@android:drawable/ic_menu_delete" /> 

    <ImageButton 
     android:id="@+id/edit" 
     android:layout_width="match_parent" 
     android:layout_height="30dp" 
     android:background="@android:color/transparent" 
     android:contentDescription="Edit" 
     app:srcCompat="@android:drawable/ic_menu_edit" /> 

    </LinearLayout> 

</LinearLayout> 

Und Dies ist die XML des recyclerview

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    tools:context="com.pc.kanayel.runoutof.ShowListOfLists" 
    android:orientation="vertical" 
    android:id="@+id/recyclerviewlistas"> 

</android.support.v7.widget.RecyclerView> 
+1

Sie können Sieh meine Co de, es ist sehr einfach, Sie können das gleiche tun. –

+1

Für Ihre zweite Ausgabe über die Breite, siehe meine Bearbeitung. – Marat

+0

Wirklich danke! Du hast meine App komplett gespeichert, ich hätte sie nicht ohne deine Hilfe beenden können – Kanayel

Antwort

4

Sie müssen nur einige Code zu Ihrem ListAdapter hinzuzufügen. Es ist dort, wo Sie onClickListener implementieren müssen. Der Code für Ihren Fall sollte etwa so aussehen wie der folgende.

Sie können alle Parameter übergeben, die Sie benötigen. Es hängt von der Funktionalität ab, die Sie erreichen möchten. Hier habe ich gezeigt, dass ich die Reihenfolge des in der Liste angeklickten Elements übergeben habe.

Option 1 (Leistung/Performance effizient)

Also, was macht den Code unten eigentlich? Sie haben bereits eine ViewHolder erstellt und OnClickListener implementiert. Das ist richtig. Jetzt müssen Sie OnClickListener auf zwei Tasten einstellen.Aber was diese Knöpfe tun, wenn sie geklickt werden, wird durch die interface definiert, die wir innerhalb von ViewHolder erstellt haben.

Wenn App ausgeführt wird RecyclerView erstellt so viele ViewHolders, wie es benötigt wird, um den verfügbaren Bildschirm mit Listenelementen zu füllen, indem onCreateViewHolder() Methode für jeden Viewholders aufgerufen wird. Wenn Sie nach oben/unten scrollen, werden diese ViewHolders wiederverwendet. OnCreateViewHolder() wird nicht aufgerufen, nur onBindViewHolder() wird aufgerufen, um den Inhalt des Viewholders zu aktualisieren. Der folgende Code wurde so erstellt, dass beim Erstellen von ViewHolder ein MyClickListener erstellt wird, der von OnClickListener des Viewholders verwendet wird. Wenn Viewholder erneut verwendet wird, wird kein neuer OnClickListener erstellt. Das bedeutet, dass unsere Methode leistungsfähig ist.

Option 2 (nicht effizient)

Sie könnten auch setOnClickListener() innerhalb von onBindViewHolder(). Wie ich jedoch im obigen Absatz erwähnt habe, wird diese Methode jedes Mal aufgerufen, wenn Sie den Inhalt des Viewholders aktualisieren. Nein, es würde jedes Mal ein neues Objekt OnClickListener erstellen. Während Option 1 hat OnClickListener auf jedem ViewHolder und es wiederverwendet sie.

-Code für Option 1

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> { 

    private LayoutInflater layoutInflater; 
    protected Vector<List> lists; 

    public ListAdapter(Context context, Vector lists) { 
     layoutInflater = (LayoutInflater) 
     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.lists = lists; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = layoutInflater.inflate(R.layout.listadapter, null); 
     ViewHolder = holder = new ViewHolder(v, new ViewHolder.MyClickListener() { 
      @Override 
      public void onEdit(int p) { 
       // Implement your functionality for onEdit here 
      } 

      @Override 
      public void onDelete(int p) { 
       // Implement your functionality for onDelete here 
      } 
     }); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     List list = lists.elementAt(position); 
     holder.name.setText(list.getName()); 
    } 

    @Override 
    public int getItemCount() { 
     return lists.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     MyClickListener listener; 

     TextView name; 
     Button edit; 
     Button delete; 

     public ViewHolder(View itemView, MyClickListener listener) { 
      super(itemView); 
      name = (TextView) itemView.findViewById(R.id.listname); 
      edit = (Button) itemView.findViewById(R.id.edit); 
      delete = (Button) itemView.findViewById(R.id.delete); 

      this.listener = listener; 

      edit.setOnClickListener(this); 
      delete.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View view) { 
      switch (view.getId()) { 
       case R.id.edit: 
        listener.onEdit(this.getLayoutPosition()); 
        break; 
       case R.id.delete: 
        listener.onDelete(this.getLayoutPosition()); 
        break; 
       default: 
        break; 
      } 
     } 

     public interface MyClickListener { 
      void onEdit(int p); 
      void onDelete(int p); 
     } 
    } 
} 

bearbeiten Ihre zweite Frage

Um Listenelemente nehmen die ganze Breite der width Ihrer recyclerview-match_parent gesetzt zu machen. Es ist auch besser, es zu einer Kinderansicht eines Layouts zu machen. Zum Beispiel wie unten angegeben.

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.pc.kanayel.runoutof.ShowListOfLists"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerviewlistas" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

<RelativeLayout> 

Und diese Codeänderung innerhalb des Adapters:

View view = layoutInflater.inflate(R.layout.listadapter, null); 

dazu:

View view = layoutInflater.inflate(R.layout.listadapter, parent, false); 
+0

So eine nette Antwort! Aber was ist mit Klasse ShowListofLists? Ist das der Weg, die recycelte Ansicht zu zeigen oder nicht? Und ist diese Methode korrekt implementiert? public void onBindViewHolder (ViewHolder-Inhaber, int-Position) { List list = lists.elementAt (position); halter.name.setText (list.getName()); } – Kanayel

+1

'ShowListOfLists' ist eine' Activity', weil sie 'AppCompatActivity' erweitert. Es steuert die Benutzeroberfläche. Der 'ListAdapter' ist also das Werkzeug, das von' Activity' verwendet wird. Also scheint Ihre Implementierung von 'ShowListOfLists' richtig zu sein. Dort deklarieren Sie die Recycler-Ansicht, erstellen den Adapter und legen ihn auf Recyclerview fest. – Marat

+1

@Kanayel Wenn Sie die Methode in meiner Antwort verwenden und denken, dass es gut ist, dann bitte, akzeptieren Sie es. – Marat

1

Sie können einfach tun, wie folgt:

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     List list = lists.elementAt(position); 
     holder.name.setText(list.getName()); 
     holder.edit.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        // Do your stuff 
       } 
      }); 
     holder.delete.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        // Do your stuff 
       } 
      }); 
    } 
+0

Danke toodude, aber ich werde die erste Option von Marat verwenden, weil ich die Effizienz berücksichtigen muss – Kanayel

Verwandte Themen