2014-12-14 12 views
9

Come posso utilizzare le proprietà di un oggetto personalizzato in un Listview. Se implemento un ArrayAdapter con un elenco di stringhe, viene visualizzato correttamente in Listview ma quando si utilizza un elenco di oggetti personalizzati, viene semplicemente visualizzato l'indirizzo di memoria.come utilizzare un ArrayAdapter in Android di oggetti personalizzati

Il codice che ho fino ad ora:

ArrayList<CustomObject> allObjects = new ArrayList<>(); 

allObjects.add("title", "http://url.com")); 


    ArrayAdapter<NewsObject> adapter = new ArrayAdapter<NewsObject>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, allNews); 


     // Assign adapter to ListView 
     listView.setAdapter(adapter); 


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

       Uri uri = Uri.parse("http://www.google.com"); 
       startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
      } 
     }); 

C'è una domanda simile here ma che non è quello che mi serve da quando ho solo bisogno di avere lo show titolo nella visualizzazione elenco e quando fanno clic estrarre il url.

risposta

21

Un ArrayAdapter visualizza il valore restituito dal metodo toString(), quindi sarà necessario eseguire l'override di questo metodo nella classe Object personalizzata per restituire la stringa desiderata. Avrai anche bisogno di avere almeno un metodo getter per l'URL, quindi puoi recuperarlo nell'evento click.

public class NewsObject { 
    private String title; 
    private String url; 

    public NewsObject(String title, String url) { 
     this.title = title; 
     this.url = url; 
    } 

    public String getUrl() { 
     return url; 
    } 

    @Override 
    public String toString() { 
     return title; 
    } 
    ... 
} 

Nel metodo onItemClick(), position sarà l'indice nella ArrayList di oggetti personalizzati che corrispondono alla voce dell'elenco cliccato. Recupera l'URL, analizzalo e chiama startActivity().

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      NewsObject item = allNews.get(position); 
      String url = item.getUrl(); 
      Uri uri = Uri.parse(url); 
      startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
     } 
    }); 

Si prega di notare, ho assunto la classe personalizzata è NewsObject, come è quello che viene utilizzato con il tuo esempio adattatore.

+1

Esattamente quello di cui avevo bisogno, grazie! –

-1

È necessario eseguire l'override del getView dell'adattatore per visualizzare il singolo oggetto in una posizione nella vista.

0
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       CustomObject obj = allObjects.get(position); 
       //Now use obj to access the property 
       Uri uri = Uri.parse("http://www.google.com"); 
       startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
      } 
     }); 
4

Se si desidera utilizzare un metodo della classe personalizzata è necessario implementare una classe ArrayAdapter per il custode ... Come creare questo?

Primo passo

Ottieni il tuo progetto e creare una nuova classe. Poi si estende classe con ArrayAdapter<YourObject>{} e dichiarare all'interno del vostro atributes che ha bisogno di voi ... Il mio esempio:

public class Room_Adapter extends ArrayAdapter<Room_Object> { 

//Declaration of Atributes 
private ArrayList<Room_Object> Rooms_Array; 
private final Activity context; 
private final ListView lvBuinding; 

Seconda

dichiarare un costruttore per questa classe, sempre avete bisogno di un'attività e ArrayList, mette dentro gli altri se avete bisogno di ... Nel mio caso ho bisogno ListView ... il mio esempio:

public Room_Adapter(Activity context, ArrayList<Room_Object> Rooms_Array,ListView lvBuinding) { 
    super(context, R.layout.room_layout, Rooms_Array); 

    this.context = context; 
    this.Rooms_Array = Rooms_Array; 
    this.lvBuinding = lvBuinding; 
} 

il metodo eccellente nees la vostra attività, layout personalizzato (se lo avete) e l'array.

Terzo

dichiarare una classe statica o crearne uno nuovo se si dispone di un layout di riga personalizzata. Il mio esempio ha una classe statica:

public static class Room_View{ 

    //Declaration of Atributes 
    TextView RoomName; 
    ImageView RoomState; 
    TextView NoTroubles; 

    Button btnRoomRow; 

    ImageButton btnShowRoomTasks; 
    ImageButton btnAddTasks; 

