How to set adapter in case of multiple textviews per listview?

android, android-layout, android-listview

Solution

You need to implement your own Adapter. My way is to also define an object which "represents" a view.

Below, there is a very simple example with two `TextViews` to fit your needs.

The object which represents a view (a row in the 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;
    }
}

Next the custom adapter :

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;
   }
}

Now you can define and set your adapter in your activity :

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

Now you only have to manage your CustomObject's in the objects list. Don't forget to invoke `customAdapter.notifyDataSetChanged()` when you want repercute modifications on the ListView.

Problem

I have a multiple `TextView`s per list item in my `ListView`. I've learned to write a proper `getView` method I believe but I'm not sure ho do I use `setAdapter` to call that method. ``` 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; } ``` This is the xml layout: ``` <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> ``` I've tried a few ways, none of which worked. Could anyone please suggest how to set the adapter in this case? Thanks!

Original source

Related problems