ListView的getItemViewType的)复杂的例子( [英] Complex example of ListView getItemViewType()

查看:113
本文介绍了ListView的getItemViewType的)复杂的例子(的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个的ListView 这是复杂的,有4种观点,例如可能出现的情况 {书,电影,音乐CD,演唱会}

目前,来决定什么对象上膨胀等,我得到的涉及该列表的行的项目。然后,我会做一个开关()的对象的类型字段。

这给我留下了很多code和繁重的 getView()

我是正确的说, getItemViewType()用于返回正确的视图类型当前项目?

我会在哪里找到的一个例子 ListAdapter 使用这种方法?注:这是在试图理顺我的的ListView ,现在是相当缓慢的。

感谢

编辑:我的适配器

 公共类MyListAdapter扩展了BaseAdapter实现ListAdapter {

    私人上下文CTX;
    私人诠释layoutResourceId;
    私人的ArrayList<的ItemType>项目;

    公共MyListAdapter(上下文的背景下,ArrayList的<的ItemType>数据){

        this.layoutResourceId = R.layout.timeline_item_row;
        this.ctx =背景;
        this.setitems(数据);
    }

    @覆盖
    公共查看getView(INT位置,查看convertView,ViewGroup中父){

        查看排= convertView;
        TimelineHolder支架=无效;
        交易的ItemType = getitems()得到(位置)。

        如果(行== NULL){

            LayoutInflater充气=((活动)CTX).getLayoutInflater();
            行= inflater.inflate(layoutResourceId,父母,假);

            持有人=新TimelineHolder();
            holder.imgActivityIcon =(ImageView的)row.findViewById(R.id.imgActivityImageIcon);
            holder.imgActivityLabel =(ImageView的)row.findViewById(R.id.imgActivityImageLabel);
            holder.lblMerchantName =(TextView中)row.findViewById(R.id.lblMerchantName);
            holder.lblLocation =(TextView中)row.findViewById(R.id.lblLocation);
            holder.lblActivityType =(TextView中)row.findViewById(R.id.lblActivityType);
            holder.lblActivityLabelUpper =(TextView中)row.findViewById(R.id.lblActivityTypeLabel);
            holder.lblTimeSinceActivity =(TextView中)row.findViewById(R.id.lblTimeSinceActivity);
            holder.lblActivityAmount =(TextView中)row.findViewById(R.id.lblActivityAmount);

            row.setTag(保持器);

        }
        其他 {

            支架=(TimelineHolder)row.getTag();
        }

        //获取/这里填充的共同价值观

        字符串的地址=;

        日期hostTime = Helper.parse8601UTC(transaction.getCurrentHostTime());
        日期TRANSACTIONTIME = Helper.parse8601UTC(transaction.getHostTransactionTime());
        字符串MERCHANTNAME = transaction.getMerchant()的getName()。

        holder.lblMerchantName.setText(MERCHANTNAME);
        holder.lblLocation.setText(地址);
        holder.lblTimeSinceActivity.setText(Helper.timeSince(TRANSACTIONTIME,hostTime));
        holder.lblActivityAmount.setText(Helper.doubleToCurrency(transaction.getAmount(),transaction.getCurrency()));

        开关(transaction.getTransactionTypeId()){

        案例TYPE_ONE:

            holder.imgActivityIcon.setImageResource(R.drawable.redemmedicon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Loyalty_Earned);
            holder.lblActivityLabelUpper.setText(R.string.EARNED);
            holder.lblActivityAmount.setText(transaction.getResponsePoints()+PTS);

            打破;

        案例TYPE_TWO:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string prepay_Redeem_Refund);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);

            打破;

        案例TYPE_THREE:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityLabelUpper.setText(R.string.REFUND);
            holder.lblActivityType.setText(R.string prepay_Purchase_Refund);

            打破;
        案例TYPE_FOUR:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityLabelUpper.setText(R.string.REFUND);
            holder.lblActivityType.setText(R.string prepay_Deposit_Refund);

            打破;

        案例TYPE_FIVE:

            holder.imgActivityIcon.setImageResource(R.drawable.reward_earned_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Reward_Redeemed);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);
            holder.lblActivityAmount.setText();

            打破;

        案例TYPE_SIX:

            holder.imgActivityIcon
                    .setImageResource(R.drawable.reward_earned_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string.Points_Redeemed);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);
            holder.lblActivityAmount.setText(transaction.getResponsePoints()
                    +点);

            打破;

        案例TYPE_SEVEN:

            holder.imgActivityIcon.setImageResource(R.drawable.stamp_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string.Checked_In);
            holder.lblActivityLabelUpper.setText(R.string.CHECK_IN);
            holder.lblActivityAmount.setText();

            打破;

        案例TYPE_EIGHT:

            holder.imgActivityIcon.setImageResource(R.drawable.shared_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string.Shared_Coupon);
            holder.lblActivityLabelUpper.setText(R.string.SHARED);
            holder.lblActivityAmount.setText();

            打破;

        案例TYPE_NINE:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string prepay_Deposit);
            holder.lblActivityLabelUpper.setText(R.string.DEPOSIT);

            打破;

        案例TYPE_TEN:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string prepay_Purchase);
            holder.lblActivityLabelUpper.setText(R.string.PURCHASE);

            打破;

        案例TYPE_ELEVEN:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string prepay_Redeemed);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);

            打破;

        案例TYPE_TWELVE:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Refund);
            holder.lblActivityLabelUpper.setText(R.string.REFUND);
            holder.lblActivityAmount.setText();

            打破;

        案例TYPE_THIRTEEN:

            holder.imgActivityIcon.setImageResource(R.drawable prepay_icon_2x。);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.reversal);
            holder.lblActivityLabelUpper.setText(R.string.REVERSAL);
            holder.lblActivityAmount.setText();

            打破;

        案例TYPE_FOURTEEN:

            holder.imgActivityIcon.setImageResource(R.drawable.unlocked_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Check_In_Reward_Unlocked);
            holder.lblActivityLabelUpper.setText(R.string.UNLOCKED);
            holder.lblActivityAmount.setText();

            打破;

        案例TYPE_FIFTEEN:

            holder.imgActivityIcon.setImageResource(R.drawable.reward_earned_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Coupon_Received);
            holder.lblActivityLabelUpper.setText(R.string.RECEIVED);
            holder.lblActivityAmount.setText();

            打破;

        默认:

            holder.imgActivityIcon.setImageResource(R.drawable.stamp_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText();
            holder.lblActivityLabelUpper.setText();
            holder.lblActivityAmount.setText();

            打破;
        }

        返回行;
    }

    @覆盖
    公众诠释getCount将(){

        返回getitems()== NULL? 0:getitems()的大小();
    }

    @覆盖
    公共对象的getItem(INT位置){

        返回getitems()== NULL?空:getitems()得到(
                位置);
    }

    @覆盖
    众长getItemId(INT位置){

        返回layoutResourceId;
    }

    公共无效的addItem(的ItemType项目,布尔addFirst){

        如果(addFirst){

            getitems()加(0项)。
        } 其他 {

            。getitems()加(项目);
        }

        notifyDataSetChanged();
    }

    公众的ArrayList<的ItemType> getitems(){
        返回的项目;
    }

    公共无效setitems(ArrayList中<的ItemType>项目){
        this.items =项目;
    }

    公众诠释getFirstTransactionId(){

        INT结果为0;

        如果(项目= NULL和放大器;!&安培;!items.isEmpty()){

            的ItemType TXN = items.get(0);
            结果= txn.getId();
        }

        返回结果;
    }

    公众诠释getLastTransactionId(){

        INT结果为0;

        如果(项目= NULL和放大器;!&安培;!items.isEmpty()){

            的ItemType TXN = items.get(items.size() -  1);
            结果= txn.getId();
        }

        返回结果;
    }

    @覆盖
    公众诠释getViewTypeCount(){

        返回1;
    }

    @覆盖
    公众诠释getItemViewType(INT位置){

        返回0;
    }
}
 

