2017-04-15 5 views
2

別のフラグメントの値を受け取ったときに、2番目のフラグメントのテキストビューをどのように設定するのか分かりません。 2番目のフラグメントで受け取ったデータは"value" StringListのオブジェクトですが、データの設定方法は今はありません。別のフラグメントから受け取ったフラグメントのテキストビューの値を設定するにはどうすればいいですか?

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

     } 

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

フラグメント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を使用して、任意のカスタムクラスデータの配列リストを送信することができます1つの活動/断片から次の活動/断片へ。

以前のフラグメントでは、データをputParcelableArrayListメソッドを使用してバンドルに追加しました。例えば、

bundle.putParcelableArrayList("KEY_NAME",arrayName); 

次に、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(カスタムクラス)のデータのリストに最適です。そして、単一のObject attachについては、すべての値が個別であり、別のフラグメントにその値が入る。これが私に役立つことを願って.. –

3

フラグをインスタンス化した後にreceiveValueメソッドを呼び出すと、値をフラグメントに渡すために、newInstanceパターンを使用することをお勧めします。オブジェクトをParcelableと定義し、newInstanceメソッドで新しいフラグメントに渡す必要があります。

ただし、メソッドreceiveValueの呼び出しによって値を受け取った場合は、Bundleを使用する必要はありません。 FragmentまたはActivityから別のFragmentに値を渡す場合は、Bundleが使用されます。値を保存する場合は、グローバルのように、TextViewのような変数を定義できます。例:

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 ");"でnullポインタ例外が発生しています。 ? –

関連する問題