可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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; }