Мой список не обновляется, когда пользователь отвечает на действие?

У меня есть основное действие со многими фрагментами, один из которых содержит представление списка, с адаптером homeworkListAdapter, этот адаптер отображает все элементы, начальные в homeworkItems. Моя активность открывает другую активность (HomeworkAddActivity, которая получает строку от пользователя и помещает ее в массив homeworkItems, все это работает, поскольку я проверял каждый шаг независимо друг от друга. Однако, когда я пытаюсь обновить представление списка с помощью этого нового элемента (используя .notifyDataSetChanged) не обновляется, уже 3-4 часа пытаюсь это исправить, помогите пожалуйста.

Код

MainActivity

    public static ArrayAdapter<String> homeworkListAdapter;

public static ArrayList<String> homeworkItems; 

  ....

protected void onCreate(Bundle savedInstanceState) {
....
homeworkItems = new ArrayList<String>();

homeworkListAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, homeworkItems);
....

 public static class HomeworkListViewFragment extends Fragment {

....

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(
                R.layout.fragment_homework_listview, container, false);

        homeworkListView = (ListView) rootView
                .findViewById(R.id.homework_listview);

        homeworkListView.setAdapter(homeworkListAdapter);

        return rootView;
    }

HomeworkAddActivity

public class HomeworkAddActivity extends ActionBarActivity {

....

public void buttonAddHomework(View v) {
    NavUtils.navigateUpFromSameTask(this);
    EditText editText = (EditText) findViewById(R.id.text_new_homework_name);
    String homeworkItem = (String) editText.getText().toString();
    if (!(TextUtils.isEmpty(homeworkItem))) {
        //MainActivity.homeworkList.addItem(homeworkItem);
        MainActivity.homeworkItems.add(homeworkItem);
        MainActivity.homeworkListAdapter.notifyDataSetChanged();
    }
}
 }

person ollie299792458    schedule 12.04.2014    source источник
comment
попробуйте полностью воссоздать homeworkListAdapter в buttonAddHomework(). Иногда notifyDataSetChanged() просто не работает по неизвестной причине...   -  person Stan    schedule 12.04.2014
comment
Я пробовал это (с другим кодом), но я попробую еще раз, однако я бы предпочел, чтобы это было сделано более аккуратно/правильно.   -  person ollie299792458    schedule 12.04.2014
comment
Я снова попробовал то, что вы предложили, но все равно не удалось обновить список.   -  person ollie299792458    schedule 12.04.2014
comment
может if (!(homeworkItem == null)) не пройдет? ты проверял? Также попробуйте использовать if (!TextUtils.isEmpty(homeworkItem)) - он проверяет как нулевую, так и пустую строку.   -  person Stan    schedule 13.04.2014
comment
Я попытался изменить текст кнопки на первый элемент (get(0)) в homeworkItems, комментируя navigateUp, и это сработало нормально, так что все это работает.   -  person ollie299792458    schedule 13.04.2014
comment
И я изменил его на textutils   -  person ollie299792458    schedule 13.04.2014


Ответы (1)


Не могли бы вы сделать такую ​​проверку:

if (!TextUtils.isEmpty(homeworkItem)) {
Toast.makeText(getBaseContext(),"ADDING AN ITEM!!!",Toast.LENGH_SHORT).show()
    homeworkItems.add(homeworkItem);
    homeworkListAdapter.notifyDataSetChanged();
}

просто чтобы убедиться, что он проходит проверку. если это так (и вы увидите тост), попробуйте

    if (!TextUtils.isEmpty(homeworkItem)) {
        homeworkItems.add(homeworkItem);
homeworkListAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, homeworkItems);
homeworkListView.setAdapter(homeworkListAdapter);
    }

ОБНОВЛЕНИЕ
и самое последнее, что я предполагаю, что в вашем ListView свойство android:height установлено на "wrap_content" - попробуйте изменить его на "match_parent" :) Оно обновляется, но вы его не видите - попробуйте прокрутить :)) И если это так, то вам следует вернуться к notifyDatasetChanged()

person Stan    schedule 12.04.2014
comment
Это все еще не работает, я сделал обе вещи (первая показывает тост) - person ollie299792458; 13.04.2014
comment
Я попробовал ваше обновление, и оно все еще не работает, я попробую ваше предложение более тщательно в какой-то момент - person ollie299792458; 13.04.2014
comment
Вы видите, что есть проблема с вашим ListView - он не виден. Это единственное, что может быть. Попробуйте сделать его как ширину, так и высоту равным match_parent и убедитесь, что вы не закрываете его другим макетом или элементами управления. - person Stan; 13.04.2014
comment
Ага, потом посмотрю. Это видно, если я жестко кодирую элементы onCreate, однако я предполагаю, что это отличается от наличия wrap_content с динамическими данными - person ollie299792458; 13.04.2014
comment
Затем AOS создает пустой ListView с высотой wrap_content, он всегда будет невидимым, потому что при создании он занимает нулевую высоту, так как нечего показывать. Он не будет расти, когда вы добавляете элементы. Ну, в этом случае недействительный () может помочь, но я не уверен - person Stan; 13.04.2014
comment
спасибо, моя первоначальная попытка не сработала, так как я не изменил все вложенные фрагменты на match_parent, но теперь это работает - person ollie299792458; 13.04.2014