2016-06-04 3 views
0

Wenn wir den Listener während convertview==null platzieren, heißt das nicht, dass wir keinen neuen Listener für die entsprechenden überhöhten Ansichten erstellen können, wenn die Anzahl der darstellbaren Anzeigen nicht mehr ausreicht? Ist es auch möglich, die Variable einer Ansicht position in einem Adapter statt in einer Viewholder Klasse zu deklarieren?Soll der Listener innerhalb (conversionview == null) oder außerhalb des bedingten Blocks registriert werden? [ANDROID]

Beispielcode aus this website:

class ExampleAdapter extends ArrayAdapter<String> { 
private List<String> mData; 

public ExampleAdapter(Context context, List<String> objects) { 
    super(context, 0, objects); 
    mData = objects; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.simple_list_item_1, parent, false); 
     holder = new ViewHolder(); 
     holder.textView = (TextView) convertView; 
     convertView.setTag(holder); 
     holder.textView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getContext(), "Clicked in '" + mData.get(holder.position) + "'", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.textView.setText(mData.get(position)); 
    holder.position = position; 
    return convertView; 
} 

static class ViewHolder { 
    public TextView textView; 
    public int position; 
} 
} 

Antwort

0

Was sie tun, ist ok. Aber du musst vorsichtig sein.

Sie verwalten die Zuhörer so zu schreiben, dass es nicht zu ändern braucht, wenn die Ansicht recycelt und zu neuen Daten gebunden (nicht-null convertView ist eine Recycling-Ansicht zuvor zurück von getView)

Sie erreichen dies, indem Sie holder.position bei jedem Aufruf von getView auf einen neuen Wert setzen, also auch, wenn eine Ansicht recycelt wird. So erhalten Sie bei jedem Klick unterschiedliche Daten, wenn Sie auf mData.get(holder.position) klicken.

Sie können dies auch tun, indem Sie jedes Mal einen neuen Listener festlegen oder indem Sie eine direkte Referenz auf die Daten im Halter speichern.

+0

Wenn also die Ansicht wiederverwendet wird und das Ereignis onClick ausgelöst wird, ist die Listener-Registrierung immer noch relevant und ruft den vorhandenen registrierten Listener auf, jedoch mit anderen Daten, die durch die Variable ViewHolder.position möglich sind. –

+0

Auch wenn ich den Hörer nur nach draußen bewegen würde (obwohl in der Praxis nicht empfohlen), wird es immer noch keinen Unterschied in Bezug auf die Ausgabe geben, habe ich recht? –

+0

@Mr_RexZ korrekt. Das einzige, was Sie nicht tun müssen, ist, das Beispiel zu ändern, das Sie in 'mData.get (position)' veröffentlicht haben, weil die Position nicht mehr übereinstimmen würde, wenn sie einmal recycelt wurde. – zapl

Verwandte Themen