为什么我不能将空列表放入arrayadapter?

时间:2016-12-30 01:37:17

标签: android list android-arrayadapter

我查看了arrayadapter的文档,构造函数说我可以放弃传入元素,传入一个字符串数组,或者一个List,它必须是一个字符串。

当我传入一个空列表时,当我尝试从另一个活动调用.clear时,它会导致nullpointerexception。

当我传入一个包含值的数组时,它不会调用它,但它会抛出一个错误,因为数组值不支持clear操作。

如何传入没有预定义值的列表并且不会导致错误?我不能使用数组版本,也没有数据(与空列表相同的错误)。

注意:我不关心如何输入值,我只是不希望适配器中的任何字符串如果我可以避免它。

如果重要,这是我如何实现适配器(使用空列表):

public class GroupTasksFragment extends Fragment {

public ArrayAdapter<String> adapter;
private Context context;

public GroupTasksFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_group_tasks, container, false);
    ListView taskListView = (ListView) rootView.findViewById(R.id.tasksList);
    List<String> list = new ArrayList<>(0);
    adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list);
    taskListView.setAdapter(adapter);
    return rootView;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;
}

@Override
public void onDetach() {
    super.onDetach();
}
}

另一个片段是:

public class GroupChatFragment extends Fragment{

public ArrayAdapter<String> adapter;
private Context context;

public GroupChatFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_group_chat, container, false);
    ListView chatListView = (ListView) rootView.findViewById(R.id.chatList);
    List<String> list = new ArrayList<>();
    adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list);
    chatListView.setAdapter(adapter);
    return rootView;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;
}

@Override
public void onDetach() {
    super.onDetach();
}
}

这是抛出异常的适配器。

堆栈追踪:

  

12-29 22:15:45.641 23253-23253 / nuffsaidm8.me.assignme E / AndroidRuntime:FATAL EXCEPTION:main                                                                           过程:nuffsaidm8.me.assignme,PID:23253                                                                           java.lang.NullPointerException:尝试从空对象引用上的字段'android.widget.ArrayAdapter nuffsaidm8.me.assignme.frags.GroupChatFragment.adapter'中读取                                                                               at nuffsaidm8.me.assignme.activities.GroupContentActivity $ 1 $ 1.onResponse(GroupContentActivity.java:98)                                                                               at nuffsaidm8.me.assignme.activities.GroupContentActivity $ 1 $ 1.onResponse(GroupContentActivity.java:68)                                                                               在com.pubnub.api.endpoints.Endpoint $ 1.onResponse(Endpoint.java:194)                                                                               at retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall $ 1 $ 1.run(ExecutorCallAdapterFactory.java:68)                                                                               在android.os.Handler.handleCallback(Handler.java:739)                                                                               在android.os.Handler.dispatchMessage(Handler.java:95)                                                                               在android.os.Looper.loop(Looper.java:148)                                                                               在android.app.ActivityThread.main(ActivityThread.java:5417)                                                                               at java.lang.reflect.Method.invoke(Native Method)                                                                               在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)                                                                               在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

来自这条线:

chatFrag.adapter.clear();

在这堂课中:

public class GroupContentActivity extends AppCompatActivity {

private GroupChatFragment chatFrag;
private GroupTasksFragment taskFrag;
private PubNub connection;
private String groupName;
private String nickName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_group_content);
    FragmentTabHost tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    tabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);

    tabHost.addTab(tabHost.newTabSpec("tasks").setIndicator("Tasks"),
            GroupTasksFragment.class, null);

    tabHost.addTab(tabHost.newTabSpec("chat")
            .setIndicator("Chat"), GroupChatFragment.class, null);

    groupName = getIntent().getStringExtra("groupName");
    nickName = getIntent().getStringExtra("nickName");
    PNConfiguration config = new PNConfiguration();
    config.setPublishKey("pub-c-d8414fbe-6925-4511-9bda-8fa682138fb1");
    config.setSubscribeKey("sub-c-50acdc56-c1a3-11e6-b07a-0619f8945a4f");
    connection = new PubNub(config);

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            chatFrag = (GroupChatFragment) getSupportFragmentManager().findFragmentByTag("chat");
            taskFrag = (GroupTasksFragment) getSupportFragmentManager().findFragmentByTag("tasks");
            connection.history()
                    .channel(groupName)
                    .count(50)
                    .async(new PNCallback<PNHistoryResult>() {
                        @Override
                        public void onResponse(PNHistoryResult result, PNStatus status) {
                            for (PNHistoryItemResult item : result.getMessages()) {
                                String[] sForm = item.getEntry().getAsString().split(">>>>");
                                String m = "";
                                if (sForm.length > 2) {
                                    for (int x = 1; x < sForm.length; x++) {
                                        m += sForm[x];
                                    }
                                } else {
                                    m = sForm[1];
                                }

                                switch (sForm[0]) {
                                    case "chat":
                                        chatFrag.adapter.add(m);
                                        break;
                                    case "addTask":
                                        if (taskFrag.adapter.getPosition(m) < 0) {
                                            taskFrag.adapter.add(m);
                                        }
                                        break;
                                    case "deleteTask":
                                        if (taskFrag.adapter.getPosition(m) >= 0) {
                                            taskFrag.adapter.remove(m);
                                        }
                                        break;
                                    case "groupCreated":
                                        taskFrag.adapter.clear();
                                        chatFrag.adapter.clear();
                                        break;
                                }
                            }
                        }
                    });
            connection.addListener(new SubscribeCallback() {
                @Override
                public void status(PubNub pubnub, PNStatus status) {
                    if (status.getCategory() == PNStatusCategory.PNUnexpectedDisconnectCategory) {
                        Toast.makeText(getApplicationContext(), "You were disconnected!", Toast.LENGTH_SHORT).show();
                    } else if (status.getCategory() == PNStatusCategory.PNConnectedCategory) {
                        if (status.getCategory() == PNStatusCategory.PNConnectedCategory) {
                            pubnub.publish().channel(groupName).message("chat>>>><ADMIN> User '" + nickName + "' Connected").async(new PNCallback<PNPublishResult>() {
                                @Override
                                public void onResponse(PNPublishResult result, PNStatus status) {
                                }
                            });
                        }
                    } else if (status.getCategory() == PNStatusCategory.PNReconnectedCategory) {
                        Toast.makeText(getApplicationContext(), "You were reconnected!", Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void message(PubNub pubnub, PNMessageResult message) {
                    String[] sForm = message.getMessage().getAsString().split(">>>>");
                    String m = "";
                    if (sForm.length > 2) {
                        for (int x = 1; x < sForm.length; x++) {
                            m += sForm[x];
                        }
                    } else {
                        m = sForm[1];
                    }

                    switch (sForm[0]) {
                        case "chat":
                            chatFrag.adapter.add(m);
                            break;
                        case "addTask":
                            taskFrag.adapter.add(m);
                            connection.publish().channel(groupName).message("chat>>>><ADMIN> Task '" + m + "' added.").async(new PNCallback<PNPublishResult>() {
                                @Override
                                public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) {
                                }
                            });
                            break;
                        case "deleteTask":
                            taskFrag.adapter.remove(m);
                            connection.publish().channel(groupName).message("chat>>>><ADMIN> Task '" + m + "' deleted.").async(new PNCallback<PNPublishResult>() {
                                @Override
                                public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) {
                                }
                            });
                            break;
                    }
                }

                @Override
                public void presence(PubNub pubnub, PNPresenceEventResult presence) {
                }
            });
            connection.subscribe().channels(java.util.Collections.singletonList(groupName)).execute();
        }
    }, 100);
}