解决方案

*更新提示**
您还没有实现getViewTypeCount()和getItemViewType()正确。照片

请阅读我在下面的链接提供的教程。我不想再解释它们,我会做它一个更糟糕的工作。但是,阅读下面第一,因为你并不真正需要的,当你只有1视图类型。


选项1 :创建正确的资源图片16不同的行。然后调用getItemViewType(位置)getView()方法中。做一个开关就可以了,和膨胀的基础上它返回的视图类型正确的行。 (教程将解释这一点)。这样,你就不必继续调用setImageResource呼,这是昂贵的。照片

选项2 :根据您的观点持有人,看来你只有1视图,您只需更改3文本字段和2位图。但是每个位图调用是沉重的,你需要创建一个HashMap缓存这些图标。每次通话,参考散列映射,如果该项目不存在,创建它,添加它,然后继续。这很重要,因为每次调用setImageResource()是做一个位图德code和需要时间。 这就是你真正的错误是查看伪code以下。

 私有静态HashMap中<整数,位图>高速缓存;
静态类BitmapCache {
    公共静态位图的get(整数ID){
        如果(cache.containsKey(ID)){
            返回cache.get(ID);
        } 其他 {
            位图T = BitmapFactory.de codeResource(的getContext(),身份证);
            cache.put(键,T);
            返回吨;
        }
    }
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    ViewHolder项目= NULL;
    对象o =的getItem(位置);

    查看MROW = convertView;
    如果(MROW == NULL){
        LayoutInflater李= LayoutInflater.from(的getContext());
        开关(getItemViewType(位置)){
        案例VIEW_ONLINE:
            MROW = li.inflate(R.layout.row_online,父母,假);
            打破;
        默认:
            //默认排序
            MROW = li.inflate(R.layout.row_offline,父母,假);
            打破;
        }

        项目=新ViewHolder(MROW);
        mRow.setTag(项目);
    } 其他 {
        项目=(ViewHolder)mRow.getTag();
    }


    item.icon.setImageBitmap(BitmapCache.get(object.key));

    返回MROW;
}
 

