Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Custom Listview

Tags:

java

android

I went through tutorials and searched, but still I can't understand how the,

getView(int position, View convertView, ViewGroup arg2)

method works when extends BaseAdapter to create a custom listView in my android application. Therefore I cant Edit the Custom list view exactly I want.

I need to know when this method invokes and the meanings of the parameters.

If someone can explain the following method its great. Thanks

@Override
public View getView(int position, View convertView, ViewGroup arg2)
{

    ViewHolder holder;
    LayoutInflater inflater =  context.getLayoutInflater();

    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.listitem_row, null);                     
        holder = new ViewHolder();
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1);
        holder.txtViewDescription = (TextView) convertView.findViewById(R.id.textView2);

        convertView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag();                                        
    }

    holder.txtViewTitle.setText(title[position]);
    holder.txtViewDescription.setText(description[position]);



  return convertView;
}
like image 738
JibW Avatar asked Jan 18 '23 23:01

JibW


2 Answers

getView() is called when you call setAdapter in your code. After that when you move focus over list or select any item or you call notifyDataSetChanged() , you get call in getView().

Position - The position of the item within the adapter's data set of the item whose view we want.

convertView - The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type

The ViewGroup - that this view will eventually be attached to.

like image 121
Vineet Shukla Avatar answered Jan 21 '23 12:01

Vineet Shukla


getView() : As mentioned in specs getView method displays the data at the specified position. So, when you setAdapter and when you scroll your listView getView method will be called.

The method you copied here is a part of EfficientAdapter to optimize your ListView performance and along with optimization you used ViewHolder pattern.

Copied from Specs : With little more explanation

position :The position of the item within the adapter's data set of the item whose view we want.

convertView: The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type (see getViewTypeCount() and getItemViewType(int)).

So, in above method when you are doing the following thing you are reusing your convertView.

     if (convertView == null){
            ....
            convertView.setTag(holder);
     } else {
           holder = (ViewHolder) convertView.getTag(); 
      }

And by doing following thing you are avoiding lookup (findViewById), thats what the good thing about ViewHolder pattern

      holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1);

parent : The parent that this view will eventually be attached to

Edited

Question : How many times getView is called and how many convertView will be created ? Answer: Lets take an example of Efficeint Adapter from ApiDemos. If your screen showing 10 Rows, then,

convertView Count : 10 + 1 = 11 (10 Rows what you are seeing on screen, one extra to show scrolling effect). That means statements in if(convertView == null){...} block will be called only 11 times.

getView Count: Initially count will be 10, but when you start scrolling count keep on increasing. getView called every time to update data.

Note: This is only true for getView method mentioned in question.

like image 43
Gopal Avatar answered Jan 21 '23 14:01

Gopal