如何将价值从 recyclerview 项目传递到另一个活动

     2023-02-25     274

关键词:

【中文标题】如何将价值从 recyclerview 项目传递到另一个活动【英文标题】:How to pass value from recyclerview item to another activity 【发布时间】:2015-11-21 06:43:19 【问题描述】:

当我们单击 recyclerview 项目时,我试图将 recyclerview 项目中的值传递给另一个活动。这里我使用OnItemTouchListener

我从 JSON 中检索数据并将其解析为 ArrayList。我保存了 5 个参数。 Title、ID、Rating、ReleaseDate、urlPoster,但现在我只显示 urlposter 中的 2 个参数、Title 和图像。

我想将其他参数传递给另一个活动,但我不知道该怎么做。

还有另一个类似这样的问题 (Values from RecyclerView item to other Activity),但他使用的是 OnClick,而不是 OnItemTouch,他在 ViewHolder 中执行此操作。我在互联网的某个地方读到这不是正确的做法。

这是我的代码

public class Tab1 extends Fragment 

    private static final String ARG_PAGE = "arg_page";
    private static final String STATE_MOVIES = "state movies";
    private TextView txtResponse;
    private String passID;

    // Progress dialog
    private ProgressDialog pDialog;


    //private String urlJsonArry = "http://api.androidhive.info/volley/person_array.json";
    private String urlJsonArry = "http://api.themoviedb.org/3/movie/popular?api_key=someapikeyhere";
    private String urlJsonImg = "http://image.tmdb.org/t/p/w342";

    // temporary string to show the parsed response
    private String jsonResponse = "";

    RecyclerView mRecyclerView;
    RecyclerView.LayoutManager mLayoutManager;
    RecyclerView.Adapter mAdapter;

    private ArrayList<Movies> movies = new ArrayList<Movies>();


    public Tab1() 
        // Required empty public constructor
    

    @Override
    public void onSaveInstanceState(Bundle outState) 
        super.onSaveInstanceState(outState);
        outState.putParcelableArrayList(STATE_MOVIES, movies);
    

    public static Tab1 newInstance(int pageNumber)

        Tab1 myFragment = new Tab1();
        Bundle arguments = new Bundle();
        arguments.putInt(ARG_PAGE, pageNumber);
        myFragment.setArguments(arguments);
        return myFragment;
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);



        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
    


    /**
     * Method to make json object request where json response starts wtih 
     * */
    private void makeJsonObjectRequest() 

        showpDialog();

        final JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(urlJsonArry, new Response.Listener<JSONObject>() 


            @Override
            public void onResponse(JSONObject response) 
                //Log.d(TAG, response.toString());

                try 

                    JSONArray result = response.getJSONArray("results");

                    //Iterate the jsonArray and print the info of JSONObjects
                    for(int i=0; i < result.length(); i++)
                        JSONObject jsonObject = result.getJSONObject(i);

                        String id = jsonObject.getString("id");
                        String originalTitle = jsonObject.getString("original_title");
                        String releaseDate = jsonObject.getString("release_date");
                        String rating = jsonObject.getString("vote_average");
                        String urlThumbnail = urlJsonImg + jsonObject.getString("poster_path");

                        //jsonResponse = "";
                        jsonResponse += "ID: " + id + "\n\n";
                        jsonResponse += "Title: " + originalTitle + "\n\n";
                        jsonResponse += "Release Date: " + releaseDate + "\n\n";
                        jsonResponse += "Rating: " + rating + "\n\n";
                
                    //Toast.makeText(getActivity(),"Response = "+jsonResponse,Toast.LENGTH_LONG).show();
                    parseResult(response);

                catch (JSONException e) 
                    e.printStackTrace();
                    Toast.makeText(getActivity(),"Error: " + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                
                hidepDialog();
            
        , new Response.ErrorListener() 

            @Override
            public void onErrorResponse(VolleyError error) 
                //VolleyLog.d(TAG, "Error: " + error.getMessage());
                Toast.makeText(getActivity(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();
                // hide the progress dialog
                hidepDialog();
            
        );

        // Adding request to request queue
        VolleySingleton.getInstance(getActivity()).addToRequestQueue(jsonObjectRequest);
    


    private void showpDialog() 
        if (!pDialog.isShowing())
            pDialog.show();
    

    private void hidepDialog() 
        if (pDialog.isShowing())
            pDialog.dismiss();
    

    @Override
    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);

        //txtResponse = (TextView) getActivity().findViewById(R.id.txtResponse);
        //makeJsonArrayRequest();

        // Calling the RecyclerView
        mRecyclerView = (RecyclerView) getActivity().findViewById(R.id.recycler_view_movie);
        mRecyclerView.setHasFixedSize(true);

        // The number of Columns
        mLayoutManager = new GridLayoutManager(getActivity(),2);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new MovieAdapter(getActivity(),movies);
        mRecyclerView.setAdapter(mAdapter);

        mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), mRecyclerView, new ClickListener() 
            @Override
            public void onMovieClick(View view, int position) 
                Toast.makeText(getActivity(), "Kepencet " + position, Toast.LENGTH_SHORT).show();

                **//what to do here?**
            

            @Override
            public void onMovieLongClick(View view, int position) 
                Toast.makeText(getActivity(),"Kepencet Lama "+position,Toast.LENGTH_LONG).show();
            
        ));

        makeJsonObjectRequest();

        if (savedInstanceState!=null)
            movies=savedInstanceState.getParcelableArrayList(STATE_MOVIES);
            mAdapter.notifyDataSetChanged();
        
    



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.tab_1, container, false);


        return view;
    

    private void parseResult(JSONObject response) 
        try 
            JSONArray arrayMovies = response.getJSONArray("results");


            if (movies == null) 
                movies = new ArrayList<Movies>();
            



            for (int i = 0; i < arrayMovies.length(); i++) 

                JSONObject currentMovies = arrayMovies.getJSONObject(i);

                Movies item = new Movies();
                item.setTitle(currentMovies.optString("original_title"));
                item.setRating(currentMovies.optString("vote_average"));
                item.setReleaseDate(currentMovies.optString("release_date"));
                item.setId(currentMovies.optString("id"));
                item.setUrlThumbnail(urlJsonImg+currentMovies.optString("poster_path"));
                movies.add(item);
                mAdapter.notifyDataSetChanged();

                //Toast.makeText(getActivity(),"Movie : "+movies,Toast.LENGTH_LONG).show();
            
         catch (JSONException e) 
            e.printStackTrace();
        
    

    class RecyclerTouchListener implements RecyclerView.OnItemTouchListener
        private GestureDetector mGestureDetector;
        private ClickListener mClickListener;


        public RecyclerTouchListener(final Context context, final RecyclerView recyclerView, final ClickListener clickListener) 
            this.mClickListener = clickListener;
            mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener()
                @Override
                public boolean onSingleTapUp(MotionEvent e) 
                    return true;
                

                @Override
                public void onLongPress(MotionEvent e) 
                    View child = recyclerView.findChildViewUnder(e.getX(),e.getY());
                    if (child!=null && clickListener!=null)
                        clickListener.onMovieLongClick(child,recyclerView.getChildAdapterPosition(child));
                    
                    super.onLongPress(e);
                
            );
        

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) 
            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child!=null && mClickListener!=null && mGestureDetector.onTouchEvent(e))
                mClickListener.onMovieClick(child,rv.getChildAdapterPosition(child));
            
            return false;
        

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) 

        

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) 

        
    

    public static interface ClickListener
        public void onMovieClick(View view, int position);
        public void onMovieLongClick(View view, int position);
    


