Android custom Row Item for ListView
Add this row.xml to your layout folder
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Header"/><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text"/> </LinearLayout>
make your main xml layout as this
<?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" > <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" > </ListView></LinearLayout>
This is your adapter
class yourAdapter extends BaseAdapter { Context context; String[] data; private static LayoutInflater inflater = null; public yourAdapter(Context context, String[] data) { // TODO Auto-generated constructor stub this.context = context; this.data = data; inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return data.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return data[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View vi = convertView; if (vi == null) vi = inflater.inflate(R.layout.row, null); TextView text = (TextView) vi.findViewById(R.id.text); text.setText(data[position]); return vi; }}
Your java activity
public class StackActivity extends Activity { ListView listview; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listview = (ListView) findViewById(R.id.listview); listview.setAdapter(new yourAdapter(this, new String[] { "data1", "data2" })); }}
the results
Use a custom Listview.
You can also customize how row looks by having a custom background.activity_main.xml
<?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="vertical" android:background="#0095FF"> //background color<ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="0dip" android:focusableInTouchMode="false" android:listSelector="@android:color/transparent" android:layout_weight="2" android:headerDividersEnabled="false" android:footerDividersEnabled="false" android:dividerHeight="8dp" android:divider="#000000" android:cacheColorHint="#000000"android:drawSelectorOnTop="false"></ListView>
MainActivity
Define populateString() in MainActivity
public class MainActivity extends Activity { String data_array[];@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); data_array = populateString(); ListView ll = (ListView) findViewById(R.id.list); CustomAdapter cus = new CustomAdapter(); ll.setAdapter(cus);}class CustomAdapter extends BaseAdapter{ LayoutInflater mInflater; public CustomAdapter() { mInflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return data_array.length;//listview item count. } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder vh; vh= new ViewHolder(); if(convertView==null ) { convertView=mInflater.inflate(R.layout.row, parent,false); //inflate custom layour vh.tv2= (TextView)convertView.findViewById(R.id.textView2); } else { convertView.setTag(vh); } //vh.tv2.setText("Position = "+position); vh.tv2.setText(data_array[position]); //set text of second textview based on position return convertView; } class ViewHolder { TextView tv1,tv2; } } }
row.xml. Custom layout for each row.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Header" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="TextView" /> </LinearLayout>
Inflate a custom layout. Use a view holder for smooth scrolling and performance.
http://developer.android.com/training/improving-layouts/smooth-scrolling.html
http://www.youtube.com/watch?v=wDBM6wVEO70. The talk is about listview performance by android developers.
create resource layout file list_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"><TextView android:id="@+id/header_text" android:layout_height="0dp" android:layout_width="fill_parent" android:layout_weight="1" android:text="Header" /><TextView android:id="@+id/item_text" android:layout_height="0dp" android:layout_width="fill_parent" android:layout_weight="1" android:text="dynamic text" /></LinearLayout>
and initialise adaptor like this
adapter = new ArrayAdapter<String>(this, R.layout.list_item,R.id.item_text,data_array);