How to set value for textview of fragment received

2019-07-25 18:09发布

I don't know how to set in the textview of second fragment when received the value from another fragment. The data I received in the second fragment is the "value" object of StringList but I don't now how to set the data for it.

StringList class:

public class StringList {

    public String authorName;
    public String headline;
    public String publishedTime;
    public String newsDetail;

}

MainActivity:

//only useful code pasted below for tranfering thre value from fragment to another fragment and i have implemented the TransferValue to the mainActivity

        public void sendValue(StringList value, int positionValue) {

            FragmentTransaction transaction = frag.beginTransaction();
            BusinessDetail businessDetail = new BusinessDetail();
            businessDetail.receiveValue(value, positionValue);
            transaction.replace(R.id.content_frame, businessDetail);
            transaction.commit();

        }

Fragment1:

    public class Business extends Fragment  {

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

        TransferValue SendData;//here

        private RecyclerView recyclerView;
         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);
        }

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
    //here
            try {
                SendData = (TransferValue) context;
            } catch (ClassCastException e) {
                Log.d("ashu", "implement the methods");
                throw new ClassCastException("implemented the methods");
            }
        }

//here
        public interface TransferValue {

            public void sendValue(StringList value, int positionValue);

        }

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

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

                int count = params[0];
                int offset = params[1];
    //api key changed
                String urlString = "https://newspi.og/v1/article?source=bloomerg&sortBy=tp&apiKey=5fdfd54f4aba5a5fdfvdf476ff528a8";
                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 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);
                    }

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

            @Override
            protected void onPostExecute(List<StringList> result) {
                super.onPostExecute(result);

                recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                BusinessAdapter adapter = new BusinessAdapter(Business.this, result);
                recyclerView.setAdapter(adapter);

            }
        }

        public class BusinessAdapter extends RecyclerView.Adapter<BusinessHolder> {

            int prevposition = 0;
            private List<StringList> c;

            public BusinessAdapter(Business context, List<StringList> result) {
                c = context.businessNews;

            }

            @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);

            @Override
            public int getItemCount() {
                return c.size();
            }
        }

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

            }

            public void bindListName(final StringList stringList, final int position) {

                headlineTextview.setText(stringList.headline);
                authorTextview.setText(stringList.authorName);
                timeTextview.setText(stringList.publishedTime);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                         BusinessDetail s = new BusinessDetail();
                        FragmentTransaction transaction = getFragmentManager().beginTransaction();
                        transaction.replace(R.id.content_frame, s);
                        transaction.addToBackStack(null);
                        transaction.commit();
                    } });}}}}

Fragment 2:

public class BusinessDetail extends Fragment {

    Bundle bundle;
    private TextView headlineSecond;
    private TextView authorSecond;
    private TextView detailsSecond;
    private List<StringList> s;

    public BusinessDetail() {
    }

    public void receiveValue(StringList value, int positionValue) {

        bundle = new Bundle();
        bundle.putString("news", value.authorName);
      }

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

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

// I want to set the values received to the textview here

        return view;}}

2条回答
疯言疯语
2楼-- · 2019-07-25 18:33

Please consider using newInstance pattern for passing values to fragment as calling receiveValue method after instantiating fragment is not a good practice. You should define your object as Parcelable and pass it to new fragment via newInstance method.

However if you received values via invocation of method receiveValue there is no need to use a Bundle. Bundle is used when you want to pass values from Fragment or Activity to another Fragment. For saving values you can define Global Variables like you did with TextViews. For Example:

Bundle bundle;
StringList mStringList;
private TextView headlineSecond;
private TextView authorSecond;
private TextView detailsSecond;
private List<StringList> s;

public BusinessDetail() {
}

public void receiveValue(StringList value, int positionValue) {
    mStringList = value;
}

P.S: But for future reference, you can retrieve String value from Bundle by calling getString(String key). In your case it would be like:

String value = bundle.getString("news");
yourTextView.setText(value);

Also remove these lines, they don't do anything in your current fragment unless you trying to start a new Fragment:

BusinessDetail detail = new BusinessDetail();
detail.setArguments(bundle);

For detailed explanation of fragment's communication with example and code snippet you can visit here: http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html

查看更多
神经病院院长
3楼-- · 2019-07-25 18:47

You can send arraylist of any custom class data using Parcelable from one activity/fragment to next activity/fragment.

In previous fragment add data in bundle using putParcelableArrayList method. for e.g.

bundle.putParcelableArrayList("KEY_NAME",arrayName);

In next frgament get that data in onCreate using getParcelableArrayList method.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        ArrayList<Item> itemArray = getArguments().getParcelableArrayList("KEY_NAME");
    }
}

And main thing is that change your StringList class to Parcelable. For Parcelable class example click below link..

Parcelable Class

查看更多
登录 后发表回答