如何使用具有复杂布局的ArrayAdapter <t>?</t>

时间:2011-06-24 18:33:22

标签: android android-arrayadapter

这是我第一次需要使用ArrayAdapter&lt; T&gt;显示多项目行布局。经过不同适配器的大量成功工作后,这个让我发疯。

getView(...,position,...)总是返回0-7 [编辑]所以我从未在我的ArrayList中看到位于&gt; = 7 [/ EDIT]的元素。我知道,这是可见的位置,但是如何在ArrayList中选择正确的对象?

编辑:目前我只从阵列中获得前8个元素,因为位置仅来自0-7 - 即使在50个元素的ArrayList上也是如此。我没有看到在没有“真实”位置的情况下在ArrayList中定位的方法。

文档说出以下内容 - 但我不明白。有人成功实现了ArrayAdapter&lt; T&gt;布局复杂?该文件是什么意思,我应该如何实现它?

  

如果你想使用更复杂的   布局,也使用构造函数   需要一个字段ID。该字段ID应该   引用较大的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;
  }
}

这是Row-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 个答案:

答案 0 :(得分:2)

我无法添加评论,所以必须回答。正如其他人所指出的,不清楚什么是不起作用的。但是,您只看到0-7位置被夸大,因为这是当前可见的列表中唯一的部分,正如您自己注意到的那样。在向下滚动列表之前,其他行(位置编号较高)不会被充气。

虽然它使用的是BaseAdapter类,而不是您正在使用的ArrayAdapter,但您可以查看ApiDemos示例代码中的List14.java(ApiDemos / src / com / example / android / apis / view / List14.java)原则是一样的。但是,在使用ArrayAdapter时,您不需要覆盖此示例代码所执行的所有方法(只需getView)。