如何以编程方式调用onItemSelected?

时间:2013-07-31 07:48:29

标签: android

在我调用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更新后立即更新它。

1 个答案:

答案 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实例将不会更改。