10

ListView4つのビュータイプのシナリオが考えられるという点で複雑です。{ book, movie, music cd, concert }

現在、インフレートするオブジェクトなどを決定するために、リスト行に関連するアイテムを取得しています。次にswitch()、オブジェクトの type フィールドで a を実行します。

これにより、大量のコードと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;
    }
}
4

1 に答える 1

8

*** ヒントを更新しました ****
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, 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;
}

* チュートリアル付きの古い回答 *
StackOverflow には、これに関連して昨日行ったばかりの投稿が既にいくつかあります。(以下のリンクを参照してください)。

  1. はい、getItemViewType() を使用して正しいビュー タイプを取得してください。私が理解しているように、ここでの本当の利点は、getView() 呼び出し中のビューの最適化にあります。getItemViewType() を実装すると、getView() タイプが正しいキャッシュ ビューを返すことができます。
  2. インフレートされたビュー内のテキスト ビューとイメージ ビューには、静的ビュー ホルダー パターンを使用します。毎回ビューを膨らませるべきではありません。getView() 呼び出しによって提供される convertView を再利用する必要があります。
  3. 必ず getViewTypeCount() を実装してください

これは、最適化を含むカスタム リスト ビューを実行する方法を詳細に説明するチュートリアルです。 http://www.vogella.com/articles/AndroidListView/article.html


1. Android プログラミング チュートリアル - チュートリアル 5 2.
レストランプログラム チュートリアル

于 2013-03-07T17:05:22.653 に答える