在我调用notifyDataSetChanged后,来自onItemSelected的所有引用都是outofdate。
e.g
gallery.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
onFront1 = (ImageView) view;
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
getView
public View getView(final int position, View convertView,
ViewGroup parent) {
imView = new ImageView(this.myContext);
imView.setLayoutParams(new Gallery.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
imView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
onFront2 = view;
return true; // indicate event was handled
}
});
onFront3 = imView;
return imView;
}
旋转
public void rotateS(View v) {
ImageView iv = onFront;
Bitmap b = ((BitmapDrawable) iv.getDrawable()).getBitmap();
Matrix matrix = new Matrix();
matrix.postRotate(geg);
Bitmap bMapRotate = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
b.getHeight(), matrix, true);
iv.setImageBitmap(bMapRotate);
geg = 90;
Log.d("rorate", "yes");
}
onFront
引用旧的imageView,因此我不能再使用它了。如何再次调用onItemselected?
更详细一点:
我正在使用imageView并在rotateS
函数中使用它。它使用onFront,但用全局变量onFront1 | onFront2 | onFront3
替换它
onFron1允许旋转图像一出现在屏幕上,但在notifydatasetChanged后变得无用。
onFront2不受notifyDataSetChanged的影响,但只有在屏幕录制后才会起作用(prety logical)
onFront3根本不起作用。
我想要实现的目标 - 保持对当前imageview的引用,并在imageview更新后立即更新它。
答案 0 :(得分:0)
最好在onFront
的同一代码区重新分配notifyDataSetChanged
。
如果您在某些情况下无法做到这一点,那么您需要额外的机制来跟踪ListAdapter中的有效负载。
例如,您要标记具有特定颜色的所选项目。 您可以引入ItemData类:
public class ItemData{
public bool IsSelected;
// some other data if you need, maybe link to the image view
}
你ListAdapter应该使用这些对象的List(listData)并实现getItem()方法:
public Object getItem(int i) {
return this.listData.get(i);
}
选择项目时 - 在监听器中调用
((ItemData)parent.getItem(position)).IsSelected = true;
然后,如果您添加上面选择的新项目,您还应该在listData
中添加新项目。以前选择的项目的位置将更改,但关联的ItemData
实例将不会更改。