ListView项目设置错误Android

时间:2013-08-22 08:09:00

标签: android android-listview

我有一个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的值。请帮我解决问题

3 个答案:

答案 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位显示错误,并通过调用notifyDataSetChangedListView知道数据集已更改。

  1. 使用位置列表扩展适配器,显示错误的位置。
  2. 点击后,在该列表中添加位置。
  3. 从适配器调用notifyDataSetChanged
  4. 更改getView方法,以便在呈现有错误的视图时显示错误。