What is best way to implement Viewholder design pattern.

痞子三分冷 提交于 2019-12-24 00:43:39

问题


Before you downvote kindly read I have seen already asked questions. Many problem doesn't match with them.

These days I am more dealing with a custom ListView and custom GridView. I use the ViewHolder class for smooth scrolling. But there is something weird I have noticed. Items keep repeating when I scroll down the list or gridView when I implement ViewHolder, as it is recommended in Android guides. But when I initialize views out of it, items don't repeat.

Tell me how I can make this better. This gives me smooth scrolling without repeating the same items.

public class GridAdapter extends BaseAdapter {
    Context context;
    Main values;
    LayoutInflater inflater;
    public GridAdapter(Context context, Main main){
        this.context=context;
        this.values=main;
        inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return values.getPosts().size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ImageLoader imageLoader= ImageLoader.getInstance();
        ViewHolder viewHolder = null;
        if(convertView==null){
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.grid_item,parent,false);

            convertView.setTag(viewHolder);
        }
        else {
            viewHolder=(ViewHolder)convertView.getTag();
        }
        viewHolder.image=(ImageView)convertView.findViewById(R.id.thumbnail);
        viewHolder.title=(TextView)convertView.findViewById(R.id.title);
        viewHolder.title.setText(Html.fromHtml(values.getPosts().get(position).getTitle()));
        imageLoader.displayImage(values.getPosts().get(position).getThumbnail_images().getFull().getUrl(), viewHolder.image);
        return convertView;
    }

    private static class ViewHolder{
        public static ImageView image;
        public static TextView title;
    }
}

This code gives me repeating items and is the recommended way in Android guides:

public class GridAdapter extends BaseAdapter {
Context context;
Main values;
LayoutInflater inflater;
public GridAdapter(Context context, Main main){
    this.context=context;
    this.values=main;
    inflater = ( LayoutInflater )context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return values.getPosts().size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ImageLoader imageLoader= ImageLoader.getInstance();
    ViewHolder viewHolder = null;
    if(convertView==null){
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.grid_item,parent,false);
    viewHolder.image=(ImageView)convertView.findViewById(R.id.thumbnail);
    viewHolder.title=(TextView)convertView.findViewById(R.id.title);
        convertView.setTag(viewHolder);
    }
    else {
        viewHolder=(ViewHolder)convertView.getTag();
    }

    viewHolder.title.setText(Html.fromHtml(values.getPosts().get(position).getTitle()));
    imageLoader.displayImage(values.getPosts().get(position).getThumbnail_images().getFull().getUrl(), viewHolder.image);
    return convertView;
}

private static class ViewHolder{
    public static ImageView image;
    public static TextView title;
}
}

回答1:


 public static ImageView image;
 public static TextView title;

is wrong. They should be

public ImageView image;
public TextView title;

without static . This should fix your issue. You can read more about static keyword here



来源:https://stackoverflow.com/questions/34941919/what-is-best-way-to-implement-viewholder-design-pattern

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