Получить данные во фрагменте через модернизацию - PullRequest
0 голосов
/ 12 декабря 2018

В этой задаче я хочу получить данные из моего API

, в котором я получаю данные из модернизации

Я хочу показать данные в RecyclerView на вкладках фрагментов, но как я могу отправлять данные изактивность к фрагменту

Это все, что я пробовал

Модифицированный вызов, который предоставляет мне ArrayList моих сообщений

getMainApp().swiftAPI.getPosts().enqueue(object : Callback<ArrayList<Post>>{
            override fun onFailure(call: Call<ArrayList<Post>>?, t: Throwable?) {
                Toast.makeText(this@DashboardActivity, t?.message, Toast.LENGTH_SHORT)
            }

            override fun onResponse(call: Call<ArrayList<Post>>?, response: Response<ArrayList<Post>>?) {
                if (response?.isSuccessful!!){

                }
            }

PagesFragment

val rootView = inflater.inflate(R.layout.fragment_page, container, false)
        val video_recyclerview = rootView.findViewById(R.id.pages_rcv) as RecyclerView // Add this
        video_recyclerview.layoutManager = LinearLayoutManager(activity)
        video_recyclerview.adapter = PagesAdapter()
        return rootView

Я хочу знать, есть ли способ отправить ArrayList для фрагментирования, потому что мои данные находятся в ArrayList As shown in Picture

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Поскольку вы работаете на Android, я бы порекомендовал компонент ViewModel, который упрощает взаимодействие между действием и его фрагментами.

Сначала добавьте пакет в ваше приложение

    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

Затем создайте класс ViewModel

public class MyViewModel extends ViewModel {
    public MutableLiveData<ArrayList<Post>> posts = new MutableLiveData<ArrayList<Post>>();
}

Теперь во фрагменте подпишитесь на него.

 public class DetailFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.posts.observe(this, { posts ->
           // Update the UI.
        });
    }
 }

Затем установите значение в MainActivity, как показано ниже, и вуаля, у вас есть данные втвой фрагмент.Подробнее об этом можно прочитать здесь

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same MyViewModel instance created by the first activity.

        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.users.setValue(posts);
    }
}
0 голосов
/ 12 декабря 2018

Вы можете определить метод как updateData в PagesFragment

    lateinit var adapter

    public fun onCreateView....
        val rootView = inflater.inflate(R.layout.fragment_page, container, false);
        val video_recyclerview = rootView.findViewById(R.id.pages_rcv) as RecyclerView // Add this
        video_recyclerview.layoutManager = LinearLayoutManager(activity)
        adapter = PagesAdapter()
        video_recyclerview.adapter = adapter
        return rootView
    }

    public fun updateData(posts:List<Post>){
        adapter.notifyDataSetChange()
    }

и вызывать его из своей деятельности, например, через экземпляр PageFragment:

pageFragment.updateData(posts)
0 голосов
/ 12 декабря 2018

Первая проверка currentFragment в вашем классе активности.Вы получите ссылочный объект фрагмента в вашем классе деятельности.поэтому приведенный ниже пример будет таким:

Предположим, у вас есть фрагмент с именем DataFragment и в вашем классе активности есть ссылка mDataFragment.теперь, когда вы получите данные в своем классе активности, вы будете вызывать ((DataFragment)mDataFragment).passData(yourDataList). Помните, passData() - это открытый метод в вашем классе фрагментов.Затем вы можете добавить данные в adapter и позвонить notifyDataSetChanged()

0 голосов
/ 12 декабря 2018

Вы можете определить интерфейс в своей деятельности и позволить фрагменту реализовать интерфейс.Вы можете следовать этому примеру на моем github: ActivityToFragmentCommunication

По сути, в своей деятельности определите:

  public interface DataLoadedListener {
        public void onDataLoaded(ArrayList<Post> posts);
    }

Затем заставьте свой фрагмент реализовать интерфейс, как показано ниже:

public class ExampleFragment extends Fragment implements MainActivity.DataLoadedListener {

  // your fragment code
}

Наконец, в методе onCreate () вашей активности:

// Create new fragment and transaction
        mExampleFragment = new ExampleFragment();
        // setting mExampleFragment as data load listener
        mDataLoadedListener = (DataLoadedListener) mExampleFragment;
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack if needed
        transaction.replace(R.id.flContainer, mExampleFragment);
        transaction.addToBackStack(null);
        // Commit the transaction
        transaction.commit();

        // load data after click
        btLoadData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loadData();
                // notify attached fragment
                mDataLoadedListener.onDataLoaded(myStrings);
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...