Отправить объект из одного фрагмента в другой

У меня есть два фрагмента, в которых 1-й фрагмент (Business) есть список строк объекта, который необходимо перенести во 2-й фрагмент (Businessdetail).\

Я хочу знать, что является лучшим методом практики и как я должен это делать?

public class Business extends Fragment {

        public List<StringList> businessNews = new ArrayList<>();
        private RecyclerView recyclerView;
        StringList stringList; //object need to transfered to other fragment 
        public Business() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.fragment_business, container, false);
            recyclerView = (RecyclerView) view.findViewById(R.id.business_recycler_view);

            FetchLists f = new FetchLists();
            f.execute(10, 0);
            return view;
        }

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }


        public class FetchLists extends AsyncTask<Integer, Void, List<StringList>> {

            @Override
            protected List<StringList> doInBackground(Integer... params) {

                int count = params[0];
                int offset = params[1];

                String urlString = "https://nei.org/v1/articlesbjkbknklnmlmerg&sortBy=top&apiKey=50e2bjkbbkba5a5f476ff528a8";
                urlString = urlString + "&count=" + count + "&offset=" + offset;

                try {
                    URL url = new URL(urlString);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    InputStream stream = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
                    String line = reader.readLine();
                    String response = "";
                    while (line != null) {
                        response += line;
                        line = reader.readLine();
                    }

                    JSONObject object = new JSONObject(response);
                    JSONArray emailLists = object.getJSONArray("articles");

                    for (int i = 0; i < emailLists.length(); i++) {
                        JSONObject listData = (JSONObject) emailLists.get(i);

                         stringList = new StringList();
                        stringList.authorName = listData.getString("author");
                        stringList.headline = listData.getString("title");
                        stringList.publishedTime = listData.getString("publishedAt");
                        stringList.newsDetail = listData.getString("description");

                        businessNews.add(stringList);
                        Log.d("ashu", "authorname" + stringList.authorName);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
                return businessNews;
            }

        public class BusinessAdapter extends RecyclerView.Adapter<BusinessHolder> {



            @Override
            public BusinessHolder onCreateViewHolder(ViewGroup parent, int viewType) {

                Context context = parent.getContext();
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View view = inflater.inflate(R.layout.layout_news, parent, false);
                return new BusinessHolder(view);
            }

            @Override
            public void onBindViewHolder(BusinessHolder holder, int position) {

                StringList m = c.get(position);
                holder.bindListName(m, position);
     }}

        public class BusinessHolder extends RecyclerView.ViewHolder {

            public TextView headlineTextview;
            public TextView authorTextview;
            public TextView timeTextview;

            public BusinessHolder(View itemView) {
                super(itemView);

                headlineTextview = (TextView) itemView.findViewById(R.id.id_headline);
                authorTextview = (TextView) itemView.findViewById(R.id.id_author);
                timeTextview = (TextView) itemView.findViewById(R.id.id_time);

            }

2-й фрагмент:

В этом фрагменте я хочу установить для данных объекта параметры Textview.

public class BusinessDetail extends Fragment {
 StringList mstringList;
    private TextView headlineSecond;
    public TextView authorSecond;
    private TextView detailsSecond;


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_business_detail, container, false);
        return view;
    }


    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        headlineSecond = (TextView) view.findViewById(R.id.id_headline_second);
        authorSecond = (TextView) view.findViewById(R.id.id_author_second);
        detailsSecond = (TextView) view.findViewById(R.id.id_details_second);
   }}

5 ответов

Решение

Фрагменты не должны знать друг о друге.

Вместо того, чтобы переходить от одного фрагмента к другому, объявите список объектов в упражнении и попросите каждый фрагмент получить его оттуда:

Для этого в основной деятельности объявите список объектов и получатель для списка:

public List<StringList> businessNews = new ArrayList<>();

public List<StringList> getObjectList(){
    return objectList;
}

Затем во Фрагментах вы можете получить список:

((MainActivity) getActivity()).getObjectList();

Вы можете сделать этот вызов в onResume(), чтобы убедиться, что Fragment и Activity готовы.

Для более правильного решения, эта часть ((MainActivity) getActivity())может быть реализован с использованием интерфейса, чтобы избежать приведения.

Если BusinessDetail и Business являются дочерними элементами одного и того же действия, вы должны предоставить интерфейс между обоими фрагментами и действием. В вашем бизнес-фрагменте вы можете сделать этот вызов (в onAttach или после фрагмента):

((MyActivity)getActivity()).showObjectOnBusiness(stringList);

В методе MyActivity showObjectOnBusiness вы должны передать объект фрагменту BusinessDetail:

Bundle bundle = new Bundle();
bundle.putParcelable(BusinessDetail.OBJECT_KEY, stringList);
new BusinessDetail().setArguments(bundle);

Внутри BusinessDetail вы можете получить свой объект через аргументы:

Bundle bundle = getArguments();

if (bundle == null || !bundle.containsKey(OBJECT_KEY)) {
    throw new IllegalArgumentException("StringList should not be null");
}
StringList stringList = bundle.getParcelable(OBJECT_KEY);

StringList должен реализовывать Parcelable.

Сохранение ссылки на фрагмент в другом - плохая практика. Вы можете использовать этот метод, он отлично работает.

Вы можете достичь этого с помощью следующего кода

Bundle bundle = new Bundle();
bundle.putParcelableArrayList("Key_List", businessNews);
fragmentInstance.setArguments(bundle);

Вы также можете использовать Serializable, но сериализуемый медленнее, чем parcelable

 Bundle bundle = new Bundle();
bundles.putSerializable("Key_List", businessNews);
fragmentInstance.setArguments(bundle);

Вы можете использовать библиотеку Event Bus

Это упростит связь между компонентами,

работает по шаблону издатель / подписчик.

Другие вопросы по тегам