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

匿名 (未验证) 提交于 2019-12-03 02:05:01

问题:

I am getting following warning in eclipse:

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. 

on:

convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); 

I have a base adapter with a checkbox implemented and I have added a tag to make the check box work.

Here is the 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);      if (InviteFriends.isChecked[position] == true)     {         mViewHolder.cb.setChecked(true);     }     else     {         mViewHolder.cb.setChecked(false);     }      mViewHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener()      {         @Override         public void onCheckedChanged(CompoundButton buttonView, boolean ischecked)          {             if (buttonView.isChecked())             {                 InviteFriends.isChecked[position] = true;              }             else             {                 InviteFriends.isChecked[position] = false;             }         }     });      TextView friendsname  = (TextView) convertView.findViewById(R.id.friendsName); // title     ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image      HashMap song = new HashMap();     song = data.get(position);      // Setting all values in listview     friendsname.setText(song.get(InviteFriends.KEY_DISPLAY_NAME));     imageLoader.DisplayImage(song.get(InviteFriends.KEY_IMAGEPROFILE_URL), thumb_image);       return convertView; } 

The results are coming up properly. How do I fix this warning? I am not able to get a solution for this yet?

Thanks!

回答1:

Try this

static class ViewHolder {      private TextView friendsname;     private ImageView thumb_image;     private CheckBox cb;  } public View getView(final int position, View convertView, ViewGroup parent) {      ViewHolder mViewHolder = null;     HashMap song = null;      if (convertView == null) {          song = new HashMap ();         mViewHolder = new ViewHolder();          LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);          convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false);         mViewHolder.friendsname = (TextView) convertView.findViewById(R.id.friendsName); // title         mViewHolder.thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image           mViewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox);          convertView.setTag(mViewHolder);         mViewHolder.cb.setTag(data.get(position));          mViewHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {             @Override             public void onCheckedChanged(CompoundButton buttonView, boolean ischecked) {                  InviteFriends.isChecked[position] = buttonView.isChecked();              }         });      } else {          mViewHolder = (ViewHolder) convertView.getTag();      }      song = mViewHolder.cb.getTag();      mViewHolder.friendsname.setText(song.get(InviteFriends.KEY_DISPLAY_NAME));     mViewHolder.imageLoader.DisplayImage(song.get(InviteFriends.KEY_IMAGEPROFILE_URL), thumb_image);     mViewHolder.cb.setChecked(InviteFriends.isChecked[position]);      return convertView; } 


回答2:

you should init the convert view only if it is null

these lines

LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); // [...] the rest of initialization part // [...] some changes that must be done at refresh return convertView; 

should look like this:

if (convertView == null) {     LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);      convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false);     // [...] the rest of initialization part } // [...] some changes that must be done at refresh return convertView; 

the goal is to recycle the already existing view in that list, not to init it each time you display it when scrolling the list for example.



回答3:

My suggestion is try to use convertView = vi.inflate(R.layout.activity_friend_list_row, null); insted of convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); this may help you.

:- okey.. insted of accessing like this TextView friendsname = (TextView) convertView.findViewById(R.id.friendsName); // title ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image you have to use viewholder class in your adapter

for example

static class ViewHolder {     public TextView text;     public ImageView image;   }    @Override   public View getView(int position, View convertView, ViewGroup parent) {     View rowView = convertView;     // reuse views     if (rowView == null) {       LayoutInflater inflater = context.getLayoutInflater();       rowView = inflater.inflate(R.layout.rowlayout, null);       // configure view holder       ViewHolder viewHolder = new ViewHolder();       viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);       viewHolder.image = (ImageView) rowView           .findViewById(R.id.ImageView01);       rowView.setTag(viewHolder);     }      // fill data     ViewHolder holder = (ViewHolder) rowView.getTag();     String s = names[position];     holder.text.setText(s);     if (s.startsWith("Windows7") || s.startsWith("iPhone")         || s.startsWith("Solaris")) {       holder.image.setImageResource(R.drawable.no);     } else {       holder.image.setImageResource(R.drawable.ok);     }      return rowView;   } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!