[問題] AlertDialog裡加入有Checkbox的Listview

看板AndroidDev作者 (somebody)時間12年前 (2013/08/20 05:05), 編輯推噓4(407)
留言11則, 3人參與, 最新討論串1/2 (看更多)
如標題 我想在要我的MainActivity中按下一個按鈕跳出AlertDialog 讓使用者有一個List可以選擇自己想要的選項 並且有checkbox可以複選 等到按下確認鍵後再把這些選項存起來 看起來應該是要自己寫一個Adapter 但是我試了好久 老是在listview.setAdapter(adapter)出錯 //listview是我ListView物件 adapter是我自己寫的Adapter 因為我把這行註解起來後程式是可以執行的@@ 我的想法是: MyAdapter adapter = new MyAdapter(String[] items, MainActivity.this); 先宣告一個自己寫的adapter MyAdapter的Constructor: MyAdapter(String[] name, Context context){ /* 把給定的項目存到一個list裏 initialize checkbox的狀態 */ inflater = LayoutInflater.from(context); } 而getview則是這樣: public View getView(int position, View convertView, ViewGroup parent) { View view=null; ViewHolder holder = null; if (map.get(position) == null) { //map是一個用來存位置和view的HashMap view = inflater.inflate(R.layout.item, null); holder = new ViewHolder(); holder.selected = (CheckBox)view.findViewById(R.id.item_cb); holder.name = (TextView)view.findViewById(R.id.item_tv); final int p = position; map.put(position, view); holder.selected.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CheckBox cb = (CheckBox)v; mChecked.set(p, cb.isChecked()); //mChecked為項目是否被選取的list } }); view.setTag(holder); }else{ view = map.get(position); holder = (ViewHolder)view.getTag(); } holder.selected.setChecked(mChecked.get(position)); holder.name.setText(list.get(position)); return view; } 在MainActivity中有這幾行: ListView lv = (ListView)findViewById(R.id.list); adapter = new MyAdapter(items, MainActivity.this); lv.setAdapter(adapter); new AlertDialog.Builder(Gps_test.this) .setTitle("CheckBoxtest") .setView(lv) .setPositiveButton(...){...} .setNegativeButton(...){...} .show(); 標記起來的地方是我覺得可能有錯的地方 已經卡一兩天了 煩請各位幫忙@@ 這段code是從網路上找到的 有自己修改一點 如果有哪裡描述不夠清楚我會再補上!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.164.149.193

08/20 09:45, , 1F
感覺是 findViewById 的問題, 要用 view.findViewById
08/20 09:45, 1F

08/20 09:46, , 2F
08/20 09:46, 2F

08/20 12:00, , 3F
出錯的log貼出來看看
08/20 12:00, 3F
s大指的是ListView lv = (ListView)findViewById(R.id.list); 要改成ListView lv = (ListView)lv.findViewById(R.id.list); 嗎? 我試過了還是一樣@@ m大指的log是這個嗎? 08-20 13:25:52.868: D/AndroidRuntime(2061): Shutting down VM 08-20 13:25:52.868: W/dalvikvm(2061): threadid=1: thread exiting with uncaught exception (group=0x400259f8) 08-20 13:25:52.868: E/AndroidRuntime(2061): FATAL EXCEPTION: main 08-20 13:25:52.868: E/AndroidRuntime(2061): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.project/com.example.project.MainActivity}: java.lang.NullPointerException 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.app.ActivityThread.access$2300(ActivityThread.java:135) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.os.Handler.dispatchMessage(Handler.java:99) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.os.Looper.loop(Looper.java:144) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.app.ActivityThread.main(ActivityThread.java:4937) 08-20 13:25:52.868: E/AndroidRuntime(2061): at java.lang.reflect.Method.invokeNative(Native Method) 08-20 13:25:52.868: E/AndroidRuntime(2061): at java.lang.reflect.Method.invoke(Method.java:521) 08-20 13:25:52.868: E/AndroidRuntime(2061): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 08-20 13:25:52.868: E/AndroidRuntime(2061): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 08-20 13:25:52.868: E/AndroidRuntime(2061): at dalvik.system.NativeStart.main(Native Method) 08-20 13:25:52.868: E/AndroidRuntime(2061): Caused by: java.lang.NullPointerException 08-20 13:25:52.868: E/AndroidRuntime(2061): at com.example.project.MainActivity.showCheckBoxListView(MainActivity.java:253) 08-20 13:25:52.868: E/AndroidRuntime(2061): at com.example.project.MainActivity.onCreate(MainActivity.java:103) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 08-20 13:25:52.868: E/AndroidRuntime(2061): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 08-20 13:25:52.868: E/AndroidRuntime(2061): ... 11 more 這是我用eclipse跑完後再logcat找到的 ※ 編輯: whow 來自: 218.164.149.193 (08/20 13:35)

08/20 13:39, , 4F
看一下253行是啥 噴出NullPointerException通常是
08/20 13:39, 4F

08/20 13:40, , 5F
元件沒有初始化
08/20 13:40, 5F

08/20 13:51, , 6F
lv = (ListView)lv.findViewById(R.id.friends_list);
08/20 13:51, 6F

08/20 13:52, , 7F
我覺得這樣應該有給lv初值了吧..
08/20 13:52, 7F

08/20 14:04, , 8F
lv = (ListView)findViewById(R.id.friends_list);
08/20 14:04, 8F

08/20 14:04, , 9F
試看看
08/20 14:04, 9F

08/20 15:57, , 10F
不行耶 我覺得問題應該是出在MyAdapter..
08/20 15:57, 10F

08/20 17:36, , 11F
把你整份code丟上來吧 不然不知道要猜到甚麼時候
08/20 17:36, 11F
文章代碼(AID): #1I4eYdeM (AndroidDev)
文章代碼(AID): #1I4eYdeM (AndroidDev)