갤러리 위젯과 두 개의 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()
으로 전화합니다.
그러나 이미지를 개별적으로 채우는 경우 이미지가 표시되지 않습니다. 내가 얻을 수있는 것은 이미지가 있어야하는 검은 색 화면입니다.
을 무효화하고 여전히 문제가 해결되지 않습니다. –