任何帮助将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

您需要将其他两个值添加到意图中的捆绑包中。所以是这样的:

Intent intent = new Intent(getActivity(), YourNextActivity.class);
intent.putExtra("movie_id_key", movies.get(position).getId); //you can name the keys whatever you like
intent.putExtra("movie_rating_key", movies.get(position).getRating); //note that all these values have to be primitive (i.e boolean, int, double, String, etc.)
intent.putExtra("movie_release_date_key", movies.get(position).getReleaseDate);
startActivity(intent)

在您的新活动中,只需执行以下操作即可检索:

 String id = getIntent().getExtras().getString("movie_id_key");

【讨论】:

但我将解析后的数据直接存储到 RecyclerView,查看私有 void parseResult(JSONObject 响应)。如何从那里获取项目数据? 电影项目是否显示在您的回收站视图中? 是的,他们出现了。我已经找到了解决方案。只需将代码中的“id”更改为 movies.get(position).getId();谢谢【参考方案2】:

将它们作为额外内容添加到您开始活动的意图中:

Intent intent = new Intent(currentActivity, targetActivity);
// Sree was right in his answer, it's putExtra, not putStringExtra. =(
intent.putExtra("title", title); 
// repeat for ID, Rating, ReleaseDate, urlPoster
startActivity(intent);

