Different row layouts in ListView

后端 未结 2 1150
自闭症患者
自闭症患者 2020-12-01 14:55

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

相关标签:
2条回答
  • 2020-12-01 15:37

    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:

    private class CustomListAdapter extends ArrayAdapter { 
        ...
        private View mLastItem; 
    
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            ...
            int lastpos = mList.size()-1;
    
            if (view == null) {
                ViewHolder holder = new ViewHolder();
                LayoutInflater vi = (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 here
                return mLastItem; 
            }
            ...
        }
    
    }
    
    0 讨论(0)
  • 2020-12-01 15:39

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

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

    and:

    @Override
    public int getItemViewType(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(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            int theType = getItemViewType(position); 
            if (view == null) {
              ViewHolder holder = new ViewHolder();
              LayoutInflater vi = (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);      
              } else if (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 )

    0 讨论(0)
提交回复
热议问题