2012-01-01 11 views
11

E 'possibile ottenere una vista oggetto in base alla sua posizione nell'adattatore e non nelle viste visibili in ListView?Come ottenere la visualizzazione di un oggetto in listview in Android?

Sono a conoscenza di funzioni come getChildAt() e getItemIdAtPosition() tuttavia forniscono informazioni basate sulle viste visibili all'interno di ListView. Sono anche consapevole del fatto che Android ricicla le viste, il che significa che posso lavorare solo con le viste visibili in ListView.

Il mio obiettivo è di avere un identificatore universale per ogni elemento poiché utilizzo CursorAdapter in modo da non dover calcolare la posizione dell'articolo relativa agli elementi visibili.

risposta

1

Un'opzione migliore è identificare l'utilizzo dei dati restituiti da CursorAdapter anziché dalle viste visibili. Ad esempio se i dati sono in una matrice, ogni elemento di dati ha un indice univoco.

+0

() C'è qualche funzione particolare che mi poter usare? Ho letto l'intero elenco di funzioni di CursorAdapter ma nessuno di loro sembra avere la vista basata su id a parte getView() che non è consigliabile usare esternamente. –

+0

Qual è la struttura dati che stai utilizzando per compilare l'elenco? –

+0

Popolare l'elenco da un database Sqlite tramite CursorAdapter –

8

Ecco come ho realizzato questo. Entro la mia classe (personalizzato) Adattatore:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    view = inflater.inflate(textViewResourceId, parent, false); 
    final ViewHolder viewHolder = new ViewHolder(); 
    viewHolder.name = (TextView) view.findViewById(R.id.name); 
    viewHolder.button = (ImageButton) view.findViewById(R.id.button); 

    viewHolder.button.setOnClickListener 
     (new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     int position = (int) viewHolder.button.getTag(); 
     Log.d(TAG, "Position is: " +position); 
     } 
    }); 

    view.setTag(viewHolder); 
    viewHolder.button.setTag(items.get(position)); 

    } else { 
    view = convertView; 
    ((ViewHolder) view.getTag()).button.setTag(items.get(position)); 
    } 


    ViewHolder holder = (ViewHolder) view.getTag(); 

    return view; 
} 

In sostanza il trucco è quello di impostare e recuperare l'indice di posizione tramite i metodi setTag e getTag. La variabile items si riferisce allo ArrayList contenente i miei oggetti personalizzati (adattatore).

Vedere anche il tutorial this per esempi dettagliati. Fammi sapere se hai bisogno di me per chiarire qualsiasi cosa.

+0

Ho pensato a questo approccio. In CursorAdapter bindView sostituisce getView, ho tentato di impostare un tag per ogni vista utilizzando questo codice: id.setText (cursor.getString (cursor.getColumnIndexOrThrow ("id"))); tuttavia, per qualche ragione l'ID era ogni altro numero invece di essere continuo. Ad ogni modo, rivedrò il mio codice in base all'esempio che hai fornito. –

3

Potrebbe esserti utile. Vedere di seguito il codice:

public static class ViewHolder 
{ 
    public TextView nm; 
    public TextView tnm; 
    public TextView tr; 
    public TextView re; 
    public TextView membercount; 
    public TextView membernm; 
    public TextView email; 
    public TextView phone; 
    public ImageView ii; 
} 
class ImageAdapter extends ArrayAdapter<CoordinatorData> 
{ 
    private ArrayList<CoordinatorData> items; 
    public FoodDriveImageLoader imageLoader; 
    public ImageAdapter(Context context, int textViewResourceId,ArrayList<CoordinatorData> items) 
    { 
     super(context, textViewResourceId, items); 
     this.items = items; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View v = convertView; 
     ViewHolder holder = null; 
     if (v == null) 
     { 
      try 
      { 
       holder=new ViewHolder(); 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       imageLoader = new FoodDriveImageLoader(FoodDriveModule.this); 
       v = vi.inflate(R.layout.virtual_food_drive_row, null); 
       //System.out.println("layout is null......."); 
       holder.nm = (TextView) v.findViewById(R.id.name); 
       holder.tnm = (TextView) v.findViewById(R.id.teamname); 
       holder.tr = (TextView) v.findViewById(R.id.target); 
       holder.re = (TextView) v.findViewById(R.id.received); 
       holder.membercount = new TextView(FoodDriveModule.this); 
       holder.membernm = new TextView(FoodDriveModule.this); 
       holder.email = new TextView(FoodDriveModule.this); 
       holder.phone = new TextView(FoodDriveModule.this); 
       holder.ii = (ImageView) v.findViewById(R.id.icon); 

       v.setTag(holder); 
      } 
      catch(Exception e) 
      { 
       System.out.println("Excption Caught"+e); 
      } 
     } 
     else 
     { 
      holder=(ViewHolder)v.getTag(); 
     } 
     CoordinatorData co = items.get(position); 
     holder.nm.setText(co.getName()); 
     holder.tnm.setText(co.getTeamName()); 
     holder.tr.setText(co.getTarget()); 
     holder.re.setText(co.getReceived()); 
     holder.ii.setTag(co.getImage()); 

     imageLoader.DisplayImage(co.getImage(), FoodDriveModule.this , holder.ii); 

     if (co != null) 
     { 
     } 
     return v; 
    } 

} 

godere. Grazie.

0

Qui, il suo codice molto breve descritto, è possibile semplice schema riutilizzo viewholder per aumentare le prestazioni ListView Scrivi qui sotto codice nel tuo GetView metodo

ViewHolder holder = new ViewHolder(); 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.skateparklist, null); 
     holder = new ViewHolder(); 

     holder.headlineView = (TextView) convertView 
       .findViewById(R.id.textView1); 
     holder.DistanceView = (TextView) convertView 
       .findViewById(R.id.textView2); 
     holder.imgview = (NetworkImageView) convertView 
       .findViewById(R.id.imgSkatepark); 
     convertView.setTag(holder); //PLEASE PASS HOLDER AS OBJECT PARAM , CAUSE YOU CAN NOY PASS POSITION IT WILL BE CONFLICT Holder and Integer can not cast 
     //BECAUSE WE NEED TO REUSE CREATED HOLDER 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

// your controls/UI setup 
    holder.DistanceView.setText(strDistance); 
    ...... 
    return convertview 
1
Listview lv = (ListView) findViewById(R.id.previewlist); 

    final BaseAdapter adapter = new PreviewAdapter(this, name, age); 

    confirm.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 


      View view = null; 

      String value; 
      for (int i = 0; i < adapter.getCount(); i++) { 

       view = adapter.getView(i, view, lv); 

       Textview et = (TextView) view.findViewById(R.id.passfare); 


       value=et.getText().toString(); 

       Toast.makeText(getApplicationContext(), value, 
       Toast.LENGTH_SHORT).show(); 
      } 



     } 
    }); 
Problemi correlati