如何将对象值从RecyclerView项发送到另一个活动 [英] How to send object value from RecyclerView Item to Another Activity

查看:49
本文介绍了如何将对象值从RecyclerView项发送到另一个活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从要解析的JSON数组中,我想将特定的对象值(使用intent putExtra)发送到另一个活动.我已经阅读了这个问题 和可接受的答案,但我不想发送所有值,就我而言,我只想将 news_id 作为整数发送到 NewsDetails.class .

我尝试使用接受的答案来做,但是我被卡住了.

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

        }
    }

}

NewsItems类

    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()) {
                //
            }
        }
    }


}

解决方案

您也可以发送单个值,而不是像这样发送完整的对象-

@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)并将onBindViewHolder()更改为setOnClickListener()newsExcerpt上的setOnClickListener()-

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


            }

From a JSON array that I am parsing, I want to send a particular object value (using intent putExtra) to another activity. I have read this this question and the accepted answer but I don't want to send all the values, in my case I only want to send the news_id as an integer to NewsDetails.class.

And I tried using the accepted answer to do it but I got stuck.

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

        }
    }

}

NewsItems class

    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()) {
                //
            }
        }
    }


}

解决方案

You can send single value also instead of complete object like this -

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

In your case, remove onClick(View v) and change your onBindViewHolder() to setOnClickListener() on newsExcerpt like this -

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


            }

这篇关于如何将对象值从RecyclerView项发送到另一个活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