Android custom Row Item for ListView Android custom Row Item for ListView android android

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

enter image description here


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.

enter image description here


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