我遇到了一個問題,那就是我的ListView自定義ArrayAdapter(其中包含一個圖庫控件和兩個TextView作爲子控件)未更新圖庫控件及其內容。自定義ArrayAdapter不更新子控件
要設置應用程序的背景,我創建了一個應用程序,允許兩個或更多設備通過藍牙連接到另一個設備,並將每個設備的照片傳輸到其連接的設備。現在,爲了實現,每個設備都以可滾動列表視圖表示,其中包含圖庫窗口小部件(所有設備的圖像以水平方式滾動)和兩個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
我試着換出Gallery
小部件定製HorizontalListView
,但是這給了我完全相同的結果,所以我知道這是不是由於Gallery
部件實現。
更新
我修改我的代碼單獨添加每個圖像的ImageHolderAdapter
。之前,我會創建一個ArrayList
,將所有圖像存儲在其中,然後在ImageHolderAdapter
中創建一個新對象。下面的方法顯示瞭如何將圖像添加「散貨」
public void loadImages(String userName, String deviceAddress, ArrayList imageList) {
mImageHolderAdapterList.add(new ImageHolderClass(this, userName, deviceAddress, imageList));
mImageHolderAdapter.notifyDataSetChanged();
}
現在,我創建了ImageHolderClass
對象我填充imageList
之前。然後我從ImageHolderAdapter
(通過使用mImageHolderAdapter.getItem(position)
)獲取特定對象,從imageList
中獲取add()
到ArrayList
。無論何時我做出任何修改,我都會致電mImageHolderAdapter.notifyDataSetChanged()
。
但是,如果我單獨填充圖像,則不會顯示任何圖像。我所得到的是一個黑色的屏幕,圖像應該是。
,它仍然不能解決問題。 – 2012-04-24 15:06:13