Skip to content Skip to sidebar Skip to footer

Different Row Layouts In Listview

This post is related to this ViewHolder not working. On that post, I was following a tutorial on how to use ViewHolder on a ListView. What I want now is to have the last item on a

Solution 1:

Implement the getItemViewType() and getViewTypeCount() for your adapter:

@Override
publicintgetViewTypeCount() {
   return2; //return 2, you have two types that the getView() method will return, normal(0) and for the last row(1)
}

and:

@OverridepublicintgetItemViewType(int position) {
    return (position == this.getCount() - 1) ? 1 : 0; //if we are at the last position then return 1, for any other position return 0
}

Then in the getView() method find out what type of view to inflate:

public View getView(finalint position, View convertView, ViewGroup parent) {
        Viewview= convertView;
        inttheType= getItemViewType(position); 
        if (view == null) {
          ViewHolderholder=newViewHolder();
          LayoutInflatervi= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          if (theType == 0) {
              // inflate the ordinary row
              view = vi.inflate(R.layout.list_item_bn, null);
              holder.textView = (TextView)view.findViewById(R.id.tv_name);      
          } elseif (theType == 1){
             // inflate the row for the last position
              view = vi.inflate(R.layout.list_item_record, null);
              holder.textView = (TextView)view.findViewById(R.id.record_view);
          } 
          view.setTag(holder);
         }
 //other stuff here, keep in mind that you have a different layout for your last position so double check what are trying to initialize
}

The example from the comments: http://pastebin.com/gn65240B (or https://gist.github.com/2641914 )

Solution 2:

The problem is that once you've inflated the view it can be reused many times in any position. I'd suggest the following approach: you inflate all but last item as usual (including the view holder), but for the last item you hold the reference as a field of CustomListAdapter and return it every time the last item is requested:

privateclassCustomListAdapterextendsArrayAdapter { 
    ...
    private View mLastItem; 

    public View getView(finalint position, View convertView, ViewGroup parent) {
        Viewview= convertView;
        ...
        intlastpos= mList.size()-1;

        if (view == null) {
            ViewHolderholder=newViewHolder();
            LayoutInflatervi= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            if (position == lastpos) {
                view = vi.inflate(R.layout.list_item_record, null);
                holder.textView = (TextView)view.findViewById(R.id.record_view);
                mLastItem = view;
            }
            else {
                view = vi.inflate(R.layout.list_item_bn, null);
                holder.textView = (TextView)view.findViewById(R.id.tv_name);
            }
            view.setTag(holder);
        }

        if (position == lastpos) {
            ... // Update the last item herereturn mLastItem; 
        }
        ...
    }

}

Post a Comment for "Different Row Layouts In Listview"