2013-06-24 19 views
5

Ho una domanda che dovrebbe essere semplice, ma non riesco a risolverlo.Dare i tag degli elementi listviewview senza arrayadapter personalizzato

Sto usando DragSortListView. Voglio assegnare a ciascun elemento listview un tag con la sua posizione originale. Quando l'utente ha finito di riordinare, voglio restituire una stringa con ID originali (come 2,3,4,1 se l'utente ha spostato il primo oggetto all'ultimo posto). Se un elemento viene eliminato, vorrei anche conoscere l'ID originale.

Ecco il mio codice.

DragSortListView mainListView = (DragSortListView) findViewById(R.id.list_pages); 
String[] names = settings.getString("pages", "Error,error").split(",");  
ArrayList<String> list = new ArrayList<String>(Arrays.asList(names)); 
adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.row, list); 
mainListView.setAdapter(adapter); 
DragSortController controller = new DragSortController(mainListView); 
... 

Ora ho pensato che sarebbe stato meglio per scorrere tutte le voci e dare loro i tag con i loro id originali. Sto cercando di ciclo tra gli elementi utilizzando qualcosa di simile

for (int i = 0; i < mainListView.getCount(); i++) 
{ 
    View v = mainListView.getChildAt(i); 
    TextView tx = (TextView) v.findViewById(R.id.text); 
    tx.setTag(i); 
} 

Tuttavia questo listview sembra essere vuota, anche se l'adattatore è stato impostato.

Non riesco a utilizzare un ArrayAdapter personalizzato, poiché l'app si arresta in modo anomalo quando un elemento viene rilasciato o trascinato via.

Informazioni aggiuntive: ListView è popolato quando i dati viene restituito da un servizio utilizzando un BroadcastReceiver. Non penso che questo influenzi questo, ma non si sa mai.

La mia domanda:

  • Come faccio a memorizzare ogni posizione originale list-oggetti, in modo che io possa accedere in un secondo momento?

Grazie in anticipo!

risposta

8

Se non si desidera utilizzare un personalizzato Adapter, allora si può solo farlo in questo modo:

List<Item> dataForTheAdapter = new ArrayList<Item>(); 

    // 'dataRetrivedfromService' is the data, that gets returned by the service 
    for (int counter = 0; counter < dataRetrivedfromService.size(); counter++) { 
     dataForTheAdapter.add(new Item(dataRetrivedfromService.get(counter), counter)); 
    } 

    mContext = MyActivity.this; 
    mAdapter = new ArrayAdapter<Item>(mContext, R.layout.row, dataForTheAdapter); 

    ListView listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(mAdapter); 

Questo codice è piuttosto auto esplicativo. Ora guardando la classe Item.java, vedrai che ho annullato il metodo toString(). Il metodo toString() viene chiamato sull'oggetto fornito di cui ListView vuole riempire i propri dati.

public class Item { 

    private String mText; 
    private int mPosition; 

    public Item(String text, int position) { 

     this.mText = text; 
     this.mPosition = position; 
    } 

    public int getPosition() { 

     return mPosition; 
    } 

    public void setPosition(int position) { 

     this.mPosition = position; 
    } 

    public String getText() { 

     return mText; 
    } 

    public void setText(String text) { 

     this.mText = text; 
    } 

    @Override 
    public String toString() { 

     return this.mText; 
    } 
} 

Ora non dovrà scrivere un adattatore personalizzato, ma può riempire il vostro ListView con l'oggetto di un elemento.

per testare questo se funziona, è possibile impostare un OnItemClickListener sul ListView e fare questo:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       Toast.makeText(mContext, String.valueOf(mAdapter.getItem(position).getPosition()), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
+0

Davvero utile risposta, grazie Ahmad! Poiché questo è un adattatore diverso, ha comunque cambiato il mio 'setDropListener()' e 'setRemoveListener()', ma lo capirò. Non appena lo farò, lo segnerò come completo :) Grazie ancora! –

+0

Fatto! Questa risposta è stata perfetta. Grazie! –