*

*旧复用教程
上有StackOverflow的几个职位已经是我刚刚经历了昨天与此相关的。 (见下文链接)。

  1. 是,使用getItemViewType()来检索正确的视图类型。据我了解,真正的好处是在getView()调用期间的看法优化。实施getItemViewType()允许getView()类型返回正确的缓存的视图。
  2. 使用文本和图像视图的静态视图持有人模式的放大视图中。 你不应该每次充气的观点,你应该重用的getView()调用提供的convertView。
  3. 确保实现getViewTypeCount()

下面是一个教程,深入阐述了如何执行自定义列表视图,包括优化。 <一href="http://www.vogella.com/articles/AndroidListView/article.html">http://www.vogella.com/articles/AndroidListView/article.html

下面是两个计算器的帖子也讨论你正在尝试做的:
1. 的Andr​​oid编程教程 - 教程5
2. 餐厅计划教程

I have a ListView that is complex in that there are possible scenarios for 4 view types e.g. { book, movie, music cd, concert }

Currently, to decide on what object to inflate etc, I get the item that relates to the list row. I will then do a switch() on the type field of the object.

This has left me with a lot of code and heavy lifting in the getView().

Am I correct in saying that getItemViewType() is used to return the correct view type for the current item?

Where would I find an example of a ListAdapter that uses this approach? Note: this is in an attempt to smooth out my ListView that is quite sluggish now.

Thanks

EDIT: My Adapter

public class MyListAdapter extends BaseAdapter implements ListAdapter {

    private Context ctx;
    private int layoutResourceId;
    private ArrayList<ItemType> items;

