#android #listview #android-fragments
#Android #listview #android-фрагменты
Вопрос:
Я пытаюсь создать список во фрагменте, который может увеличиваться при нажатии кнопки.
Список находится внутри фрагмента.
Вот часть моей MainActivity:
public class MainActivity extends FragmentActivity {
public static String[] values = {
""
};
private static ListView listView;
public static NotesDbAdapter helper;
public static ArrayList<Fragment> fragments;
public static ViewPager viewPager;
public static CustomPagerAdapter pagerAdapter;
public static CustomListAdapter listAdapter;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.activity_main);
viewPager = (ViewPager)findViewById(R.id.viewpager);
listAdapter = new CustomListAdapter(this);
helper = new NotesDbAdapter(this);
helper.open();
pagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
fragments = new ArrayList<Fragment>();
fragments.add(new ListFragment());
Log.d("DEBUG", "HELPER COUNT: " Integer.toString(helper.fetchAllNotes().getCount()));
values = new String[helper.fetchAllNotes().getCount()];
for(int i = 0; i < values.length; i ) {
values[i] = "KLAPPT";
}
updateList();
viewPager.setAdapter(pagerAdapter);
}
public void addNote() {
Log.d("DEBUG", "new note");
helper.createNote("", "");
updateList();
}
public class CustomListAdapter extends ArrayAdapter<String> {
private Context context;
private int res;
private TextView textView;
public CustomListAdapter(Context context) {
super(context, R.layout.list_item, values);
this.context = context;
this.res = R.layout.list_item;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(res, parent, false);
textView = (TextView)rowView.findViewById(R.id.list_item_textview);
textView.setText(values[position]);
return rowView;
}
}
public static class ListFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_list, container, false);
listView = (ListView)v.findViewById(R.id.fragment_list_listview);
listView.setAdapter(listAdapter);
return v;
}
}
public void updateList() {
values = new String[helper.fetchAllNotes().getCount()];
for(int i = 0; i < values.length; i ) {
values[i] = "KLAPPT";
}
listAdapter.notifyDataSetChanged();
}
}
Итак, теперь я хотел бы добавить элемент в список, нажав на элемент actionbar. Это работает, я могу это подтвердить. Но чтобы увидеть изменения, я должен выйти из приложения и повторно войти, чтобы увидеть какие-либо изменения или изменить ориентацию экрана на альбомную и обратно.
Я хочу, чтобы он сразу отображал обновленный список, но я не знаю как.
listAdapter.notifyDataSetChanged();
у меня НЕ работает, я не знаю почему.
Я также попытался создать новый ListAdapter следующим образом:
listAdapter = new CustomListAdapter(getApplicationContext());
и установите ListView для этого адаптера:
listView.setAdapter(listAdapter);
Но все, что я получаю, это принудительное закрытие (я не знаю почему).
Так что знайте, я понятия не имею, как решить эту проблему. Я хотел бы иметь возможность обновлять ListView немедленно при вызове updateList()
метода.
Я получаю этот logCat при попытке применить новый адаптер к listview:
06-19 18:17:32.506: E/AndroidRuntime(12259): java.lang.RuntimeException:
Unable to start activity ComponentInfo{com.ochs.androidnotepad/com.ochs.androidnotepad.MainActivity}: java.lang.NullPointerException
Комментарии:
1. измените getApplicationContext() на MainActivity.this и отправьте logcat
2. @IllegalArgument Я добавил свой вывод logcat при попытке применить новый адаптер к listview
3. вы можете просмотреть список в первый раз??
4. Да, в настоящее время у меня в списке около 10 элементов, но иногда при запуске приложения из eclipse отображается только 1. После этого я могу выйти из приложения и повторно ввести его, и в нем отображаются все элементы списка
5. Почему
ListFragment
статический, пожалуйста, удалите его и проверьте