微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – ListView的复杂示例getItemViewType()

我有一个ListView是复杂的,因为有可能的情况下,4个视图类型,例如{book,movie,music cd,concert}

目前,要确定什么对象膨胀等,我得到与列表行相关的项目.然后我将在对象的type字段上做一个switch().

这给我留下了很多代码,并且在getView()中很重.

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

我在哪里可以找到使用这种方法listadapter的例子?注意:这是为了平滑我现在看起来相当迟钝的ListView.

谢谢

编辑:我的适配器

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

解决方法

***更新提示****
您没有正确实现getViewTypeCount()和getItemViewType().

阅读我在下面的链接中提供的教程.我不想重新解释他们,因为我会做更糟糕的工作.但是请先阅读下面的内容,因为您并不真的需要,因为您只有1个视图类型.

选项1:使用正确的资源映像创建16个不同的行.然后在getView()方法调用getItemViewType(position).对其进行切换,并根据返回的视图类型对正确的行进行充气. (教程将解释这一点).这样你就不用继续调用“setimageResource”调用,这是昂贵的.

选项2:根据您的视图持有者,您似乎只有1个视图,您只需更改3个文本字段和2个位图.但是每个位图调用很重,您需要创建一个HashMap来缓存这些图标.对于每个调用,引用哈希映射,如果该项不存在,创建它,添加它并继续.这很重要,因为每次调用setimageResource()都在进行位图解码,并且需要时间.那就是你真正的错误在下面看到伪代码.

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,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,false);
            break;
        default:
            // default to sortable
            mRow = li.inflate(R.layout.row_offline,false);
            break;
        }

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


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

    return mRow;
}

*教程老回答*
StackOverflow上有几个帖子已经是我昨天刚刚经历的与此相关的帖子. (见下面的链接).

>是的,使用getItemViewType()来检索正确的视图类型.据了解,这里的真正好处是在getView()调用期间进行优化.实现getItemViewType()允许getView()类型返回正确的缓存视图.
>在充气视图中使用静态视图支架图案进行文字和图像视图.
你不应该每次充气,你应该重用由getView()调用提供的convertView.
确保实现getViewTypeCount()

这是一个教程,深入解释如何执行自定义列表视图,包括优化.
http://www.vogella.com/articles/AndroidListView/article.html

这里有两个stackoverflow帖子,它们也讨论你想要做的事情:
Android Programming tutorials – Tutorial 5
Restaurant Program Tutorial

原文地址:https://www.jb51.cc/android/311169.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