Как использовать ArrayAdapter <T>со сложным макетом? - PullRequest
0 голосов
/ 24 июня 2011

Это первый раз, когда мне нужно использовать ArrayAdapter , чтобы показать раскладку из нескольких элементов. После большого количества успешной работы с различными адаптерами этот сводит меня с ума.

getView (..., position, ...) всегда возвращает 0-7 [EDIT], поэтому я никогда не вижу в моем ArrayList элементы, которые находятся в позиции> = 7 [/ EDIT]. Я знаю, это видимая позиция, но как мне выбрать правильный объект в ArrayList?

РЕДАКТИРОВАТЬ: В настоящее время я получаю только первые 8 элементов из моего массива, потому что позиция приходит только от 0-7 - даже для 50-элементного ArrayList. Я не вижу способа позиционирования в ArrayList без «реальной» позиции.

Документы говорят следующее - но я не понимаю. Кто-нибудь успешно реализовал ArrayAdapter со сложной компоновкой? Что означает документ и как его реализовать?

Если вы хотите использовать более сложный макет, используйте конструкторы, которые также принимает идентификатор поля Идентификатор этого поля должен ссылаться на TextView в более широком макет ресурса. Однако TextView ссылка, она будет заполнена toString () каждого объекта в массив. Вы можете добавить списки или массивы нестандартные объекты. Переопределить Метод toString () ваших объектов для определить, какой текст будет отображаться для элемента в списке. Использовать что-то кроме TextViews для отображение массива, например, ImageViews, или иметь некоторые данные кроме того toString () результаты заполняют представления, переопределить getView (int, View, ViewGroup), чтобы вернуть тип представления ты хочешь.

Большое спасибо заранее

hjw

Вот код на данный момент:

public class HappyAdapter extends ArrayAdapter<Happy> {

  static class ViewHolder {
    private ImageView imageView;
    private TextView  textViewBottom;
    private TextView  textViewTop;
  }

  private ArrayList<Happy> arrayListHappy;
  private DrawableCache    drawableCache = DrawableCache.getInstance();
  private int              layout;

  @Override
  public int getCount() {
    return arrayListHappy.size();
  }

  @Override
  public View getView(int position, View contentView, ViewGroup viewGroup) {
    // position always 0-7

    View       view = null;
    ViewHolder viewHolder = null;

    if (contentView == null) {
      LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      view = layoutInflater.inflate(layout, null);

      if (view != null) {
        viewHolder = new ViewHolder();
        viewHolder.imageView = (ImageView) view.findViewById(R.id.happyactivity_row_image_left);
        viewHolder.textViewBottom = (TextView) view.findViewById(R.id.happyactivity_row_text_bottom);
        viewHolder.textViewTop = (TextView) view.findViewById(R.id.happyactivity_row_text_top);
        view.setTag(viewHolder);
      }
    } else {
      view = contentView;
      viewHolder = (ViewHolder) contentView.getTag();
    }

    if (viewHolder != null) {
      Happy happy = arrayListHappy.get(position);
      if (happy != null) {
        viewHolder.imageView.setUrl(happy.getImageThumbnail());
        drawableCache.fetchDrawable(happy.getImageThumbnail(), viewHolder.imageView);
        viewHolder.textViewBottom.setText(String.valueOf(position));
        viewHolder.textViewTop.setText(String.valueOf(viewHolder.position));
      }
    }

    return view;
  }

  public HappyAdapter(Context context, int layout, ArrayList<Happy> arrayListHappy) {
    super(context, layout, arrayListHappy);

    this.arrayListHappy = arrayListHappy;
    this.layout = layout;
  }
}

Это часть макета строки:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent"
  android:orientation="horizontal" >

  <ImageView
    android:id="@+id/happyactivity_row_image_left"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:layout_width="fill_parent" />

  <TextView
    style="@style/TextViewStandard"
    android:id="@+id/happyactivity_row_text_top"
    android:layout_weight="1" />

  <TextView
    style="@style/TextViewStandard"
    android:id="@+id/happyactivity_row_text_bottom"
    android:layout_weight="1" />
  </LinearLayout>
</LinearLayout>

1 Ответ

2 голосов
/ 24 июня 2011

Я пока не могу добавлять комментарии, поэтому должен ответить. Как отметили другие, не совсем понятно, что не работает. Тем не менее, вы видите, как раздуваются только позиции 0-7, поскольку это единственная часть списка, которая в настоящее время видна, как вы сами отметили. Другие строки (с более высокими номерами позиций) не будут завышены, пока вы не прокрутите список вниз.

Хотя он использует класс BaseAdapter, а не ArrayAdapter, который вы используете, вы можете посмотреть List14.java в примере кода ApiDemos (ApiDemos / src / com / example / android / apis / view / List14.java) как принцип тот же. Однако при использовании ArrayAdapter вам не нужно переопределять все методы, которые выполняет этот пример кода (просто getView).

...