    public MyListAdapter(Context context, ArrayList<ItemType> data) {

        this.layoutResourceId = R.layout.timeline_item_row;
        this.ctx = context;
        this.setitems(data);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row = convertView;
        TimelineHolder holder = null;
        ItemType transaction = getitems().get(position);

        if (row == null) {

            LayoutInflater inflater = ((Activity) ctx).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new TimelineHolder();
            holder.imgActivityIcon = (ImageView)row.findViewById(R.id.imgActivityImageIcon);
            holder.imgActivityLabel = (ImageView)row.findViewById(R.id.imgActivityImageLabel);
            holder.lblMerchantName = (TextView)row.findViewById(R.id.lblMerchantName);
            holder.lblLocation = (TextView)row.findViewById(R.id.lblLocation);
            holder.lblActivityType = (TextView)row.findViewById(R.id.lblActivityType);
            holder.lblActivityLabelUpper = (TextView)row.findViewById(R.id.lblActivityTypeLabel);
            holder.lblTimeSinceActivity = (TextView)row.findViewById(R.id.lblTimeSinceActivity);
            holder.lblActivityAmount = (TextView)row.findViewById(R.id.lblActivityAmount);

            row.setTag(holder);

        }
        else {

            holder = (TimelineHolder) row.getTag();
        }

        // Get/Populate common values here

        String address = "";

        Date hostTime = Helper.parse8601UTC(transaction.getCurrentHostTime());
        Date transactionTime = Helper.parse8601UTC(transaction.getHostTransactionTime());
        String merchantName = transaction.getMerchant().getName();

        holder.lblMerchantName.setText(merchantName);
        holder.lblLocation.setText(address);
        holder.lblTimeSinceActivity.setText(Helper.timeSince(transactionTime, hostTime));
        holder.lblActivityAmount.setText(Helper.doubleToCurrency(transaction.getAmount(), transaction.getCurrency()));

        switch (transaction.getTransactionTypeId()) {

        case TYPE_ONE:

            holder.imgActivityIcon.setImageResource(R.drawable.redemmedicon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Loyalty_Earned);
            holder.lblActivityLabelUpper.setText(R.string.EARNED);
            holder.lblActivityAmount.setText(transaction.getResponsePoints() + " pts");

            break;

        case TYPE_TWO:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Prepay_Redeem_Refund);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);

            break;

        case TYPE_THREE:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityLabelUpper.setText(R.string.REFUND);
            holder.lblActivityType.setText(R.string.Prepay_Purchase_Refund);

            break;
        case TYPE_FOUR:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityLabelUpper.setText(R.string.REFUND);
            holder.lblActivityType.setText(R.string.Prepay_Deposit_Refund);

            break;

        case TYPE_FIVE:

            holder.imgActivityIcon.setImageResource(R.drawable.reward_earned_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Reward_Redeemed);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);
            holder.lblActivityAmount.setText("");

            break;

        case TYPE_SIX:

            holder.imgActivityIcon
                    .setImageResource(R.drawable.reward_earned_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string.Points_Redeemed);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);
            holder.lblActivityAmount.setText(transaction.getResponsePoints()
                    + " pts");

            break;

        case TYPE_SEVEN:

            holder.imgActivityIcon.setImageResource(R.drawable.stamp_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string.Checked_In);
            holder.lblActivityLabelUpper.setText(R.string.CHECK_IN);
            holder.lblActivityAmount.setText("");

            break;

        case TYPE_EIGHT:

            holder.imgActivityIcon.setImageResource(R.drawable.shared_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string.Shared_Coupon);
            holder.lblActivityLabelUpper.setText(R.string.SHARED);
            holder.lblActivityAmount.setText("");

            break;

        case TYPE_NINE:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Prepay_Deposit);
            holder.lblActivityLabelUpper.setText(R.string.DEPOSIT);

            break;

        case TYPE_TEN:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.redeemed_flag);
            holder.lblActivityType.setText(R.string.Prepay_Purchase);
            holder.lblActivityLabelUpper.setText(R.string.PURCHASE);

            break;

        case TYPE_ELEVEN:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Prepay_Redeemed);
            holder.lblActivityLabelUpper.setText(R.string.REDEEMED);

            break;

        case TYPE_TWELVE:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Refund);
            holder.lblActivityLabelUpper.setText(R.string.REFUND);
            holder.lblActivityAmount.setText("");

            break;

        case TYPE_THIRTEEN:

            holder.imgActivityIcon.setImageResource(R.drawable.prepay_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.reversal);
            holder.lblActivityLabelUpper.setText(R.string.REVERSAL);
            holder.lblActivityAmount.setText("");

            break;

        case TYPE_FOURTEEN:

            holder.imgActivityIcon.setImageResource(R.drawable.unlocked_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Check_In_Reward_Unlocked);
            holder.lblActivityLabelUpper.setText(R.string.UNLOCKED);
            holder.lblActivityAmount.setText("");

            break;

        case TYPE_FIFTEEN:

            holder.imgActivityIcon.setImageResource(R.drawable.reward_earned_icon_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText(R.string.Coupon_Received);
            holder.lblActivityLabelUpper.setText(R.string.RECEIVED);
            holder.lblActivityAmount.setText("");

            break;

        default:

            holder.imgActivityIcon.setImageResource(R.drawable.stamp_2x);
            holder.imgActivityLabel.setImageResource(R.drawable.earned_flag);
            holder.lblActivityType.setText("");
            holder.lblActivityLabelUpper.setText("");
            holder.lblActivityAmount.setText("");

            break;
        }

        return row;
    }

    @Override
    public int getCount() {

        return getitems() == null ? 0 : getitems().size();
    }

    @Override
    public Object getItem(int position) {

        return getitems() == null ? null : getitems().get(
                position);
    }

    @Override
    public long getItemId(int position) {

        return layoutResourceId;
    }

    public void addItem(ItemType item, boolean addFirst) {

        if (addFirst) {

            getitems().add(0, item);
        } else {

            getitems().add(item);
        }

        notifyDataSetChanged();
    }

    public ArrayList<ItemType> getitems() {
        return items;
    }

    public void setitems(ArrayList<ItemType> items) {
        this.items = items;
    }

    public int getFirstTransactionId() {

        int result = 0;

        if (items != null && !items.isEmpty()) {

            ItemType txn = items.get(0);
            result = txn.getId();
        }

        return result;
    }

    public int getLastTransactionId() {

        int result = 0;

        if (items != null && !items.isEmpty()) {

            ItemType txn = items.get(items.size() - 1);
            result = txn.getId();
        }

        return result;
    }

    @Override
    public int getViewTypeCount() {

        return 1;
    }

    @Override
    public int getItemViewType(int position) {

        return 0;
    }
}

