首頁>Program>source

我有一个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 #

    ListView具有內建的型別管理系統.在適配器中,您有几種型別的專案,每種都有各自的视圖和佈局.通過重寫getItemViewType以返迴给定位置的資料型別,可以使ListView傳遞该型別資料的正確的convertview.然後,在您的getView方法中只需檢查資料型別並使用switch語句以不同方式處理每種型別。

    每个Layout型別都應该有自己的viewholder,以便命名清楚和易於維護.為ViewHolders命名与每種資料型別相關的名稱,以使所有內容保持一致。

    尝試將所有內容重叠到一个ViewHolder中是不值得的。

    編輯 例子

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        int viewType = this.getItemViewType(position);
        switch(viewType)
        {
           case TYPE1:
            Type1Holder holder1; 
             View v = convertView; 
             if (v == null) { 
                 LayoutInflater vi = (LayoutInflater)getContext().getSystemService     (Context.LAYOUT_INFLATER_SERVICE); 
                 v = vi.inflate(R.layout.layout_mylistlist_item_type_1, parent, false); 
                 holder1 = new Type1Holder (); 
                 holder1.text = (TextView) v.findViewById(R.id.mylist_itemname); 
                 v.setTag(holder1); 
             } 
             else { 
                 holder1 = (Type1Holder)v.getTag(); 
             } 
             MyListItem myItem = m_items.get(position); 
             // set up the list item 
             if (myItem != null) { 
                 // set item text 
                 if (holder1.text != null) { 
                     holder1.text.setText(myItem.getItemName()); 
                 } 
             } 
             // return the created view 
             return v; 
    
         case TYPE2:
                Type2Holder holder2; 
             View v = convertView; 
             if (v == null) { 
                 LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
                 v = vi.inflate(R.layout.layout_mylistlist_item_type_2, parent, false); 
                 holder2 = new Type2Holder (); 
                 holder2.text = (TextView) v.findViewById(R.id.mylist_itemname); 
                 holder2.icon = (ImageView) v.findViewById(R.id.mylist_itemicon); 
                 v.setTag(holder1); 
             } 
             else { 
                 holder2 = (Type2Holder)v.getTag(); 
             } 
             MyListItem myItem = m_items.get(position); 
             // set up the list item 
             if (myItem != null) { 
                 // set item text 
                 if (holder2.text != null) { 
                     holder2.text.setText(myItem.getItemName()); 
                 } 
                 if(holder2.icon != null)
                     holder2.icon.setDrawable(R.drawable.icon1);
             } 
    
             // return the created view 
             return v; 
    
           default:
               //Throw exception, unknown data type
        }
    }
    

  • 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);
        }
    }
    

    }

  • installation:在Linux中註册檔案擴充套件名/ MIME型別
  • iphone:如何自定義iOS警報视圖?