0

アクティビティの開始時 (または行のインフレーション時) に非表示に設定されている 4 つのイメージビューがあります。ボタンを押して、それらをすべて表示したいと思います(その後、onclicksとして操作できます...)。次の要約コードがありますが、最後のイメージビュー以外のイメージビューにアクセスしようとすると常にエラーが発生します。

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);
    }
}

OK、これは短縮されたコードですが、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)

真剣に見て、私がしていたことを完全に作り直す必要がありました。しかし...

基本的に、チュートリアルAndroid ListView and ListActivity に従い、 Android ListView Adapter OnClickListener issueで説明されているきちんとした「トリック」を実装しました。

(私はこれに本当に苦労しています。)

4

3 に答える 3

1

クラスメンバーとして定義upし、呼び出されるたびに再初期化しますgetView。したがって、常に最後に作成された画像ビューを指します。findViewByIdまた、 of :を呼び出すのが正しいかどうかはわかりませんup。代わりにそのOnClickListener内部getViewを設定し、クリックするたびに、それが属するレイアウト内の必要なビューを探します。

于 2012-04-21T09:27:09.037 に答える
1

次のように、ImageView に ID を指定する必要があります。

android:id="@+id/some_name"

次に、次のように見つけます。

up.findViewById(R.id.some_name);
于 2012-04-21T08:17:17.260 に答える
0

これを使って:

int i = (int) up.getTag();
if (i == 8881) {
    //Do something here
}
于 2012-04-21T09:06:44.343 に答える