public void goHome(View v) {
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
}

public void sendMessage(View v) {
    String message = ((EditText) findViewById(R.id.messageToSend)).getText().toString();
    connection.publish().channel(groupName).message("chat>>>><" + nickName + "> " + message).async(new PNCallback<PNPublishResult>() {
        @Override
        public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) {
        }
    });
}

public void deleteTask(View v) {
    final EditText input = new EditText(getApplicationContext());
    input.setTextColor(Color.BLACK);
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT);
    input.setLayoutParams(lp);
    new AlertDialog.Builder(this)
            .setTitle("Delete Task")
            .setMessage("What task would you like to delete?")
            .setView(input)
            .setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (taskFrag.adapter.getPosition(input.getText().toString()) < 0) {
                        connection.publish().channel(groupName).message("deleteTask>>>>" + input.getText().toString()).async(new PNCallback<PNPublishResult>() {
                            @Override
                            public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) {
                            }
                        });
                        dialog.cancel();
                    } else {
                        Toast.makeText(getApplicationContext(), "This task doesn't exist", Toast.LENGTH_SHORT).show();
                        dialog.cancel();
                    }
                }
            })
            .setNegativeButton(R.string.CANCEL, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            })
            .show();
}

public void addTask(View v) {
    final EditText input = new EditText(getApplicationContext());
    input.setTextColor(Color.BLACK);
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT);
    input.setLayoutParams(lp);
    new AlertDialog.Builder(this)
            .setTitle("Create New Task")
            .setView(input)
            .setMessage("What task would you like to create?")
            .setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (taskFrag.adapter.getPosition(input.getText().toString()) >= 0) {
                        connection.publish().channel(groupName).message("addTask>>>>" + input.getText().toString()).async(new PNCallback<PNPublishResult>() {
                            @Override
                            public void onResponse(PNPublishResult pnPublishResult, PNStatus pnStatus) {
                            }
                        });
                        dialog.cancel();
                    } else {
                        Toast.makeText(getApplicationContext(), "This task already exists", Toast.LENGTH_SHORT).show();
                        dialog.cancel();
                    }
                }
            })
            .setNegativeButton(R.string.CANCEL, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            })
            .show();
}
}

1 个答案:

答案 0 :(得分:0)

试试这个: 初始化上面的列表。 你的第一个片段将如下所示:

  public class GroupTasksFragment extends Fragment {
  public ArrayAdapter<String> adapter;
  private Context context;
  List<String> list = new ArrayList<>();

  public GroupTasksFragment() {
  // Required empty public constructor
  }

  @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        }

    @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {
   View rootView = inflater.inflate(R.layout.fragment_group_tasks,          container, false);
      ListView taskListView = (ListView)     rootView.findViewById(R.id.tasksList);

      adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list);
      taskListView.setAdapter(adapter);
      return rootView;
      }

     @Override
     public void onAttach(Context context) {
     super.onAttach(context);
    this.context = context;
    }

   @Override
  public void onDetach() {
  super.onDetach();
 }
  }

你的第二个片段如下所示:          公共类GroupChatFragment扩展了Fragment {

     public ArrayAdapter<String> adapter;
     private Context context;
     List<String> list = new ArrayList<>();

    public GroupChatFragment() {
    // Required empty public constructor
    }

   @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    }

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {
   View rootView = inflater.inflate(R.layout.fragment_group_chat, container, false);
   ListView chatListView = (ListView) rootView.findViewById(R.id.chatList);

   adapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list);
    chatListView.setAdapter(adapter);
    return rootView;
   }

     @Override
    public void onAttach(Context context) {
     super.onAttach(context);
      this.context = context;
       }

    @Override
   public void onDetach() {
   super.onDetach();
    }

}