避免不必實例和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商店精選頁面的頁面,但是每一行都有不同數量的精選項目,因此具有其獨特的高度?
爲什麼你有一個「StaggeredViewGroup」膨脹的觀點裏面?它是否像一個水平的列表視圖? –
它是一個自定義的ViewGroup,它可以像這樣安排孩子:http://goo.gl/vV2yzg – fahmy
我可能對這種adapterView不夠熟悉,但我認爲你做錯了。您能否請您說明您正在使用哪個庫,以便我可以檢查一下您應該如何處理它?此外,將這篇文章的任何幫助:http://stackoverflow.com/questions/18557720/gridview-with-different-cells-sizes-pinterest-style? –