我有一个listview,如果我试图在第4和第5项上设置错误,其中有5个项目。然后它抛出空指针异常。 例外
08-22 13:34:49.523: E/AndroidRuntime(16952): FATAL EXCEPTION: main
08-22 13:34:49.523: E/AndroidRuntime(16952): java.lang.NullPointerException
08-22 13:34:49.523: E/AndroidRuntime(16952): at com.example.iweenflightbookingpage.MainActivity$1.onClick(MainActivity.java:116)
08-22 13:34:49.523: E/AndroidRuntime(16952): at android.view.View.performClick(View.java:4091)
08-22 13:34:49.523: E/AndroidRuntime(16952): at android.view.View$PerformClick.run(View.java:17072)
08-22 13:34:49.523: E/AndroidRuntime(16952): at android.os.Handler.handleCallback(Handler.java:615)
08-22 13:34:49.523: E/AndroidRuntime(16952): at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 13:34:49.523: E/AndroidRuntime(16952): at android.os.Looper.loop(Looper.java:153)
08-22 13:34:49.523: E/AndroidRuntime(16952): at android.app.ActivityThread.main(ActivityThread.java:4987)
08-22 13:34:49.523: E/AndroidRuntime(16952): at java.lang.reflect.Method.invokeNative(Native Method)
08-22 13:34:49.523: E/AndroidRuntime(16952): at java.lang.reflect.Method.invoke(Method.java:511)
08-22 13:34:49.523: E/AndroidRuntime(16952): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
08-22 13:34:49.523: E/AndroidRuntime(16952): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
08-22 13:34:49.523: E/AndroidRuntime(16952): at dalvik.system.NativeStart.main(Native Method)
代码设置错误
click.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
allValues = myAdapter.getAllValues();
ArrayList<Integer> errorList = new ArrayList<Integer>();
for(int i = 0; i < allValues.length; i++){
for(int j=0;j<staticPasengerList.length;j++){
if(allValues[i] == staticPasengerList[j]){
Log.d("Lop Count", ""+allValues[i]+"="+staticPasengerList[j]);
// Add position to errorList
errorList.add(i);
}
}
}
myAdapter.setErrorList(errorList);
myAdapter.notifyDataSetChanged();
}
}
}
BaseAdapter类
class data extends BaseAdapter {
String[] Title;
Activity activity;
public data (MainActivity mainActivity, String[] text) {
Title = text;
activity = mainActivity;
}
public String[] getAllValues() {
return Title;
}
public int getCount() {
// TODO Auto-generated method stub
return Title.length;
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = activity.getLayoutInflater();
View row ;
row = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
TextView title;
title = (TextView) row.findViewById(android.R.id.text1);
title.setText(Title[position]);
return (row);
}
在4和5的情况下发生此异常将是i的值。请帮我解决问题
答案 0 :(得分:2)
您应该考虑getChildAt(4)可能返回null。
你可以在你的适配器方法getView()中setError(),其中position将是4。 。
<强>编辑:强>
class data extends BaseAdapter {
String [] passengersList;
String[] Title;
Activity activity;
public data (MainActivity mainActivity, String[] text, String[] passengersList) {
Title = text;
activity = mainActivity;
this.passengersList = passengersList;
}
public String[] getAllValues() {
return Title;
}
public int getCount() {
// TODO Auto-generated method stub
return Title.length;
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = activity.getLayoutInflater();
View row ;
row = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
TextView title;
title = (TextView) row.findViewById(android.R.id.text1);
if(position == 4){
checkAndSetError(title);
}
title.setText(Title[position]);
return (row);
}
private void checkAndSetError(TextView title, int position){
allValues = this.Title;
Log.d("this is my array", "arr: " + Arrays.toString(allValues));
for(int i=0;i<allValues.length;i++){
if(allValues[position] == this.passengerList[i]){
Log.d("Lop Count", ""+allValues[i]+"="+i);
title.setError("Please change the data");
}
}
}
}
看起来应该是这样的。
答案 1 :(得分:0)
以下内容可以解决您的问题。请阅读评论以获得解释:
class data extends BaseAdapter {
String[] Title;
Activity activity;
ArrayList<Integer> errorPositionList;
public data (MainActivity mainActivity, String[] text) {
Title = text;
activity = mainActivity;
errorPositionList = new ArrayList<Integer>();
}
// Add this method
public void setErrorList(ArrayList<Integer> eList) {
errorPositionList = eList;
}
....
....
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = activity.getLayoutInflater();
View row ;
row = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
TextView title;
title = (TextView) row.findViewById(android.R.id.text1);
if (errorPositionList.contains(position)) {
title.setText(Title[position]);
title.setError("Please change the data");
} else {
title.setText(Title[position]);
}
return (row);
}
}
OnClickListener
现在应该是这样的:
click.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
allValues = myAdapter.getAllValues();
Log.d("this is my array", "arr: " + Arrays.toString(allValues));
// Declare and initiate the ArrayList
ArrayList<Integer> errorList = new ArrayList<Integer>();
for(int i = 0; i < allValues.length; i++){
if(allValues[i] == passengerList[i]){
Log.d("Lop Count", ""+allValues[i]+"="+i);
// Add position to errorList
errorList.add(i);
}
}
myAdapter = new PassengerListView(MainActivity.this, allValues);
listView.setAdapter(myAdapter);
// Use setErrorList(ArrayList<Integer> eList) method from adapter
myAdapter.setErrorList(errorList);
// Update the list
// The if statement inside getView() will set the error message
myAdapter.notifyDataSetChanged();
}
}
<强>更新强>
OP需要实现错误通知。在这种情况下,依赖setError(CharSequence)
将不起作用。
答案 2 :(得分:-1)
ListView
组件没有在位置4上呈现元素。它是一个惰性组件,只呈现屏幕上的内容。因此,不要假设getChildAt
返回非空视图。
告诉您的适配器在第4位显示错误,并通过调用notifyDataSetChanged
让ListView
知道数据集已更改。
notifyDataSetChanged
。getView
方法,以便在呈现有错误的视图时显示错误。