2017-04-15 30 views
2

我不知道如何在从另一个片段接收到值时在第二个片段的textview中设置。我在第二个片段中收到的数据是StringList的“值”对象,但我现在不知道如何为它设置数据。如何设置从另一个片段接收到的片段的textview值?

的StringList类:

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

     } 

片段1:

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

片段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

可以使用Parcelable FR发送任何自定义类数据的ArrayList om一个活动/片段到下一个活动/片段。

在之前的片段中,使用putParcelableArrayList方法在数据包中添加数据。例如,

bundle.putParcelableArrayList("KEY_NAME",arrayName); 

在下一个frgament中使用getParcelableArrayList方法获取onCreate中的数据。

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

而最主要的是将您的StringList类更改为Parcelable。对于Parcelable类例如点击以下链接..

Parcelable Class

+0

谢谢!但我不想这样做,因为我通过改变一些代码重新开始...... plz根据上述条件给出答案。再次感谢! –

+0

@avadra_kedra对于上述情况,parcelable对pojo(自定义类)的数据列表来说是完美的。并且对于单个对象附加,所有值都是单独的,并在另一个片段中获得。我希望这会帮助你.. –

3

在实例化片段之后,请考虑使用newInstance方法将值传递给片段,因为调用receiveValue方法不是一种好的做法。您应该将您的对象定义为Parcelable并通过newInstance方法将其传递给新片段。

但是,如果您通过调用方法receiveValue收到值,则不需要使用Bundle。当您要将FragmentActivity的值传递给另一个Fragment时,使用Bundle。为了保存数值,您可以定义全球像您一样使用TextView s的变量。例如:

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:但是,以供将来参考,您可以通过调用getString(String key)检索字符串从Bundle值。在你的情况下,它会像:

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

也可以删除这些行,他们不会在你目前的片段做任何事情,除非你想开始一个新的Fragment

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

为了详细说明片段与例子和代码片断通信可点击这里查看: http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html

+0

是的!当然,我已经将片段的值传递给了其中我正在获取值对象的其他片段......但是,如何将此值设置为textview字段?感谢您的考虑 –

+0

我没有看到任何与传递值或启动片段相关的代码。我更新我的答案以包含有关此问题的更多详细信息。 –

+0

我得到一个空指针异常“String value = bundle.getString(”news“);” ? –

相关问题