然后在另一个活动的 onCreate 中将它们拉出来

Intent startingIntent = getIntent();
String title = startingIntent.getStringExtra("title"); // or whatever.

回应以下评论: 我不是 100% 确定你是如何实现它的,但看起来你有传递位置和视图引用的 onclick 处理程序,对吗?随心所欲地调整它,但基本上......:

public void onClick(View v, int position)
    Movie m = movies.get(position);
    Intent intent = new Intent(v.getContext(), AnotherActivity.class);
    intent.putExtra("my_movie_foo_key", m.getFoo());
    intent.putExtra("my_movie_bar_key", m.getBar());
    // etc.
    v.getContext().startActivity(intent);

只要你有一个有效的上下文引用(并且他们不能在没有有效上下文的情况下点击视图),你就可以从任何你喜欢的地方开始一个活动。

【讨论】:

我把解析后的数据直接存到RecyclerView,看private void parseResult(JSONObject response)。如何从那里获取每个项目的“id”、“title”? 我在上面编辑过。只要你有一个有效的上下文,你就可以从任何你想要的地方开始一个活动(你可以从 onclick 中传递的视图中获取它)。

将数据从 RecyclerView.Adapter 传递到片段 onClick

】将数据从RecyclerView.Adapter传递到片段onClick【英文标题】:PassingdatafromRecyclerView.AdaptertofragmentonClick【发布时间】:2019-08-1916:18:19【问题描述】:我试图弄清楚如何将数据从RecyclerView中的单击项目获取到片段中的列表视图。我似... 查看详情

使用 Serializable - AndroidX 将数据从 RecyclerView 传递到 RecyclerViewMore

】使用Serializable-AndroidX将数据从RecyclerView传递到RecyclerViewMore【英文标题】:PassdatafromRecyclerViewtoRecyclerViewMoreusingSerializable-AndroidX【发布时间】:2020-02-0813:17:29【问题描述】:当我按下“查看所有项目”时,我想在Fragment中将Recycle... 查看详情

如何从 recyclerview 片段传递到另一个 recyclerview 片段

】如何从recyclerview片段传递到另一个recyclerview片段【英文标题】:Howtopassfromrecyclerviewfragmenttoanotherrecyclerviewfragment【发布时间】:2021-12-2607:15:27【问题描述】:有人可以帮助我了解如何将数据从一个recyclerview片段传输到另一个recy... 查看详情

如何将 ItemDecoration 从左侧和右侧都应用到 RecyclerView 项目?

】如何将ItemDecoration从左侧和右侧都应用到RecyclerView项目?【英文标题】:HowtoapplyItemDecorationfromleftandrightsidebothtoRecyclerViewitem?【发布时间】:2019-02-0200:34:18【问题描述】:长期以来,我一直在努力实现这一目标。我想要的是从左... 查看详情

如何将所选项目从 recyclerview 显示到文本输入

】如何将所选项目从recyclerview显示到文本输入【英文标题】:HowcanIdispalytheselecteditemfromrecycleviewtothetexinput【发布时间】:2021-03-2320:02:04【问题描述】:在下面的代码中,我想将recycleview中的选定项目显示到来自MyTextInput类的text_box... 查看详情

如何将 Web 服务数据传递到 Android 中的 RecyclerView?

】如何将Web服务数据传递到Android中的RecyclerView?【英文标题】:HowtopasswebservicedataintotheRecylerViewinAndroid?【发布时间】:2021-04-0113:31:36【问题描述】:我正在使用Retrofit从“https://jsonplaceholder.typicode.com/todos”获取数据,我想用这些... 查看详情

为啥我不能将数据从 RecyclerView 传递到另一个 RecyclerView - AndroidX

】为啥我不能将数据从RecyclerView传递到另一个RecyclerView-AndroidX【英文标题】:WhyIcannotpassdatafromRecyclerViewtoanotherRecyclerView-AndroidX为什么我不能将数据从RecyclerView传递到另一个RecyclerView-AndroidX【发布时间】:2020-02-0912:19:50【问题描... 查看详情

