Android-通过ID或标签在多个ImageView上切换可见/不可见

Android-通过ID或标签在多个ImageView上切换可见/不可见,android,imageview,Android,Imageview,我有四个ImageView,它们在活动开始时设置为不可见(或者更确切地说,在行膨胀时)。我想按下一个按钮,使它们都变得可见(并随后作为onclick操作…)。我有以下摘要代码,但每当我尝试访问除上一个以外的任何其他imageview时,都会不断出错 public class xx { private ImageView up; @Override public View getView(int position, View convertView, Vi

我有四个ImageView,它们在活动开始时设置为不可见(或者更确切地说,在行膨胀时)。我想按下一个按钮,使它们都变得可见(并随后作为onclick操作…)。我有以下摘要代码,但每当我尝试访问除上一个以外的任何其他imageview时,都会不断出错

public class xx {

    private ImageView up;
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Log.i(TAG, "excersizeAdapter getView");
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.row, null);
            }

            Excersize e = items.get(position);
            if (e != null) {
                TextView exTitle      = (TextView) v.findViewById(R.id.ex_type_title);
                TextView exOn         = (TextView) v.findViewById(R.id.ex_on_title);
                TextView exRestAmount = (TextView) v.findViewById(R.id.ex_rest_amount);
                TextView exSequence   = (TextView) v.findViewById(R.id.ex_sequence);

                up                    = (ImageView) v.findViewById(R.id.moveup);
                down                  = (ImageView) v.findViewById(R.id.movedown);

                if (exTitle !=null) {
                    exTitle.setText(e.getTypeTitle());
                }

                if (exOn !=null) {
                    exOn.setText("On: "+e.getTypeOn());
                }

                if (exRestAmount !=null) {
                    exRestAmount.setText(e.getRestAmount().toString());
                }

                if (exSequence !=null) {
                    exSequence.setText(e.getSequence().toString());
                    up.setTag(8881);
                    down.setTag(8882);

                    up.setId(((Integer)e.getSequence()));
                    down.setId(((Integer)e.getSequence()));

                    Log.i(TAG, "up,down values=" +e.getSequence());
                }
            }
            return v;
        }
    }

    public void toggleReorderButtons() {
        up.findViewById(2).setVisibility(View.VISIBLE);
        up.setVisibility(View.VISIBLE);
        up.setOnClickListener(this);
    }
}
好的,这是精简的代码,但在makevisinvis方法中,
up.findview…
会导致崩溃,up.setvis等将只打开添加到我的活动中的最后一个

我也尝试了以下方法,但没有成功

ImageView upper = (ImageView) up.findViewById(2);
upper.setVisibility(View.VISIBLE);
一个可爱的错误转储:

04-21 09:10:55.650: W/dalvikvm(22392): threadid=1: thread exiting with uncaught exception (group=0x4001e578)
04-21 09:10:55.675: E/AndroidRuntime(22392): FATAL EXCEPTION: main
04-21 09:10:55.675: E/AndroidRuntime(22392): java.lang.NullPointerException
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.mediabarltd.digittrainer.ProgramDisplay.toggleReorderButtons(ProgramDisplay.java:437)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.mediabarltd.digittrainer.ProgramDisplay.onClick(ProgramDisplay.java:391)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.view.View.performClick(View.java:2538)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.view.View$PerformClick.run(View.java:9152)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.os.Handler.handleCallback(Handler.java:587)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.os.Looper.loop(Looper.java:130)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at android.app.ActivityThread.main(ActivityThread.java:3691)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at java.lang.reflect.Method.invokeNative(Native Method)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at java.lang.reflect.Method.invoke(Method.java:507)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
04-21 09:10:55.675: E/AndroidRuntime(22392):     at dalvik.system.NativeStart.main(Native Method)

我做了一些认真的观察和彻底的返工。但是

基本上,我遵循了教程,然后实现了中描述的整洁的“技巧”


(我真的很难理解这一点。)

您必须为ImageView提供一个ID,如

android:id="@+id/some_name"
然后发现它是这样的:

up.findViewById(R.id.some_name);
使用以下命令:

int i = (int) up.getTag();
if (i == 8881) {
    //Do something here
}

您将
up
定义为类成员,并在每次调用
getView
时重新初始化它-因此它总是指向创建的最后一个图像视图。此外,我不确定调用
up
findViewById
是否正确:而是在
getView
内设置其
OnClickListener
,并在每次单击时在其所属的布局内查找所需的视图

根据发布的日志,NPE不在“makevisinvis”中发生。你能再核对一下吗?另外,你能发布定义/inits up和down对象的代码吗/对不起,我的examlpe太笨了,我在写的时候更改了方法名。我将更新…我在初始充气过程中已经这样做了“up=(ImageView)v.findViewById(R.id.moveup);”这就是你的意思,还是我需要再次这样做?在我这样做之后,我分配了ID,并且认为我可以使用它来引用它?(我还在上面添加了这一行)然后如何分别引用imageview的每个版本?我想这就是setId的作用所在?在构建行数据的“public View getView”中,我使用数据库中的一个唯一字段,并将其分配给up imageview的Id。这是设置ID唯一,否?使用setTag方法,然后使用getTag方法。@ZazGmy这是我的第一个探索途径,但我找不到如何“使用”getTag。i、 e.up.getTag(8881).setvisible(View.VISIBLE);对我来说不存在?好的,我可以看到它如何作用于我的标记的存在,但是使用这个我如何将我的所有4个up imageview设置为可见?获取每个imageview的标记并使用嵌套条件。我想你已经了解了一些东西。我刚刚做了一些检查,ID总是最后一个设置的ID。它一定是覆盖了其他的..谢谢你的帮助,我现在已经整理好了我的代码,并将我的解决方案包含在我的原始帖子中。