2012-04-20 84 views
1

我遇到了一個問題,那就是我的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()

但是,如果我單獨填充圖像,則不會顯示任何圖像。我所得到的是一個黑色的屏幕,圖像應該是。

回答

1

您應該在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)); 
+0

,它仍然不能解決問題。 – 2012-04-24 15:06:13