2012-04-20 10 views
1

갤러리 위젯과 두 개의 TextView를 자식으로 가지는 ListView에 대한 내 사용자 지정 ArrayAdapter가 갤러리 위젯과 해당 내용을 업데이트하지 않는 문제가 있습니다.사용자 지정 ArrayAdapter가 자식 위젯을 업데이트하지 않습니다.

응용 프로그램의 배경을 설정하려면 두 개 이상의 장치가 Bluetooth를 통해 서로 연결되고 각 장치의 사진이 연결된 장치로 스트리밍되는 응용 프로그램을 만듭니다. 현재 구현을 위해서 각 장치는 스크롤 가능한 목록보기로 표시됩니다.이 목록에는 갤러리 위젯 (모든 장치의 이미지를 가로로 스크롤 할 수 있음)과 그 아래에 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 변수가 업데이트 될 수 있지만 갤러리의 이미지는 정확히 동일하게 유지되는 것입니다.

나는 방법 (A addItem() 사용) ImageHolderAdapter()에서 add() 방법을 우회 한 다음 다른 이미지가 다른 이미지를 (보여 보이지만 그들 모두를 표시하지 않는, 추가되는 경우에만 notifyDataSetChanged()을 강제로 시도했습니다), 장치 만 연결되고 다른 장치는 연결되지 않은 경우에는 연결되지 않습니다.

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을 : 다음

내 맞춤 ArrayAdapter와는

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

나는 사용자 정의 HorizontalListView으로 Gallery 위젯을 교환 시도했다, 그러나 그것은 나에게 동일한 결과를 준, 그래서 나는 그것이 Gallery 위젯 구현에 기인하지 않았다 알고있다.

업데이트

나는 ImageHolderAdapter에 개별적으로 각각의 이미지를 추가하려면 코드를 수정했습니다. 이전에 ArrayList을 만들고 모든 이미지를 저장 한 다음 ImageHolderAdapter에 새 개체를 만듭니다.아래의 방법은 내가이 imageList를 채우기 전에

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

지금, 나는 ImageHolderClass 객체를 생성 "대량"이미지를 추가하는 방법을 보여줍니다. 그런 다음 ImageHolderAdapter (mImageHolderAdapter.getItem(position)을 사용하여)에서 특정 객체를 가져오고 그 중 을 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

을 무효화하고 여전히 문제가 해결되지 않습니다. –

관련 문제