2012-06-19 9 views
7

Ho un multiplo TextView s per articolo di elenco nel mio ListView. Ho imparato a scrivere un metodo corretto getView, ma non sono sicuro che devo usare il metodo setAdapter per chiamare tale metodo.Come impostare l'adattatore in caso di più visualizzazioni di testo per listview?

private static String[] project = {"proj1","proj2"}; 
private static String[] workRequests = {"requirement gathering", "design"}; 
private static String[] startDate = {"02/21/2012","07/15/2011"}; 
private static String[] status = {"WIP","DONE"}; 

ListView mListView; 

public class MyDashboardActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mydashboard); 

     final LayoutInflater mInflater = LayoutInflater.from(this); 
     mListView = (ListView)findViewById(R.id.dashboardList); 
     mListView.setAdapter(
       // How do I set the adapter? 
       ); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     System.out.println("enters"); 
     if(convertView == null){ 
      convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); 
     } 

     ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); 
     ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); 
     ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); 
     ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); 

     return convertView; 
    } 

Questo è il layout xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/home_root" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <!-- Include Action Bar --> 
    <include layout="@layout/actionbar_layout" /> 

    <ListView 
     android:id="@+id/dashboardList" 
     style="@style/LeftHeaderText" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:background="@drawable/innerdashboard_bg" 
     android:textColor="@color/textColor" > 

     <TextView android:id="@+id/project" /> 

     <TextView android:id="@+id/work_request" /> 

     <TextView android:id="@+id/start_date" /> 

     <TextView android:id="@+id/status" /> 

    </ListView> 

</LinearLayout> 

Ho provato alcuni modi, nessuno dei quali ha lavorato. Qualcuno potrebbe suggerire come impostare l'adattatore in questo caso? Grazie!

+1

vedere questo esempio completo http://android-example-code.blogspot.in/p/dynamic-custoized-list-view-in-android.html – MAC

+0

manca un codice ... dove si trova la classe che estende baseAdapter? ?? –

+0

La tua parte 'getView()' della tua classe 'Adapter'? – slybloty

risposta

15

È necessario implementare il proprio adattatore. Il mio modo è anche di definire un oggetto che "rappresenti" una vista.

Di seguito, c'è un esempio molto semplice con due TextViews per soddisfare le vostre esigenze.

L'oggetto che rappresenta una vista (una riga nella ListView):

public class CustomObject { 

    private String prop1; 
    private String prop2; 

    public CustomObject(String prop1, String prop2) { 
     this.prop1 = prop1; 
     this.prop2 = prop2; 
    } 

    public String getProp1() { 
     return prop1; 
    } 

    public String getProp2() { 
     return prop2; 
    } 
} 

Avanti l'adattatore personalizzato:

public class CustomAdapter extends BaseAdapter { 

    private LayoutInflater inflater; 
    private ArrayList<CustomObject> objects; 

    private class ViewHolder { 
     TextView textView1; 
     TextView textView2; 
    } 

    public CustomAdapter(Context context, ArrayList<CustomObject> objects) { 
     inflater = LayoutInflater.from(context); 
     this.objects = objects; 
    } 

    public int getCount() { 
     return objects.size(); 
    } 

    public CustomObject getItem(int position) { 
     return objects.get(position); 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     if(convertView == null) { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.your_view_layout, null); 
     holder.textView1 = (TextView) convertView.findViewById(R.id.id_textView1); 
     holder.textView2 = (TextView) convertView.findViewById(R.id.list_id_textView2); 
     convertView.setTag(holder); 
     } else { 
     holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.textView1.setText(objects.get(position).getprop1()); 
     holder.textView2.setText(objects.get(position).getprop2()); 
     return convertView; 
    } 
} 

Ora è possibile definire e impostare l'adattatore nella vostra attività:

ArrayList<CustomObject> objects = new ArrayList<CustomObject>(); 
CustomAdapter customAdapter = new CustomAdapter(this, objects); 
listView.setAdapter(customAdapter); 

Ora devi solo gestire il tuo CustomObject nella lista degli oggetti. Non dimenticare di invocare customAdapter.notifyDataSetChanged() quando si desidera apportare modifiche al repercute su ListView.

+0

