2016-04-12 7 views
0

私が解析しているJSON配列から、(putExtraを使用して)別のアクティビティに特定のオブジェクト値を送信したいと思います。私はこれをthis question と受け入れられた答えを読んだが、私はすべての値を送って欲しいとは思わないが、私の場合はnews_idを整数としてNewsDetails.classに送信したい。RecyclerViewアイテムから別のアクティビティにオブジェクト値を送る方法

私は受け入れられた答えを使って試しましたが、私は立ち往生しました。

MainActivity

public class MainActivity extends AppCompatActivity{ 

    private final String TAG = "MainActivity"; 

    //Creating a list of newss 
    private List<NewsItems> mNewsItemsList; 

    //Creating Views 
    private RecyclerView recyclerView; 
    private RecyclerView.Adapter adapter; 
    private ProgressDialog mProgressDialog; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d(TAG, "Device rotated and onCreate called"); 

     //Initializing Views 
     recyclerView = (RecyclerView) findViewById(R.id.news_recycler); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 



     //Initializing the newslist 
     mNewsItemsList = new ArrayList<>(); 
     adapter = new NewsAdapter(mNewsItemsList, this); 

     recyclerView.setAdapter(adapter); 



     //Caling method to get data 
     getData(); 

    } 


    //This method will get data from the web api 

    private void getData(){ 


     Log.d(TAG, "getData called"); 
     //Showing progress dialog 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setMessage(this.getResources().getString(R.string.load_news)); 
     mProgressDialog.show(); 


     //Creating a json request 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigNews.GET_URL, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, "onResponse called"); 
         //Dismissing the progress dialog 
         if (mProgressDialog != null) { 
          mProgressDialog.hide(); 
         } 
         /*progressDialog.dismiss();*/ 


         //calling method to parse json array 
         parseData(response); 

        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 

     //Creating request queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

     //Adding request to the queue 
     requestQueue.add(jsonArrayRequest); 

    } 

    //This method will parse json data 
    private void parseData(JSONArray array){ 
     Log.d(TAG, "Parsing array"); 

     for(int i = 0; i<array.length(); i++) { 
      NewsItems newsItem = new NewsItems(); 
      JSONObject jsonObject = null; 
      try { 
       jsonObject = array.getJSONObject(i); 
       newsItem.setNews_title(jsonObject.getString(ConfigNews.TAG_NEWS_TITLE)); 
       newsItem.setNews_excerpt(jsonObject.getString(ConfigNews.TAG_NEWS_EXCERPT)); 
       newsItem.setNewsId(jsonObject.getInt(ConfigNews.TAG_NEWS_ID)); 

      } catch (JSONException w) { 
       w.printStackTrace(); 
      } 
      mNewsItemsList.add(newsItem); 

     } 

     adapter.notifyItemRangeChanged(0, adapter.getItemCount()); 


    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "onDestroy called"); 
     if (mProgressDialog != null){ 
      mProgressDialog.dismiss(); 
      Log.d(TAG, "mProgress dialog dismissed"); 

     } 
    } 

} 

のNewsItemクラス

public class NewsItems { 
      private String news_title; 
      private String news_excerpt; 
      private int news_id; 

      public String getNews_title() { 
       return news_title; 
      } 

      public void setNews_title(String news_title) { 
       this.news_title = news_title; 
      } 

      public String getNews_excerpt() { 
       return news_excerpt; 
      } 

      public void setNews_excerpt(String news_excerpt) { 
       this.news_excerpt = news_excerpt; 
      } 

      public int getNews_id() { 
       return news_id; 
      } 

      public void setNews_id(int news_id) { 
       this.news_id = news_id; 
      } 

     } 

NewsAdapter

