我有一个ListView,其中的不同專案具有不同的佈局.有些專案是分隔符.有些專案是不同的,因為它们儲存不同種類的資料,等等。
我想實現ViewHolders来加快getView的過程,但是我不太確定如何去做.不同的佈局具有不同的資料(這使命名變得困难)和我要使用的View的數量也不同。
我應该怎麼做?
我能想到的最好的主意是用X个專案建立一个通用的ViewHolder,其中X是專案佈局中视圖數量最多的视圖數.對於其他具有少量View的视圖,我將只在ViewHolder中使用這些變數的一个小节.假設我有2个佈局,分別用於2个不同的專案.一个拥有3个TextViews,另一个拥有1个。我將建立一个具有3个TextView變數的ViewHolder,並且仅將其中1个用於其他專案.我的問题是,這看起来很难看,而且感覺很hacky; 特別是当專案佈局可能具有许多不同型別的视圖時。
這是一个非常基本的getView:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder holder;
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.layout_mylistlist_item, parent, false);
holder = new MyHolder();
holder.text = (TextView) v.findViewById(R.id.mylist_itemname);
v.setTag(holder);
}
else {
holder = (MyHolder)v.getTag();
}
MyListItem myItem = m_items.get(position);
// set up the list item
if (myItem != null) {
// set item text
if (holder.text != null) {
holder.text.setText(myItem.getItemName());
}
}
// return the created view
return v;
}
假設我有不同型別的行佈局,則每種型別的行都可以有一个ViewHolder.但是我將哪種型別的" holder"宣告為最高? 還是我為每種型別宣告一个所有者,然後將其用於我所在的行的型別。
最新回復
- 5月前1 #
- 5月前2 #
另一个例子。
公共類CardArrayAdapter擴充套件了ArrayAdapter {
public CardArrayAdapter(Context context) { super(context, R.layout.adapter_card); } @Override public View getView(int position, View view, ViewGroup parent) { final Card card = getItem(position); ViewHolder holder; //if (view != null) { //holder = (ViewHolder) view.getTag(); //} else { Log.d("card.important?", card.name + " = " + Boolean.toString(card.important)); if(card.important) { view = LayoutInflater.from(getContext()).inflate(R.layout.adapter_card_important, parent, false); }else { view = LayoutInflater.from(getContext()).inflate(R.layout.adapter_card, parent, false); } holder = new ViewHolder(view); view.setTag(holder); //} // IMG Picasso.with(getContext()) .load(card.logo) .placeholder(R.drawable.ic_phonebook) .error(R.drawable.ic_phonebook) .fit() .centerCrop() .transform(new CircleTransform()) .into(holder.logo); holder.name.setText(card.name); if(card.important) { holder.category.setVisibility(View.VISIBLE); if (card.category.equals("airline")) { card.category = "airlines"; } int id = getContext().getResources().getIdentifier(card.category, "string", getContext().getPackageName()); holder.category.setText(getContext().getResources().getString(id)); }else { holder.category.setVisibility(View.GONE); } holder.tagline.setText(card.tagline); holder.favorite.setChecked(card.favorite); holder.favorite.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { card.favorite = ((CheckBox) v).isChecked(); card.save(); } }); return view; } static class ViewHolder { @InjectView(R.id.logo) ImageView logo; @InjectView(R.id.name) TextView name; @InjectView(R.id.category) TextView category; @InjectView(R.id.tagline) TextView tagline; @InjectView(R.id.favorite) CheckBox favorite; public ViewHolder(View view) { ButterKnife.inject(this, view); } }
}
相似問題
- android巢狀列表视圖androidlistviewnested2021-01-12 00:57
- java:Android:如何在建立列表時禁用列表項javaandroidlistlistview2021-01-11 22:58
- android:ListFragment OnListItemClick没有被呼叫androidlistviewandroidlistview2021-01-11 19:25
- android:如何在ListView中處理多个倒數計時器?androidlistviewcountdownbaseadaptercountdowntimer2021-01-11 08:53
- 帶有複選框和所有可點击的Android ListViewandroidlistviewcheckboxfocus2021-01-09 22:57
ListView具有內建的型別管理系統.在適配器中,您有几種型別的專案,每種都有各自的视圖和佈局.通過重寫getItemViewType以返迴给定位置的資料型別,可以使ListView傳遞该型別資料的正確的convertview.然後,在您的getView方法中只需檢查資料型別並使用switch語句以不同方式處理每種型別。
每个Layout型別都應该有自己的viewholder,以便命名清楚和易於維護.為ViewHolders命名与每種資料型別相關的名稱,以使所有內容保持一致。
尝試將所有內容重叠到一个ViewHolder中是不值得的。
編輯 例子