Thursday, September 15, 2011

A closer look into Listview

This is about understanding listviews.

There are a few component to a listview in Android

1. The view
2. The arrayadapter
3. The data
4. The listener
5. A customised look

Standard declaration:
//base listview
Listview lview = (ListView) findViewById(R.id.AlistViewInXML);
lview.setAdapter(aAdapt);

//data-binding
We can use objects in binding data - since we can define objects - we can define values individually. We can also use ArrayList to house multiple objects.

For example, a object with three values - obj.V1, obj.V2 and obj.V3 each representing different values.

//customised look
We can design a view to be house into a item in a ListView. For instance, we can have 1 single layout view housing 3 separate textviews - tv1, tv2, tv3.


//declare new arrayadapter for our listview
// this arrayadapter will house 1. The data and the listener. But we can't use the standard listview if we wish to customise the listview. Thus, we will need to overload this standard call:

ArrayAdapter aAdapt = new ArrayAdapter (context, ViewToShowAsASingleItem, Data){


@Override
public View getView(int position, View cv, ViewGroup parent){
//arrange your ListView appearance
View rw = cv; //This is the view per item
buildAHolder hold;

if(rw == null){
//Set item appearance - when null, the item is recycled
LayoutInflater inflater=getLayoutInflater();
hold = new buildAHolder();
//with a holder - we can do referencing
hold.H_A = (TextView)((View) rw).findViewById(R.id.tv1);
hold.H_B = (TextView)((View) rw).findViewById(R.id.tv2);
hold.H_C = (TextView)((View) rw).findViewById(R.id.tv3);
//Use Tag to hold the holder class for retrieval subsequently
rw.setTag(hold);
hold.H_A.setTag(position);
} else {
// Get the ViewHolder back to get fast access to the TextViews
hold = (buildAHolder) rw.getTag();
hold.H_A.setTag(position);
}//End row recycling
//Set Data items to views
hold.H_A .setText(super.getItem(position).V1.toString());
hold.H_B .setText(super.getItem(position).V2.toString());
hold.H_C .setText(super.getItem(position).V3.toString());

cv.setOnClickListener(CustomclickListener); //you can choose where to put this
return cv;
} //End getView
OnClickListener CustomclickListener = new OnClickListener(){
public void onClick(View v) {
//Actions on click
}
}; //End onclicklistener
class buildAHolder{
//house views
TextView H_A; TextView H_B; TextView H_C;
}//End class

}; //End aAdapt

That's it about ListView - adapters
Notice also that we can do references with objects

1. Setup method to store and return View in an object. eg - setView and getView.
2. With setView, we can then set the preferred Layout into the object
3. Then use getView within the arrayadapter to extract the relevant view

Example:
View SelectedView;
if(a==true){SelectedView = (Layout) findViewById(R.Layout.Layout1;}
else{SelectedView = (Layout) findViewById(R.Layout.Layout2;}

obj.get(0).setView = SelectedView;

//In arrayadapater overloading
ArrayAdapter aAdapt = new ArrayAdapter (context, 1, Data){
public View getView(int position, View cv, ViewGroup parent){
if (position==0){//only reference view once first position
cv = obj.get(0)getView; // Note how normal textviewresourceid is any value (1 here)
}
View row = cv;

.... rest of code
}

}