2014-06-13 24 views
0

避免不必實例和getView過程中添加子視圖()的Android適配器

我嘗試建立在谷歌Play商店的功能頁面一個類似於情景的方法。但是,我沒有爲一個類別顯示三個項目,而是讓它顯示兩列staggered grid view時尚中的任意數量的項目。

因此,每個列表項都有一個標題和一個描述,後跟一個自定義視圖(讓我們稱之爲SVG,就像在Staggered View Group中一樣),它以交錯的網格視圖方式顯示一些兒童視圖。

我有一個名爲FeaturedItems的類,它包含特徵列表中的一行數據。下面是一個提取物:

public class FeaturedItems { 

private String mName; 
private String mDescription; 
private ArrayList<Object> mList; 

public FeaturedItems(String name, String description, Object... items) { 
    mName = name; 
    mDescription = description; 
    mList = new ArrayList<Object>(); 
    for (int i = 0; i < items.length; i++) { 
     mList.add(items[i]); 

    } 
} 

public int getItemCount() { 
    return mList.size(); 
} 

public Object getItem(int position) { 
    return mList.get(position); 
} 

public String getFeatureName() { 
    return mName; 
} 

public String getFeatureDescription() { 
    return mDescription; 
} 

} 

FeaturedListAdapter結合與適配器的getView()方法的視圖中的數據。該getView()方法如下:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    FeaturedItems items = getItem(position); 

    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this.mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(mResource, null); 

     holder = new ViewHolder(); 
     holder.title = (TextView) convertView.findViewById(R.id.list_item_shop_featured_title); 
     holder.description = (TextView) convertView.findViewById(R.id.list_item_shop_featured_description); 
     holder.svg = (StaggeredViewGroup) convertView.findViewById(R.id.list_item_shop_featured_staggered_view); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.title.setText(items.getFeatureName()); 
    holder.description.setText(items.getFeatureDescription()); 

    // HELP NEEDED HERE 
    // THE FOLLOWING PART IS VERY INEFFICIENT 
    holder.svg.removeAllViews(); 

    for (int i = 0; i < items.getItemCount(); i++) { 
      FeaturedItem item = new FeaturedItem(mContext, items.getItem(i)); 
      item.setOnShopActionsListener((ShopActions) mContext); 
      holder.svg.addView(item); 
    } 

    return convertView; 
} 

問題

getView()方法,會返回一個視圖中的每個時間,它消除了在SVG中的所有子視圖和實例化新的視圖稱爲FeaturedItem那然後添加到SVG。即使特定行中的SVG(例如第一行)已填充,但當用戶從底部向後滾動時,getView()方法將刪除SVG中的所有子視圖,並實例化要填充的新視圖。

這裏的低效率非常明顯,列表視圖動畫在滾動時經常跳過幀。

我不能在這裏重複使用convertView,因爲它在StaggeredViewGroup中顯示錯誤的特色項目。因此,我必須從StaggeredViewGroup中刪除所有孩子,並實例化並添加與當前位置相關的視圖。

問題

有沒有解決這個問題的方法嗎?或者是否有其他方法可以創建類似於Google Play商店精選頁面的頁面,但是每一行都有不同數量的精選項目,因此具有其獨特的高度?

+0

爲什麼你有一個「StaggeredViewGroup」膨脹的觀點裏面?它是否像一個水平的列表視圖? –

+0

它是一個自定義的ViewGroup,它可以像這樣安排孩子:http://goo.gl/vV2yzg – fahmy

+1

我可能對這種adapterView不夠熟悉,但我認爲你做錯了。您能否請您說明您正在使用哪個庫,以便我可以檢查一下您應該如何處理它?此外,將這篇文章的任何幫助:http://stackoverflow.com/questions/18557720/gridview-with-different-cells-sizes-pinterest-style? –

回答

2

應該有一個簡單的方法來改進這個解決方案。只需重新使用已存在的svg兒童,如果他們不夠,請添加新的兒童,然後刪除任何多餘的兒童。

例如(在半僞代碼,方法名可能不準確):

for (int i = 0; i < items.getItemCount(); i++) 
{ 
    if (i < svg.getChildCount()) 
    { 
     FeaturedItem item = i.getChildAt(i); 

     // This item might've been set to invisible the previous time 
     // (see below). Ensure it's visible. 
     item.setVisibility(View.VISIBLE); 

     // reuse the featuredItem view here, e.g. 
     item.setItem(items.getItem(i)); 
    } 
    else 
    { 
     // Add one more item 
     FeaturedItem item = new FeaturedItem(mContext, items.getItem(i)); 
     ... 
     holder.svg.addView(item); 
    } 
} 

// hide surplus item views. 
for (int i = items.getItemCount(); i < svg.getChildCount(); i++) 
    svg.getChildAt(i).setVisibility(View.GONE); 

/** 
    as an alternative to this last part, you could delete these surplus views 
    instead of hiding them -- but it's probably wasteful, since they may need 
    to be recreated later 

while (svg.getChildCount() > items.getItemCount()) 
    svg.removeChildView(svg.getChildCount() - 1); 
**/ 
+0

這似乎是一個更好的解決方案。我將會看到這樣的表現如何與我現有的表現相抗衡,如果結果更好,我會在結果中發佈。 – fahmy

+1

爲什麼要刪除項目而不是隱藏它們? –

+0

@androiddeveloper我只關心不必要的視圖,但你說得對,隱藏它們可能是一個更好的選擇 - 編輯來反映它。謝謝! – matiash

相關問題