私はarrayadapterのドキュメントを見て、コンストラクタは、要素を渡すこと、文字列の配列を渡すこと、または文字列の1つであることが要求されるListを渡すことを禁じています。空のリストをarrayadapterに入れることができないのはなぜですか?
空のリストを渡すと、別のアクティビティから.clearを呼び出そうとするとnullpointerexceptionが発生します。
値を含む配列を渡すと、その値は呼び出されませんが、配列の値に対してクリア操作がサポートされていないため、エラーがスローされます。
事前定義された値を持たないリストを渡してエラーを起こさないようにするにはどうすればよいですか?私は、配列バージョンを使用することはできませんまたはデータ(空リストと同じエラー)。
注:どのように値を入れても構いませんが、私はそれを避けることができれば、アダプタの文字列を必要としません。
それは私が(空のリストで)アダプタを実装していますどのようにここでは、重要な場合:
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:致命的な例外:メイン プロセス: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アンドロイドでretrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall $ 1 $ 1.run(ExecutorCallAdapterFactory.java:68) でcom.pubnub.api.endpoints.Endpoint $ 1.onResponse(Endpoint.java:194) で(GroupContentActivity.java:68) 。 os.Handler.handleCallback(Handler.java:739) (andler.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) android.appにあります。 ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(ネイティブメソッド) at 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();
}
}
[OK]を、拡張します'GroupContentActivity.java:98'行にブレークポイントを置き、ヌルオブジェクト上でメソッドを呼び出す方法を観察してください。 – donfuxx