将对象列表从片段传递到 recyclerView 适配器

】将对象列表从片段传递到recyclerView适配器【英文标题】:PasslistofobjectfromfragmenttorecyclerViewAdapter【发布时间】:2022-01-0114:45:36【问题描述】:我正在使用SQLitedatabase做一个购物清单应用程序,我使用2个虚拟数据来测试数据库和... 查看详情

如何将价值从 Promise 'then' 发送到 'catch'?

】如何将价值从Promise\\\'then\\\'发送到\\\'catch\\\'?【英文标题】:HowtosendvaluefromPromise\'then\'to\'catch\'?如何将价值从Promise\'then\'发送到\'catch\'?【发布时间】:2017-12-2807:53:46【问题描述】:我只想问,如果resolve上的值不是预期的,... 查看详情

为什么我无法将数据从recyclerview传递到另一个recyclerview-androidx(代码片段)

我想使RecyclerView1Activity1中的数据可以传递给RecyclerView2Activity2//SectionAdapter.javapublicclassAdapterSectionHotTrendingNewsextendsRecyclerView.AdapterprivateContextmContext;privateArrayList<ModelSection 查看详情

从 AlertDialog 输入将项目添加到 RecyclerView

】从AlertDialog输入将项目添加到RecyclerView【英文标题】:AdditemtoRecyclerViewfromAlertDialoginput【发布时间】:2017-06-1319:45:57【问题描述】:在警报对话框中输入数据后,我目前无法将第二个以上的项目添加到RecyclerView。我可以输入一... 查看详情

将价值从 Mojo 传递到 pom

】将价值从Mojo传递到pom【英文标题】:PassingvaluefromMojotopom【发布时间】:2020-02-0710:07:52【问题描述】:我正在开发一个maven插件,我有一个名为“FinalVersion”的参数,它在Mojo中创建为@Parameter,并且它的值在Mojo类中设置。我需... 查看详情

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

】从片段中获取意图值后,我如何在recyclerview项目中实现单击【英文标题】:Aftergettingintentvaluefromfragmenthowcaniimplementinrecyclerviewitemclick【发布时间】:2021-12-3009:37:05【问题描述】:我在recyclerviewitemclick中设置了一个按钮,单击按... 查看详情

如何将数据从 jquery 代码传递到我的项目后端

】如何将数据从jquery代码传递到我的项目后端【英文标题】:HowcanIpassingdatafromjquerycodestomyprojectbackend【发布时间】:2021-10-2410:29:25【问题描述】:我确实在我的网站中创建了一个表单和一个提交按钮但我不知道如何将数据从javasc... 查看详情

如何将值从一个标签栏查看项目传递给另一个? [复制]

】如何将值从一个标签栏查看项目传递给另一个?[复制]【英文标题】:HowtopassvaluefromonetabbarViewitemtoother?[duplicate]【发布时间】:2019-08-1514:21:56【问题描述】:我在新闻标签中有一个按钮,我想以任何方式将价值传递给竞赛标签... 查看详情

如何将从列表中选择的多个项目传递到下一个视图?

】如何将从列表中选择的多个项目传递到下一个视图?【英文标题】:HowdoIpassmultipleitemsselectedfromlisttonextview?【发布时间】:2021-09-1617:11:07【问题描述】:在我看来,我问了用户2个问题。在每个问题下方,我都有一个列表,允许... 查看详情

如何将项目从淘汰赛 foreach 传递到部分视图作为数据绑定?

】如何将项目从淘汰赛foreach传递到部分视图作为数据绑定?【英文标题】:Howtopassanitemfromknockoutforeachtopartialviewasdata-bind?【发布时间】:2021-04-2505:05:55【问题描述】:我有一个包含对象列表myListB()的表格,这些对象由knockoutforeach... 查看详情

如何在单击 RecyclerView 项目时从一个片段移动到另一个片段

】如何在单击RecyclerView项目时从一个片段移动到另一个片段【英文标题】:HowtomovefromonefragmenttoanotherfragmentonclickofaRecyclerViewitem【发布时间】:2018-05-1705:12:10【问题描述】:我想单击RecyclerView上的一个项目(在列表片段上),然... 查看详情