Обновите несколько фрагментов с одинаковым расположением после выполнения асинхронной задачи в TabLayout и ViewPager2

#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)