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

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;  }