这是我第一次需要使用ArrayAdapter< T>显示多项目行布局。经过不同适配器的大量成功工作后,这个让我发疯。
getView(...,position,...)总是返回0-7 [编辑]所以我从未在我的ArrayList中看到位于> = 7 [/ EDIT]的元素。我知道,这是可见的位置,但是如何在ArrayList中选择正确的对象?
编辑:目前我只从阵列中获得前8个元素,因为位置仅来自0-7 - 即使在50个元素的ArrayList上也是如此。我没有看到在没有“真实”位置的情况下在ArrayList中定位的方法。
文档说出以下内容 - 但我不明白。有人成功实现了ArrayAdapter< T>布局复杂?该文件是什么意思,我应该如何实现它?
如果你想使用更复杂的 布局,也使用构造函数 需要一个字段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>
答案 0 :(得分:2)
我无法添加评论,所以必须回答。正如其他人所指出的,不清楚什么是不起作用的。但是,您只看到0-7位置被夸大,因为这是当前可见的列表中唯一的部分,正如您自己注意到的那样。在向下滚动列表之前,其他行(位置编号较高)不会被充气。
虽然它使用的是BaseAdapter类,而不是您正在使用的ArrayAdapter,但您可以查看ApiDemos示例代码中的List14.java(ApiDemos / src / com / example / android / apis / view / List14.java)原则是一样的。但是,在使用ArrayAdapter时,您不需要覆盖此示例代码所执行的所有方法(只需getView)。