gpt4 book ai didi

android - 自定义 ArrayAdapter 不更新子部件

转载 作者:行者123 更新时间:2023-11-30 04:14:34 25 4
gpt4 key购买 nike

我遇到一个问题,我的 ListView 的自定义 ArrayAdapter 没有更新 Gallery 小部件及其内容,它有一个 Gallery 小部件和两个 TextView 作为子项。

为了设置应用程序的背景,我正在创建一个应用程序,它允许两个或多个设备通过蓝牙相互连接,并将每个设备的照片流式传输到其连接的设备。现在,仅出于实现的目的,每个设备都在一个可滚动的 ListView 中表示,其中包含图库小部件(该设备的所有图像都可以水平滚动)和它下方的两个 TextView 小部件,用于识别发件人。

ListView 的布局如下:

<LinearLayout ...>
<Gallery .../>
<LinearLayout>
<TextView .../>
<TextView .../>
</LinearLayout>
</LinearLayout>

图片发送和接收没有问题,我已经反复测试过了。

问题似乎出在自定义 ArrayAdapter 的 notifyDataSetChanged() 方法未按预期运行。当我在 ListView 中(在我的主要 Activity 中)创建一个新的 ImageHolderClass 对象时,我这样做如下:mImageHolderAdapter.add(new ImageHolderClass(this, "Me", mBtAdapter.getAddress( ), mLocalImageList));.知道适配器的 add() 方法应该调用 notifyDataSetChanged(),对于创建和添加的第一个对象,它按预期工作。但是当我添加另一个对象或将任何新图像添加到对象的 imageList 时,它们会创建存储在第一个对象中的图像的精确副本。

现在,有趣的是每个 ImageHolderClass 中的两个 TextView 变量都设法更新了,但图库中的图像似乎保持完全相同。

我尝试绕过 ImageHolderAdapter() 中的 add() 方法(使用 addItem())方法,然后仅在添加其他图像时强制执行 notifyDataSetChanged(),这似乎显示其他图像(但不显示所有图像),但仅在连接设备且未连接其他设备时不显示。

我自定义的ArrayAdapter如下:

public class ImageHolderAdapter extends ArrayAdapter<ImageHolderClass>{
private ArrayList<ImageHolderClass> objects;

public ImageHolderAdapter(Context context, int layoutResourceId, ArrayList<ImageHolderClass> objects) {
super(context, layoutResourceId, objects);
this.objects = objects;
}

public static class ViewHolder {
public Gallery gallery;
public TextView deviceName;
public TextView deviceAddress;
public ArrayList imageList;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Assign the view we are converting to a local variable
View v = convertView;
ViewHolder holder;

// first check to see if the view is null. If it is, then we have to inflate it.
if (v == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.imageholder, null);
holder = new ViewHolder();
holder.gallery = (Gallery)v.findViewById(R.id.gallery);
holder.gallery.setAdapter(new ImageAdapter(getContext(), objects.get(position).imageList));
holder.deviceName = (TextView)v.findViewById(R.id.deviceName);
holder.deviceAddress = (TextView)v.findViewById(R.id.deviceAddress);
v.setTag(holder);
} else {
holder = (ViewHolder)v.getTag();
}

final ImageHolderClass imageHolderClass = objects.get(position);

if (imageHolderClass != null) {
holder.gallery = imageHolderClass.getGallery();
holder.deviceName.setText(imageHolderClass.getDeviceName());
holder.deviceAddress.setText(imageHolderClass.getDeviceAddress());
}

return v;
}

public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
private Context mContext;
ArrayList list;

public ImageAdapter(Context c, ArrayList list) {
mContext = c;
this.list = list;
TypedArray attr = mContext.obtainStyledAttributes(R.styleable.TestbedActivity);
mGalleryItemBackground = attr.getResourceId(R.styleable.TestbedActivity_android_galleryItemBackground, 0);
attr.recycle();
}

public int getCount() {
return list.size();
}

public Object getItem(int position) {
return list.get(position);
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);

imageView.setImageBitmap((Bitmap)list.get(position));
imageView.setLayoutParams(new Gallery.LayoutParams(180, 150));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setBackgroundResource(mGalleryItemBackground);

return imageView;
}
}

和上面使用的ImageHolderClass如下:

public class ImageHolderClass {
public Gallery gallery;
public String deviceName;
public String deviceAddress;
public ArrayList imageList;

public ImageHolderClass() {
super();
}

public ImageHolderClass(Context c, String deviceName, String deviceAddress, ArrayList imageList) {
super();
this.gallery = new Gallery(c);
this.deviceName = deviceName;
this.deviceAddress = deviceAddress;
this.imageList = imageList;
}

public Gallery getGallery() {
return gallery;
}

public void setGallery(Gallery gallery) {
this.gallery = gallery;
}

public String getDeviceName() {
return deviceName;
}

public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}

public String getDeviceAddress() {
return deviceAddress;
}

public void setDeviceAddress(String deviceAddress) {
this.deviceAddress = deviceAddress;
}

public void setImageList(ArrayList list) {
this.imageList = list;
}

public ArrayList getImageList() {
return imageList;
}

}

生成的图像(其中两个 ListView 对象具有相同的图像(但不应该))如下图所示: http://i.stack.imgur.com/koL2Q.jpg

我尝试用自定义 Horizo​​ntalListView 替换 Gallery 小部件,但这给了我完全相同的结果,所以我知道这不是因为Gallery 小部件实现。

更新

我修改了我的代码以将每个图像单独添加到 ImageHolderAdapter。之前,我会创建一个 ArrayList,将所有图像存储在其中,然后在 ImageHolderAdapter 中创建一个新对象。下面的方法显示了我将如何“批量”添加图像

public void loadImages(String userName, String deviceAddress, ArrayList imageList) {
mImageHolderAdapterList.add(new ImageHolderClass(this, userName, deviceAddress, imageList));
mImageHolderAdapter.notifyDataSetChanged();
}

现在,我在填充 imageList 之前创建了 ImageHolderClass 对象。然后我从 ImageHolderAdapter 中抓取特定对象(通过使用 mImageHolderAdapter.getItem(position)),从中获取 imageListadd()ArrayList。然后,每当我进行任何修改时,我都会调用 mImageHolderAdapter.notifyDataSetChanged()

但是,如果我单独填充图像,现在不会显示任何图像。我得到的只是一个黑色屏幕,图像应该在该屏幕上。

最佳答案

您应该在 if 语句之外设置图库的适配器。

if (v == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.imageholder, null);
holder = new ViewHolder();
holder.gallery = (Gallery)v.findViewById(R.id.gallery);
holder.deviceName = (TextView)v.findViewById(R.id.deviceName);
holder.deviceAddress = (TextView)v.findViewById(R.id.deviceAddress);
v.setTag(holder);
} else {
holder = (ViewHolder)v.getTag();
}

holder.gallery.setAdapter(new ImageAdapter(getContext(), objects.get(position).imageList));

关于android - 自定义 ArrayAdapter 不更新子部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10246808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com