【问题标题】:What is best way to implement Viewholder design pattern实现 Viewholder 设计模式的最佳方法是什么
【发布时间】:2016-01-22 08:14:08
【问题描述】:

这些天我更多地处理自定义ListView 和自定义GridView。我使用ViewHolder 类进行平滑滚动。但是我注意到了一些奇怪的事情。当我向下滚动列表时,项目会不断重复,或者当我实现ViewHolder 时,gridView 会不断重复,正如 Android 指南中所推荐的那样。但是当我用它初始化视图时,项目不会重复。

告诉我如何才能使这变得更好。这使我可以平滑滚动而无需重复相同的项目。

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

这段代码给了我重复的项目,是 Android 指南中推荐的方式:

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

【问题讨论】:

  • 私有类 ViewHolder{ public ImageView image;公共文本视图标题; }

标签: android gridview


【解决方案1】:
 public static ImageView image;
 public static TextView title;

错了。他们应该是

public ImageView image;
public TextView title;

没有 static 。这应该可以解决您的问题。你可以阅读更多关于静态关键字here

【讨论】:

  • 天哪。我什至没有注意到它。非常感谢!
  • 你能分享你关于静态类的知识吗?为什么我们要声明类静态。
  • static 应用于内部类意味着内部类看不到外部环境。应用于对象意味着您将只有该对象的一个​​实例,该实例将与包含该对象的类的所有实例共享
猜你喜欢
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多