あなたが送ることができる
public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ 

    private ImageLoader imageLoader; 
    private Context mContext; 

    //List of newss 
    private List<NewsItems> mNewsItems; 

    private final int VIEW_ITEM = 0; 
    private final int VIEW_PROG = 1; 

    private int lastPosition = -1; 

    public NewsAdapter(List<NewsItems> newsItems, Context context) { 
     super(); 

     //Getting all newss 
     this.mNewsItems = newsItems; 
     this.mContext = context; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (isPositionItem(position)) 
      return VIEW_ITEM; 
     return VIEW_PROG; 
    } 

    private boolean isPositionItem(int position) { 
     return position != getItemCount()-1; 
    } 



    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { 
     if (viewType == VIEW_ITEM) { 
      View v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.news_summ, parent, false); 
      return new TextViewHolder(v, mContext); 
     } else if (viewType == VIEW_PROG){ 
      View v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.recyclerfooter, parent, false); 
      return new ProgressViewHolder(v); 
     } 

     return null; 
    } 



    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 


     if (holder instanceof TextViewHolder) { 
      NewsItems newsList = mNewsItems.get(position); 
      ((TextViewHolder) holder).newsTitle.setText(newsList.getNews_title()); 
      ((TextViewHolder) holder).newsExcerpt.setText(newsList.getNews_excerpt()); 
      ((TextViewHolder) holder).newsId.setText(String.valueOf(newsList.getNewsId())); 

     } else { 
      ((ProgressViewHolder) holder).progressBar.setIndeterminate(true); 
      ((ProgressViewHolder) holder).loadButton.setText(R.string.reload); 
     } 


    } 


    @Override 
    public int getItemCount(){ 
     //Return the number of items in the data set 
     return mNewsItems.size(); 
    } 




    public static class TextViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public TextView newsTitle,newsExcerpt, newsId; 
     public ImageButton imageButton; 
     public NewsItems dNewsItems; 
     private Context context; 

     public TextViewHolder (final View newsView, final Context context) { 
      super(newsView); 
      this.context = context; 
      newsTitle = (TextView) newsView.findViewById(R.id.news_title); 
      newsExcerpt = (TextView) newsView.findViewById(R.id.news_excerpt); 
      newsId = (TextView) newsView.findViewById(R.id.news_id); 

      newsExcerpt.setOnClickListener(this); 


     } 



     @Override 
     public void onClick(View v) { 


      if (v.getId() == newsExcerpt.getId()) { 
       Intent intent = new Intent(context, NewsDetails.class); 
       Bundle bundle = new Bundle(); 
       bundle.putSerializable("PostId", //This is where I got confused); 
       } 
      } 
     } 
    } 

    public static class ProgressViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     Button loadButton; 
     ProgressBar progressBar; 
     public ProgressViewHolder(View footerView){ 
      super(footerView); 
      loadButton = (Button) footerView.findViewById(R.id.reload_button); 
      progressBar = (ProgressBar) footerView.findViewById(R.id.progress_load); 

      loadButton.setOnClickListener(this); 

      if(NetworkCheck.isAvailableAndConnected(footerView.getContext())) { 
       progressBar.setVisibility(View.VISIBLE); 


      } else if (!NetworkCheck.isAvailableAndConnected(footerView.getContext())) { 
       loadButton.setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     public void onClick(View v) { 
      if (v.getId() == loadButton.getId()) { 
       // 
      } 
     } 
    } 


} 
+0

それがIDであれば、ちょうどあなたのタイプに応じて 'putLong'または' putString'を使うのか? 'putSerializable'でもほとんどのオブジェクト型で動作します –

+0

@David、Plsあなたのコメントに追加できますか? – X09

答えて

1

また、代わりにこのような完全なオブジェクトの単一の値 - あなたの場合

@Override 
     public void onClick(View v) { 


      if (v.getId() == newsExcerpt.getId()) { 
       Intent intent = new Intent(context, NewsDetails.class); 
       intent.putExtra("PostId",<your_news_id_here>); 
       startActivity(intent); 
       } 
      } 
     } 

onClick(View v)を削除して、このようnewsExcerptsetOnClickListener()にごonBindViewHolder()を変更 -

 @Override 
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 


       if (holder instanceof TextViewHolder) { 
        NewsItems newsList = mNewsItems.get(position); 
        ((TextViewHolder) holder).newsTitle.setText(newsList.getNews_title()); 
        ((TextViewHolder) holder).newsExcerpt.setText(newsList.getNews_excerpt()); 
        ((TextViewHolder) holder).newsId.setText(String.valueOf(newsList.getNewsId())); 

    ((TextViewHolder) holder).newsExcerpt.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        Intent intent = new Intent(context, NewsDetails.class); 
        intent.putExtra("PostId",newsList.getNewsId()); //Any getter of your class you want 
        startActivity(intent); 
    }); 

       } else { 
        ((ProgressViewHolder) holder).progressBar.setIndeterminate(true); 
        ((ProgressViewHolder) holder).loadButton.setText(R.string.reload); 
       } 


      } 
+0

私もこの解決策を試しましたが、問題は ' 'の代わりに書くべきものでした。私は 'NewsItems'を初期化し、' 'の代わりに' mNewsItems.getPostId() 'を書こうとしましたが、NPEを返しました。 – X09

+0

答えを更新しました。 –

+0

ありがとうございます。しかし、「startActivity」を解決できないと訴えているAndroidスタジオ – X09

0

私は送りたくありませんすべての値

すべてを送信する必要はありません。あなたとあなたの必要に応じています。もう一方の端に

Intent i = new Intent(context, DestActivity.class); 
i.putExtra(KEY_NEWS_ID, news_id); 

int news_id = getIntent().getIntExtra(KEY_NEWS_ID, defaultValue); 
+0

ちょうど 'news_id'ですか? Android Studioでは、シンボルを解決できないと言います。 – X09

+0

私はyourObj.getNews_id()を意味する –

+0

'news_id'は動的です。それは各ニュース項目で変わります。 – X09

関連する問題