2016-12-30 11 views
-2

私は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(); 
} 
} 
+0

[OK]を、拡張します'GroupContentActivity.java:98'行にブレークポイントを置き、ヌルオブジェクト上でメソッドを呼び出す方法を観察してください。 – donfuxx

答えて

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(); 
} 
    } 

あなたの第2のフラグメントは次のようになります。 パブリッククラスGroupChatFragmentは、スタックトレースあなたを追加した後のフラグメント{

 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(); 
    } 

}

+0

それでも、同じアダプター呼び出しがヌル・オブジェクト参照を使用していると言います。 – WondrousPiffle

関連する問題