#java #android #android-fragments #android-tablayout #android-viewpager2
#java #Android #android-фрагменты #android-tablayout #android-viewpager2
Вопрос:
Я использую TabLayout и ViewPager2, чтобы отображать до 3 фрагментов с одинаковым макетом. Фрагмент на вкладку.
Все 3 фрагмента должны обновить свой собственный ListView после завершения асинхронной задачи. Все фрагменты имеют одинаковый макет, но каждый фрагмент имеет свое собственное содержимое ListView.
Асинхронная задача запускается, когда пользователь нажимает определенную кнопку.
Я думаю, что весь код будет беспорядочным, поэтому вот основной код, я думаю, должно быть достаточно:
MainActivity.class
// here we fire the async task if "buttonrefesh" is clicked
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.buttonrefresh) //refresh
new FetchAnuncios().execute();
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Attaching the layout to the toolbar object
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
// Setting toolbar as the ActionBar with setSupportActionBar() call
setSupportActionBar(toolbar);
viewPager = findViewById(R.id.viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
pagerAdapter = new MyPagerAdapter(MainActivity.this);
viewPager.setAdapter(pagerAdapter);
new TabLayoutMediator(tabLayout, viewPager,(tab, position) -> tab.setIcon(icons[position])).attach();
}
MyPagerAdapter.class
private class MyPagerAdapter extends FragmentStateAdapter {
public MyPagerAdapter(FragmentActivity fa) {
super(fa);
}
@Override
public Fragment createFragment(int pos) {
switch (pos) {
case 0: {
return Fragment_ma.newInstance("fragment 1");
}
case 1: {
return Fragment_ma.newInstance("fragment 2");
}
case 2: {
return Fragment_ma.newInstance("fragment 3");
}
default:
return Fragment_ma.newInstance("fragment 1, Default");
}
}
@Override
public int getItemCount() { return 3;}
}
}
Fragment_ma.class
public class Fragment_ma extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_ma, container, false);
return v;
}
public static Fragment_ma newInstance(String text) {
Fragment_ma f = new Fragment_ma();
return f;
}
}
FetchAnuncios.class
private class FetchAnuncios extends AsyncTask<Void, Integer, ArrayList<AnuncioData>> {
@Override
protected ArrayList<AnuncioData> doInBackground(Void... voids) {
ArrayList<AnuncioData> arrayList = new ArrayList<AnuncioData>();
// here we do some I/O work to get arrayList with all the data that should be attached to each fragment ListView
return arrayList;
}
@Override
protected void onPostExecute(ArrayList<AnuncioData> arrayList) {
super.onPostExecute(arrayList);
final ListView list = findViewById(R.id.list); // I know here is the problem, but can't imagine how to solve it
list.setAdapter(null);
if (arrayList.size()>0) {
CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, arrayList);
list.setAdapter(customAdapter);
}
}
}
Как вы можете видеть, метод «onPostExecute» — это тот, который должен обновлять 3 ListView каждого фрагмента данными, хранящимися в ArrayList (разное содержимое в каждом ListView). Как я могу этого добиться? Фрагменты создаются, когда я нажимаю на вкладку, а не раньше (кроме первого, который изначально виден). Итак, когда я должен подключить адаптер listview и как?
Ответ №1:
Обновите свой код этой частью кода, надеюсь, это поможет, и удалите эту часть кода «list.setAdapter(null);»
if (arrayList.size()>0) {
if(int i=0; i<arrayList.size()-1; i ){
CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, arrayList.get(i));
list.setAdapter(customAdapter);
}
}
Комментарии:
1. Как поможет этот код? Это обновит только один ListView, тот, что в Tab1
Ответ №2:
Я наконец-то заработал. Основные изменения:
- Создайте MyPagerAdapter в doBackground
- Перед установкой адаптера на viewpager передайте ArrayList экземпляру MyPagerAdapter
- установите адаптер списка в классе списка фрагментов (onCreate)