2013-08-01 4 views
0

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

в методе OnCreate у меня есть код ниже

adapter = new ArrayAdapter<String>(getActivity(), layout, showArray); 
setListAdapter(adapter); 

на данный момент, showArray является пустым массивом и для теперь applciation работ.

следующий, я вставляю данные в showArray, и я пытаюсь обновить адаптер списка в другом методе. Я использую приведенный ниже код:

adapter = new ArrayAdapter<String>(getActivity(), layout, showArray); 
setListAdapter(adapter); 

но приложение падает. Я попытался изменить свой код на:

adapter = new ArrayAdapter<String>(getActivity(), layout, showArray); 
adapter.notifyDataSetChanged(); 

но еще раз не повезло.

Мой полный код ниже:

public class Fragment_AllCommunities extends Fragment { 
    OnHeadlineSelectedListener callBack; 

    // The container Activity must implement this interface so the frag can deliver messages 
    public interface OnHeadlineSelectedListener { 
     public void onCommunitySelected(int position); 
    } 

    private ProgressDialog progress; 
    private Activity activity; 
    private JSONArray communities; 
    private JSONObject[] commDetails; 
    private String[] showArray = {""}; 
    private int layout = 0; 
    private ArrayAdapter<String> adapter; 

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

     // We need to use a different list item layout for devices older than Honeycomb 
     layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
      android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1; 

     adapter = new ArrayAdapter<String>(getActivity(), layout, showArray); 
     setListAdapter(adapter); 
    } 

    public void updateAllCommunities(JSONObject[] commArr) throws JSONException { 
     commDetails = commArr; 

     showArray = new String[commDetails.length]; 

     for(int i=0;i<commDetails.length;i++) 
     { 
      showArray[i] = commDetails[i].getString("name").toString(); 
     } 

     //adapter = new ArrayAdapter<String>(getActivity(), layout, showArray); 
     //adapter.notifyDataSetChanged(); 

     try 
     { 
      adapter.notifyDataSetChanged(); 
     } 
     catch(Exception ex) 
     { 
      String s = ex.getMessage(); 
     } 

    } 


    @Override 
    public void onStart() { 
     super.onStart(); 
     if (getFragmentManager().findFragmentById(R.id.view_community_fragment) != null) { 
      getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      //getListView().setItemChecked(0, true); 
     } 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      callBack = (OnHeadlineSelectedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
       + " must implement OnHeadlineSelectedListener"); 
     } 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     callBack.onCommunitySelected(position); 

     getListView().setItemChecked(position, true); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     String a = "S"; 
    } 
} 

может кто-нибудь сказать мне, что я делаю неправильно PLS?

заранее спасибо оценить все ответы

Clive

+0

Нам нужен стек из LogCat. –

+0

добавьте стек. –

+0

вы можете рассказать мне, как это сделать? Я новичок в андроиде. sry and thanks –

ответ

0

Если вы хотите, чтобы обновить список просто поместить этот code.It обновит адаптер ваших ListView обновленные данные.

adapter.notifyDataSetChanged(); 
+0

Исключено исключение нулевого указателя, и я не знаю, y –

+0

проверить, что адаптер инициализирован и данные установлены перед вызовом adapter.notifyDataSetChanged(); –

1

Я уверен, что проблема в том, вы вызываете более setListAdapter, чем один раз. Вы должны только вызывать это, когда вы создаете ListFragment. Если вы хотите изменить свой список, вам необходимо добавить данные в базовую структуру данных, вызвав методы add() и remove() адаптера.

т.е .:

adapter.add(object); 
adapter.notifyDataSetChanged() 

Обычно я создаю метод обертку для добавления данных к адаптеру.

+0

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

+0

@CliveCauchi Для чего нужен NPE? Можете ли вы дать мне информацию об этом? –

+0

@CliveCauchi Я просто подумал о еще одном. Попробуйте перевести свой код с 'onCreate' на' onActivityCreated', как показано в этом уроке: http://www.vogella.com/articles/AndroidListView/#listfragments. Проблема для NPE может заключаться в том, что она возвращает null, потому что Activity is not создано еще. –

Смежные вопросы