Intereting Posts
Кнопка «Радио» в режиме просмотра списка Android – В чем разница между getArguments и Bundle, полученными в onCreate Анонимный прослушиватель запроса на волейбол, вызывающий утечку памяти Android Matrix multiplyMM подробно API Android Google Maps v2 – Интерактивный InfoWindow (как в оригинальных картах Google Android) Вызов метода делегата в Java Загружать видео для анализа сервера на Android Настройка стиля базовых TextViews в style.xml Поддерживает ли Acer Iconia Tab A500 режим аксессуаров? Ожидание до тех пор, пока местоположение не будет включено после включения службы предупреждения о местоположении JavaScript не работает в Android Webview? Как использовать диалоговое окно построителя предупреждений для отображения сообщения Ошибка фрагмента: несовместимые типы, требуемый android.app.fragment, но найденный activity.messagefragment Ksoap2 org.xmlpull.v1.xmlpullparserexception Ожидаемая ошибка start_tag Остановка служб в удаленных процессах

Сложный пример ListView getItemViewType ()

У меня есть ListView который является сложным в том, что существуют возможные сценарии для 4 типов вида, например { book, movie, music cd, concert }

В настоящее время, чтобы решить, какой объект для раздувания и т. Д., Я получаю элемент, относящийся к строке списка. Затем я сделаю switch() в поле типа объекта.

Это оставило меня с большим количеством кода и тяжелым подъемом в getView() .

Правильно ли я говорю, что getItemViewType() используется для возврата правильного типа вида для текущего элемента?

Где я могу найти пример ListAdapter который использует этот подход? Примечание. Это попытка сгладить мой ListView который сейчас довольно вялый.

благодаря

EDIT: Мой адаптер

 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-разных строк с правильным изображением ресурса. Затем вызовите getItemViewType (position) внутри метода getView (). Включите его и раздуйте правильную строку на основе возвращаемого вида. (Учебник объяснит это). Таким образом, вам не нужно продолжать вызов «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. Используйте шаблон держателя статического зрения для просмотра текста и изображения внутри вашего завышенного представления. Вы не должны раздувать представление каждый раз, вы должны повторно использовать convertView, предоставляемый вызовом getView ().
  3. Обязательно реализуйте getViewTypeCount ()

Вот учебник, в котором подробно объясняется, как выполнять пользовательские списки, включая оптимизацию. http://www.vogella.com/articles/AndroidListView/article.html

Вот два сообщения stackoverflow, которые также обсуждают то, что вы пытаетесь сделать:
1. Учебники по программированию на Android – Учебное пособие 5
2. Учебная программа ресторана