2016-01-22 145 views
2

在你downvote亲切阅读之前,我已经看到已经问过的问题。许多问题与他们不符。什么是实现Viewholder设计模式的最佳方式。

这几天我更多处理自定义ListView和自定义GridView。我使用ViewHolder类来平滑滚动。但是我注意到了一些奇怪的东西。当我向下滚动列表或gridView时,项目会不断重复,当我执行ViewHolder时,正如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; 
} 
} 
+0

private class ViewHolder { public ImageView image; public TextView title; } – Madhur

回答

2
public static ImageView image; 
public static TextView title; 

是错误的。他们应该是

public ImageView image; 
public TextView title; 

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

+0

哦,亲爱的。我甚至没有注意到它。非常感谢! –

+0

欢迎你 – Blackbelt

+0

你可以分享你的静态课堂知识吗?为什么我们要声明静态类。 –

相关问题