2014-09-28 48 views
2

後項目點擊我ListViewCustomAdapter,現在可以通過滾動listview我得到nullpointerexception訪問的任何項目的onclick。另外,當我點擊任何適合屏幕尺寸的項目時,然後滾動特定元素也會被選中。如果我選​​擇了第4個位置並且每次顯示8個項目,那麼第12個項目也會被選中。的NullPointerException上onitemclicklistener列表視圖中滾動時

public class SelectCheckPoints extends ListActivity implements OnItemClickListener{ 
String s1[]; 
ListView checkpoints_list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.select_checkpoints); 

    Bundle b = this.getIntent().getExtras(); 
    s1 = b.getStringArray("array_checkpoints"); 
    checkpoints_list=getListView(); 

    checkpoints_list.setAdapter(new ItemAdapter()); 

    checkpoints_list.setOnItemClickListener(this); 
} 



public class ItemAdapter extends BaseAdapter { 

    // private ImageLoadingListener animateFirstListener = new 
    // AnimateFirstDisplayListener(); 

    @Override 
    public int getCount() { 
     return s1.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return s1[position]; 
    } 

    @Override 
    public long getItemId(int position) { 
     Log.d("test id",position+""); 
     return position; 
    } 

    @SuppressLint("InflateParams") 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null){ 
      // LayoutInflater class is used to instantiate layout XML file into its corresponding View objects. 
      LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
      convertView = layoutInflater.inflate(R.layout.checkpoint_listitem, null); 
     } 

     TextView checkpoints_name = (TextView) convertView.findViewById(R.id.checkpoints_name);   
     checkpoints_name.setText(s1[position]); 

     return convertView; 

    } 

} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) { 
    // TODO Auto-generated method stub 

    Log.d("check","in"); 
    View v=checkpoints_list.getChildAt(position); 
    CheckBox chk1=(CheckBox)v.findViewById(R.id.check); 
    TextView title = (TextView) v.findViewById(R.id.checkpoints_name); 
    if(chk1.isChecked()) 
    { 
     chk1.setChecked(false); 
     Log.e("check or not","not"); 
    } 
    else 
    { 
     chk1.setChecked(true); 

     Log.e("check or not","not"); 
    } 
    Log.d("check or not",title.getText().toString()); 
    Log.d("check",position+" "+id); 

} 

}

的logcat:

09-28 15:37:36.445: E/AndroidRuntime(2672): FATAL EXCEPTION: main 
09-28 15:37:36.445: E/AndroidRuntime(2672): java.lang.NullPointerException 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at com.example.shareryde.book_share.SelectCheckPoints.onItemClick(SelectCheckPoints.java:89) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.widget.AbsListView$1.run(AbsListView.java:3423) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.os.Handler.handleCallback(Handler.java:725) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.os.Looper.loop(Looper.java:137) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
09-28 15:37:36.445: E/AndroidRuntime(2672):  at dalvik.system.NativeStart.main(Native Method) 
09-28 15:37:38.125: I/Process(2672): Sending signal. PID: 2672 SIG: 9 
09-28 15:37:38.325: E/Trace(2704): error opening trace file: No such file or directory (2) 
09-28 15:37:38.569: D/(2704): HostConnection::get() New Host Connection established 0xb798d068, tid 2704 
+2

你嘗試過爲:'複選框CHK1 =(複選框)view.findViewById(R.id.check);'? – 2014-09-28 10:05:57

+0

你可以發佈Logcat .. – DCoder 2014-09-28 10:07:20

+0

是的。但它也給我同樣的錯誤 – user3606902 2014-09-28 10:08:09

回答

0

問題很可能是在這裏:

View v = checkpoints_list.getChildAt(position); 

可變位置指定在可見列表視圖項目內的位置。使用方法參數View view或按照說明here

0

試試這個:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) { 

    Log.d("check","in"); 

    CheckBox chk1=(CheckBox)view.findViewById(R.id.check); 
    TextView title = (TextView) view.findViewById(R.id.checkpoints_name); 
    if(chk1.isChecked()) 
    { 
     chk1.setChecked(false); 
     Log.e("check or not","not"); 
    } 
    else 
    { 
     chk1.setChecked(true); 
     Log.e("check or not","not"); 
    } 
    Log.d("check or not",title.getText().toString()); 
    Log.d("check",position+" "+id); 

} 
0

我的回答是爲時已晚,但給的答案,如果能幫助他人。

起初,我試圖通過AdapterView<?> parent參數OnItemClickListener獲取元素。使用提問者的說法View view也是同樣的結果。

我的代碼:

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      ListView lv = (ListView) parent; 
      TextView tv = (TextView) lv.getChildAt(position); //tv gets null 

      Toast.makeText(getActivity(), tv.getText().toString(), Toast.LENGTH_SHORT).show(); //NullPointerException 
     } 
    }); 

而且它的,而不是GET參數使用解決。就像這樣:

//this is my adapter 
    mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_multiple_choice, mListArray); 
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Toast.makeText(getActivity(), mAdapter.getItem(position), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

這的確有助於我:)