ListView空指针解决方案
问题描述:
1.明明点击的是第二条数据,结果显示你点击的是第三条!?
2.明明手动测试完全OK,结果monkey(可恶的猴子 - -!!!)测试各种空指针?
如图:
究竟是虾米原因呢??!
解答
ListView添加头布局导致。listView.addHeadView(mHeadView);
listView添加每头布局后,会将期视为一个条目,加入自己。
listView添加每头布局后,会将期视为一个条目,加入自己。
listView添加每头布局后,会将期视为一个条目,加入自己。
重要的事情说三遍。~~ -_ - ~~
代码:
private void initView() {
mListView = (ListView) findViewById(R.id.activity_listview);
nums = 3;
for (int i = 0; i < nums; i++) {
TextView headView = new TextView(this);
headView.setGravity(Gravity.CENTER);
headView.setText("我是头布局" + i);
mListView.addHeaderView(headView);
}
}
加入三个头布局。
解决方案:
一.直接通过AdapterView获取数据,并跳转(推荐)
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String dataStr = (String) parent.getItemAtPosition(position);
Intent intent = new Intent(this, TextDetail.class);
intent.putExtra("test", dataStr);
startActivity(intent);
}这个方案最佳。
需要复写实现所用Adapter的getItem(postion)方法。
@Override
public T getItem(int position) {
if(dataList == null || dataList.isEmpty()) return null;
if(dataList instanceof List){
return ((List<T>) dataList).get(position);
}
if(dataList instanceof Set){
return new ArrayList<T>(dataList).get(position);
}
return null;
}
第二种方案:对数据集进行处理。
需要依据加入头布局的个数,进行处理。
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mDatas != null && position >= nums) {
System.out.println("position = " + position);
position -= nums;
String dataStr = mDatas.get(position);
Intent intent = new Intent(this, TextDetail.class);
intent.putExtra("test", dataStr);
startActivity(intent);
}
}