2016-01-22 144 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

你可以分享你的靜態課堂知識嗎?爲什麼我們要聲明靜態類。 –

相關問題