Grazie mille, ci sto provando. – Harsh

+0

prego, ho corretto alcuni errori nei nomi delle variabili. – FabiF

+0

Quindi devo creare adattatori personalizzati per ogni nuovo 'ListView' che creo? (Che ha più di 'TextView'sourse) – Harsh

4

Il codice getView() deve entrare in una classe che estende BaseAdapter o una delle sue sottoclassi.

Un modo per fare ciò è creare una classe privata all'interno di MyDashboardActivity. Ecco un breve esempio qui sotto (sarà richiesto un codice aggiuntivo). Probabilmente vorrai anche che un oggetto personalizzato associ tutte le cose che vuoi visualizzare in una voce di elenco. Invece di più array, disporre di una matrice di un tipo personalizzato con proprietà per ogni valore che si sta monitorando.

Un'altra cosa: le quattro TextView devono essere inserite nel proprio file di layout (vedere list_item.xml here). Il file di layout dell'articolo viene collegato tramite il costruttore dell'adattatore personalizzato (ho aggiunto un commento nel codice qui sotto per evidenziarlo).

protected CustomAdapter mAdapter; 

public class MyDashboardActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mydashboard); 

     final LayoutInflater mInflater = LayoutInflater.from(this); 
     mListView = (ListView)findViewById(R.id.dashboardList); 

     mAdapter = new CustomAdapter(this, <array to be adapted>); 
     mListView.setAdapter(mAdapter); 
    } 

    private class CustomAdapter extends ArrayAdapter<String> { 

     protected Context mContext; 
     protected ArrayList<String> mItems; 

     public CustomAdapter(Context context, ArrayList<String> items) { 
      super(context, R.layout.custom_list_item, items); // Use a custom layout file 
      mContext = context; 
      mItems = items; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      System.out.println("enters"); 
      if(convertView == null){ 
       convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); 
      } 

      // You'll need to use the mItems array to populate these... 
      ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); 
      ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); 
      ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); 
      ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); 

      return convertView; 
     } 
    } 
} 
+0

Mi sono reso conto! Grazie :) – Harsh

+2

Sei un tizio salvavita. Ti amo – A23149577

+1

Grazie per questo, lo sto usando. Ma un piccolo suggerimento: IntelliJ IDEA dà un avvertimento per "gonfiare (R.layout.mydashboard, null)", e questa risposta http://stackoverflow.com/a/24832569/253938 suggerisce di cambiarla per "gonfiare (R.layout .mydashboard, genitore, false)". L'ho fatto e IntelliJ ha smesso di tormentarmi e funziona ancora. – RenniePet

2

Ci sono alcuni modi per farlo. Ti mostrerò la mia strada che contiene due layout, il primo è solo il ListView e l'altro è come dovrebbe apparire il testo per ogni elemento della lista.

listset.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <ListView 
     android:id="@+id/shipMenu" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

listitems.xml (Si può anche mettere le immagini in qui, l'idea è di controllo)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/makerID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:textSize="25dp"/> 

</LinearLayout> 

Con quanto sopra non ho ancora l'opera d'arte ma intendo aggiungere un ImageView per le icone (e puoi aggiungere anche altre TextView). Ecco la mia classe dell'adattatore personalizzato.

ListAdapter.java

class ListAdapter extends ArrayAdapter <String> 
{ 

    public ListAdapter(Context context, String[] values) { 

     super(context, R.layout.listitems, values); //set the layout that contains your views (not the one with the ListView) 
    } 

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

     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     View view = inflater.inflate(R.layout.listitems, parent, false); //same here. 

     String text = getItem(position); 

     TextView makerID = (TextView) view.findViewById(R.id.makerID); 
     makerID.setText(text); 

     return view; 
    } 

} 

Nel file principale attività impostare

setContentView (R.layout.listset); 

E aggiungere questo sotto nel stesse staffe come setContentView()

ListAdapter adapter = new ListAdapter(this, MyString[]); //place your String array in place of MyString 

     ListView lv = (ListView) findViewById(R.id.ListViewID); //the ID you set your ListView to. 
     lv.setAdapter(adapter); 

Modifica

Sono un po 'in ritardo per la festa, ma forse questo aiuterà qualcuno.

Problemi correlati