2016-12-30 6 views
-2

Я посмотрел документацию массива, и конструктор говорит, что я могу либо воздержаться от передачи в элементах, передать массив строк, либо список, который должен быть одним из строк.Почему я не могу поместить пустой список в массив?

Когда я перехожу в пустой список, это вызывает исключение nullpointer при попытке вызвать .clear из другого действия.

Когда я передаю массив со значениями в нем, он не вызывает это, но он выдает ошибку, потому что операция 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 Е/AndroidRuntime: неустранимая: Основной процесс: nuffsaidm8.me.assignme, ПИД: 23253 java.lang.NullPointerException: попытка прочитать из поля 'android.widget.ArrayAdapter nuffsaidm8.me.assignme.frags.GroupChatFragment.adapter' на нулевой ссылке объекта на 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) в retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall $ 1 $ 1.Run (ExecutorCallAdapterFactory.java:68) на андроид. 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 (собственный метод) 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, после того, как добавили StackTrace ваши вопрос более ясен и проще отлаживать: просто поставьте точку останова в этой строке 'GroupContentActivity.java: 98' и наблюдайте, как вы пытаетесь вызвать метод на нулевом объекте. – donfuxx

ответ

0

Try это : Инициализируйте свой список выше. Ваш первый фрагмент будет выглядеть следующим образом:

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 расширяет фрагмент {

 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

Nope. По-прежнему говорит, что один и тот же вызов адаптера использует ссылку на нулевой объект. – WondrousPiffle