2012-04-23 12 views
5

Attualmente sto costruendo un'app con una richiesta inviata al web, il risultato ottenuto viene analizzato e inserito in una lista di oggetti Array.accesso a oggetti personalizzati in una listview

questo elenco quindi, popola un ListView. Voglio creare un onClickListener che mi consenta di sapere quale oggetto è stato cliccato, ma non riesco a trovare il modo corretto di implementarlo.

assegnare l'onClick a ListView nell'attività originale oppure assegnare l'ascoltatore all'interno della funzione getView nell'adattatore personalizzato.

mi sembra di assegnare gli ascoltatori allo getView troppo sovraccarico.

come funziona? cos'è meglio?

codice per l'attività principale:

public class NoPicList extends Activity { 
    ListView list; 
    NoPicAdapter adapter; 
    ProgressDialog mDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.no_pic_list); 
     list = (ListView) findViewById(R.id.noPicListView); 

     Bundle b = getIntent().getExtras(); 
     String request = b.getString("REQUEST"); 
     mDialog = new ProgressDialog(this); 
     mDialog.setCancelable(false); 
     mDialog.setMessage("Lodaing Data"); 
     mDialog.show(); 

     new GetNewsAndCalendar().execute(request); 
    } 

    @Override 
    protected void onPause() { 
     mDialog.dismiss(); 
     super.onPause(); 
    } 

    class GetNewsAndCalendar extends 
     AsyncTask<String, Void, ArrayList<Message>> { 

     @Override 
     protected ArrayList<Message> doInBackground(String... params) { 
      String url = params[0]; 
      DOMFeedParser parser = new DOMFeedParser(url); 
      return parser.parse(); 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Message> result) { 
      adapter = new NoPicAdapter(NoPicList.this, result); 
      list.setAdapter(adapter); 
      //FIRST OPTION TO INSERT onClickListener 
      mDialog.dismiss(); 
     } 
    } //end of GetNewsAndCalendar 
} 

codice per l'adattatore lista:

public class NoPicAdapter extends BaseAdapter { 

    private ArrayList<Message> data; 
    private Activity mActivity; 
    private LayoutInflater inflater = null; 

    public NoPicAdapter(Activity a, ArrayList<Message> result) { 
     mActivity = a; 
     data = result; 
     inflater = (LayoutInflater) mActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     if (convertView == null) 
      vi = LayoutInflater.from(mActivity).inflate(R.layout.no_pic_list_item, 
       null); 

     TextView title = (TextView) vi.findViewById(R.id.noPicTitle); 
     TextView subtitle = (TextView) vi.findViewById(R.id.noPicSubtitle); 

     title.setText(data.get(position).getTitle()); 
     subtitle.setText(data.get(position).getDate()); 
    // SECOND PLACE TO INSERT THE onClickListener 
     return vi; 
    } 
} 

risposta

3

Come per la mia preoccupazione, assegnare il onClick alla ListView nell'attività originale è buona idea, piuttosto che assegnarla a getView() del tuo adattatore personalizzato. Perché in getView() della scheda si crea sempre una nuova View.onClick () 's oggetto ..

list.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
    { 
    adapter.get(position); 
    // Get data from your adapter, the above code of line give the custom adapter's object of current position of selected list item  
    } 
}); 
+0

'setOnItemSelectedListener'? per cosa? –

+0

@PareshMayani - Oh scusa, il mio errore è stato su ItemClickListener .. Grazie per questo. – user370305

+0

Penso che 'onClickListener' non possa ottenere un' onItemSelectedListener'. quindi deve essere un 'onItemSelectedListener' – thepoosh

3

d'accordo con user370305' risposta s.

Hai solo bisogno di implementare OnItemClickListener nella classe di attività, dopo aver creato otterrete onItemClick metodo, dentro che si otterrà posizione dell'oggetto cliccato.

@Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { 
     // TODO Auto-generated method stub 
     MyObject clickedObject = (MyObject) adapter.getItem(position); 
     // MyObject is user-defined class 

    } 
+0

** adapter.getItem (posizione); ** restituirà la variabile posizione. guarda il suo codice adattatore .. e getterà un'eccezione di classe cast .. – ngesh

+0

@sandy sì, ho appena mostrato un modo per implementare l'evento OnItemClick, per il resto parte che dovrebbe provare per mano. –

+0

@sandy, il 'getItem (posizione)' sarà implementato adesso, non l'ho ancora implementato ... – thepoosh