Unconditional layout, inflation from view adapter: Should use View Holder pattern
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<String, String> song = null; if (convertView == null) { song = new HashMap <String, String>(); 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;}
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 refreshreturn 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 refreshreturn 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.
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; }