3

如果我试图在第 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 的值的情况下发生此异常。请帮我解决问题

4

3 回答 3

2

您应该考虑 getChildAt(4) 可能会返回 null 。

您可以在适配器的方法 getView() 中 setError() ,其中位置将为 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");
          }
        }
    }
}

它应该看起来像这样。

于 2013-08-22T08:22:09.230 回答
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)将不起作用。

于 2013-08-27T01:37:54.780 回答
-1

ListView组件没有在位置 4 渲染元素。它是一个惰性组件,仅渲染屏幕上的内容。所以不要假设getChildAt返回一个非空视图。

告诉您的适配器在位置 4 显示错误,并ListView通过调用notifyDataSetChanged.

  1. 使用位置列表扩展您的适配器,在哪里显示错误。
  2. 单击时,将位置添加到该列表。
  3. notifyDataSetChanged从适配器调用。
  4. 如果渲染有错误的视图,则更改getView方法以显示错误。
于 2013-08-22T08:11:20.450 回答