解决方案

* Updated hints **
You aren't implementing getViewTypeCount() and getItemViewType() correctly.

Read the tutorial I provided in links below. I don't want to re-explain them as I'll do a worse job of it. But read below first, because you don't really need that as you only have 1 view type.


Option 1: Create 16-different rows with the correct resource image. Then call getItemViewType(position) inside the getView() method. Do a switch on it, and inflate the correct row based on the view type it returns. (Tutorial will explain this). That way you don't have to keep calling the "setImageResource" call, which is expensive.

Option 2: Based on your view holder, it appears that you only have 1 view and you are simply changing 3 text fields and 2 bitmaps. But each bitmap call is heavy, you need to create a HashMap to cache those icons. With each call, reference the hash map, if the item doesn't exist, create it, add it, and proceed. This is important because each call to setImageResource() is doing a bitmap decode and will take time. That is where you real error is See pseudo code below.

private static HashMap<Integer, Bitmap> cache;
static class BitmapCache {
    public static Bitmap get(Integer id) {
        if (cache.containsKey(id)) {
            return cache.get(id);
        } else {
            Bitmap t = BitmapFactory.decodeResource(getContext(), id);
            cache.put(key, t);
            return t;
        }
    }
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder item = null;
    Object o = getItem(position);

    View mRow = convertView;
    if (mRow == null) {
        LayoutInflater li = LayoutInflater.from(getContext());
        switch (getItemViewType(position)) {
        case VIEW_ONLINE:
            mRow = li.inflate(R.layout.row_online, parent, false);
            break;
        default:
            // default to sortable
            mRow = li.inflate(R.layout.row_offline, parent, false);
            break;
        }

        item = new ViewHolder(mRow);
        mRow.setTag(item);
    } else {
        item = (ViewHolder) mRow.getTag();
    }


    item.icon.setImageBitmap(BitmapCache.get(object.key));

    return mRow;
}

* Old answer with tutorials *
There are several posts on StackOverflow already that I just went through yesterday related to this. (See links below).

  1. Yes, use getItemViewType() to retrieve the correct view type. As I understand it, the real benefit here is in the view optimization during the getView() call. Implementing getItemViewType() allows the getView() type to return the correct cached view.
  2. Use the static view holder pattern for text and image views inside your inflated view. You shouldn't be inflating the view every time, you should be reusing the convertView provided by the getView() call.
  3. Be sure to implement getViewTypeCount()

Here is a tutorial that explains in depth how to perform custom list views including optimizations. http://www.vogella.com/articles/AndroidListView/article.html

Here are two stackoverflow posts which also discuss what you are trying to do:
1. Android Programming tutorials - Tutorial 5
2. Restaurant Program Tutorial

这篇关于ListView的getItemViewType的)复杂的例子(的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