2016-03-24 11 views
0

Ich hatte ListView implementiert, die perfekt funktionierte. Jeder Listeneintrag enthält ImageView und TextView. Vorschaubild und TitelsetOnClickListener von imageView innerhalb recyclingApp Handhabung

I umgesetzt imageView.setOnItemClick() in ListviewAdaper dass TextView zeigt und es wieder auf ImageView klicken machen TextView GONE.

Jetzt wechselte ich zu RecyclerView mit dem gleichen Layout (ImageView und TextView).

In public void onBindViewHolder() von meinem RecyclerAdaper haben den gleichen Code hinzugefügt, wie ich in der Listenansicht implementiert wurde.

public void onBindViewHolder(MyViewHolder holder, int position) { 
    imageview = holder.image; 
    textview = holder.text; 
    imageview.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (type != MyGlobals.DATA_TYPE1) { 
       if (subtitle.getVisibility() == View.VISIBLE) { 
        imageview.startAnimation(rotate_backward); 
        textview.setVisibility(View.GONE); 
       } else { 
        imageview.startAnimation(rotate_forward); 
        textview.setVisibility(View.VISIBLE); 
       } 
      } 
     } 
    }); 

    } 

Problem hier ist, wenn ich RecyclerView Einträge mehr als 1 haben, und ich auf jeden ImageView Eintrag jeder RecyclerView Eintrag, nur letzte entrie der TextView hat visible/GONE werden und nicht der jeweilige entrie des TextView.

Wenn ich auf Debugger setzen und Pause bei onClick von ImageView, es zeigt eigentlich die TextView des letzten Eintrags oder RecyclerView.

Wie kann ich jedes ImageView von jedem RecyclerView Eintrag unabhängig behandeln, um TextView sichtbar/gegangen zu machen?

Nur eine Anmerkung hatte ich OnClickListener und OnLongClickListener von jedem Eintrag auch die gut funktionieren.

Antwort

2

Der Ansatz, den Sie tun, ist nicht sehr gut, weil es eine neue anonyme innere Klasse auf jedem bindHolder Callback erstellt. Was nur ein Gedächtnisverlust ist und den GC ohne guten Grund überlädt.

Der eigentliche Grund, warum Sie das Problem haben, ist, weil Sie einen Verweis auf das Bild mit image = holder.image; bekommen, aber dann auf der nächsten dieser Referenz verloren ist.

Mit einem getrennteren Ansatz können wir mit diesen beiden Problemen umgehen. Dazu fügen Sie diese zu Ihrer ViewHolder

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

     ImageView imageView; 

     public MyViewHolder(View itemView) { 
     super(itemView); 
     imageView = (ImageView) itemView.findViewById(R.id.image); 
     imageView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      // do your action here with imageView 
     } 
    } 

und entfernen Sie alle, dass click bezogenen Code von Ihrem onBindViewHolder

+0

Danke verwenden können. Das hat funktioniert. Jeder recyclerview-Eintrag ist (Bild, Titel, Untertitel, Anzahl), der ein separates Klassenobjekt ist und seine Liste dataList ist gefüllt. Um auf einen einzelnen Eintrag in onClick (in meinem Fall Textansicht) zuzugreifen, kann ich einen Eintrag von dataList.get (getAdapterPosition()) erhalten, wenn der Eintrag in der detaillierten Liste bearbeitet werden muss. –

+1

Froh, es hat funktioniert. Eine andere Möglichkeit besteht darin, die Dateninstanz während des Bindens zum Holder hinzuzufügen, wie 'halter.data = dataList.get (position)', so dass sie dann während des Klickens betriebsbereit ist – Budius

1

du

public void onBindViewHolder(MyViewHolder holder, int position) { 

holder.imageview.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     // Your image click code 

    } 
    }); 

} 
Verwandte Themen