Unconditional layout, inflation from view adapter: Should use View Holder pattern

后端 未结 5 1830
天命终不由人
天命终不由人 2020-12-08 13:33

I am getting following warning in eclipse:

Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed

5条回答
  •  清歌不尽
    2020-12-08 13:36

    Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed into this method as the second parameter) for smoother scrolling.

    It means that you need to use View Holder pattern in your Adapter. The point of using View Holder is to reusing the views because inflating and using findViewById are slow.

    When you're using the following code:

    public View getView(final int position, View convertView, ViewGroup parent) {
    
        ViewHolder mViewHolder;
        mViewHolder = new ViewHolder();
        LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false);
        mViewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox);
        convertView.setTag(mViewHolder);
    
        ...
    
        return convertView;
    
    } 
    

    you're not reusing the views but instead you always create new views.

    You need to change your code to something like this (please check the comment):

    // class for holding the cached view
    static class ViewHolder {
       TextView tvFriendsName;
       ImageView imvThumbImage;
       CheckBox cbInviteFriend;
    }
    
    public View getView(final int position, View convertView, ViewGroup parent) {
    
        // holder of the views to be reused.
        ViewHolder viewHolder;
    
        // get data based on the position
        HashMap song = data.get(position);
    
        // if no previous views found
        if (convertView == null) {
           // create the container ViewHolder
           viewHolder = new ViewHolder();
    
           // inflate the views from layout for the new row
           LayoutInflater inflater = LayoutInflater.from(parent.getContext());
           convertView = inflater.inflate(R.layout.rowlayout, parent, false);
    
           // set the view to the ViewHolder.
           viewHolder.cbInviteFriend = convertView.findViewById(R.id.checkBox);
           viewHolder.tvFriendsName  = convertView.findViewById(R.id.friendsName);
           viewHolder.imvThumbImage = convertView.findViewById(R.id.list_image); 
    
           // save the viewHolder to be reused later.
           convertView.setTag(viewHolder);
        } else {
           // there is already ViewHolder, reuse it.
           viewHolder = (ViewHolder) convertView.getTag();
        }
    
        // now we can set populate the data via the ViewHolder into views
        viewHolder.tvFriendsName.setText(song.get(InviteFriends.KEY_DISPLAY_NAME));
        imageLoader.DisplayImage(song.get(InviteFriends.KEY_IMAGEPROFILE_URL), viewHolder.imvThumbImage);
        viewHolder.cbInviteFriend.isChecked(InviteFriends.isChecked[position]);
    
        return convertView;
    }
    

提交回复
热议问题