    RelativeLayout RowLayout; 
} 

Quarto

metodo Override GetView.

@Override 
public View getView(int position, View ConvertView, ViewGroup parent) { 

    //Declaration of Variables 
    Room_View rowView; //Custom static class with controls 
    LayoutInflater inflator = context.getLayoutInflater(); 

    if (ConvertView == null) { 
     rowView = new Room_View(); 
     ConvertView = inflator.inflate(R.layout.room_layout,null,true); //Inflate your view with your custom view. 


     rowView.RoomName = (TextView) ConvertView.findViewById(R.id.txtvRoom); 
     rowView.RoomState = (ImageView) ConvertView.findViewById(R.id.ivRoomState); 
     rowView.NoTroubles = (TextView) ConvertView.findViewById(R.id.txtvNoTroubles); 

     rowView.btnRoomRow = (Button) ConvertView.findViewById(R.id.btnRoomRow); 

     rowView.btnAddTasks = (ImageButton) ConvertView.findViewById(R.id.btnAddTask); 
     rowView.btnShowRoomTasks = (ImageButton) ConvertView.findViewById(R.id.btnShowRoomTasks); 

     rowView.RowLayout = (RelativeLayout) ConvertView.findViewById(R.id.rowLayout); 


     ConvertView.setTag(rowView); 
    } 
    else 
    { 
     rowView = (Room_View) ConvertView.getTag(); 
    } 

    //Here custom your control stats 
    Room_Object Room = Rooms_Array.get(position); 
    rowView.RoomName.setText(Room.getRoomName()); 

    rowView.NoTroubles.setVisibility(View.INVISIBLE); 
    rowView.btnShowRoomTasks.setClickable(true); 
    rowView.btnShowRoomTasks.setImageResource(R.drawable.list_3a4b66_50); 
    rowView.btnShowRoomTasks.setOnClickListener(OnShowTasksClickListener); 

    //This is for add ClickListiner in my buttons... 
    rowView.btnAddTasks.setOnClickListener(OnAddTasksClickListener); 
    rowView.btnRoomRow.setOnClickListener(OnAddTasksClickListener); 

    if(Room.getStatus().equals("Checked")){ 
     rowView.RowLayout.setBackgroundColor(0xFFC7E6C7); 
     rowView.btnShowRoomTasks.setClickable(false); 
     rowView.btnShowRoomTasks.setImageResource(R.drawable.list_999999_50); 
     rowView.RoomState.setImageResource(R.drawable.check_3ebf4b_50); 
    } 
    else if(Room.getStatus().equals("Blocked")){ 
     rowView.RowLayout.setBackgroundColor(0xFFDBC3E5); 
     rowView.RoomState.setImageResource(R.drawable.key_9330e0_50); 
    } 
    else if(Room.getStatus().equals("Dirty")){ 
     rowView.RowLayout.setBackgroundColor(0xfffceedb); 
     rowView.RoomState.setImageResource(R.drawable.icon_housekeeping_3_yellow); 
    } 
    else if(Room.getStatus().equals("Troubled")){ 
     rowView.RowLayout.setBackgroundColor(0xFFF4CECD); 
     rowView.RoomState.setImageResource(R.drawable.wrench_eb3232_50); 

     rowView.NoTroubles.setVisibility(View.VISIBLE); 
     try { 
      rowView.NoTroubles.setText(Integer.toString(Room.getNoTasks())); 
     } 
     catch (Exception ex){ 
      Log.e("-- Error --",ex.getMessage()); 
     } 
    } 

    // 
    //Pay attention ************************************************* 
    // 

    //Now if you needs to use your custom external class this is the site, now imagine that you need gets string from your custom class in the text view, then: 

    //Declare class 
    CustomClass object = new CustomClass(); 

    rowView.(CUSTOM CONTROL FROM YOUR STATIC CLASS).(METHOD OF CONTROL)(object.(CUSTOM METHOD OF YOUR OBJECT)); 

    //For example If you follows my sample then: 
    rowView.NoTroubles.setText(object.getNumberOfTroubles().toString); 


    return ConvertView; 
} 

//Listener Methods for my button controls 
private View.OnClickListener OnShowTasksClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     int positionSelected = lvBuinding.getPositionForView((View) v.getParent()); 
     int totalRooms = lvBuinding.getCount() - 1; 
     int actualRoom = totalRooms - positionSelected; 

     try{ 
      //Your code; 
     } 
     catch (Exception ex){ 
      Log.e("-- CustomError --", ex.getMessage()); 
     } 
    } 
}; 

private View.OnClickListener OnAddTasksClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     int positionSelected = lvBuinding.getPositionForView((View) v.getParent()); 
     int totalRooms = lvBuinding.getCount() - 1; 
     int actualRoom = totalRooms - positionSelected; 

     try{ 
      //Your code; 
     } 
     catch (Exception ex){ 
      Log.e("-- CustomError --", ex.getMessage()); 
     } 
    } 
}; 
} 

penso che questo è che si ha bisogno, se avete bisogno di maggiori informazioni o stesso consiglio di me e cerco di aiuta ... Buona fortuna, Eduardo!

Problemi correlati