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!