单击带有recyclerview的项目片段时如何将数据传递给活动

Posted

技术标签:

【中文标题】单击带有recyclerview的项目片段时如何将数据传递给活动【英文标题】:how to passing data when clicked on item fragment with recyclerview to activity 【发布时间】:2021-01-12 09:59:52 【问题描述】:

我有一个关于将点击的卡片视图数据传递给活动的问题 当用户点击item时,它会打开PlayerActivity.class,并改变Details布局标题,urlimage,点击item的标题,描述也一样。 这是我的文件:

myadapter.java

public class NettvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 
private final List<item_kenh> recyclerViewItems;
private final Context mContext;
Tab1_Fragment fragmenttab1;


public NettvAdapter(Context context, List<item_kenh> recyclerViewItems,Tab1_Fragment fragmenttab1) 
    this.mContext = context;
    this.recyclerViewItems = recyclerViewItems;
    this.fragmenttab1 = fragmenttab1;


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) 

    View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_kenh, null);
    return new MenuItemViewHolder(itemLayoutView);




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

    MenuItemViewHolder menuItemHolder = (MenuItemViewHolder) holder;
    final item_kenh fp = (item_kenh) recyclerViewItems.get(position);

    //menuItemHolder.titles.setText(fp.getTitle());
   // menuItemHolder.profile.setText(fp.getProfiles());
    String url = fp.getUrl_images();
    Picasso.get().load(url).into(menuItemHolder.thumb);

    menuItemHolder.thumb.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
           fragmenttab1.clikcData(fp.getUrl_images());


        
    );

   // menuItemHolder.titles.setOnClickListener(new View.OnClickListener() 
    //    @Override
   //     public void onClick(final View v) 
    //        fragmentone.clikcData(fp.getTitle());
    //    
    //);



@Override
public int getItemCount() 
    return recyclerViewItems.size();



public class MenuItemViewHolder extends RecyclerView.ViewHolder 
   // public TextView titles;
    public ImageView thumb;
   // public TextView profile;
   // public LinearLayout lineLayout;

    MenuItemViewHolder(View itemLayoutView) 
        super(itemLayoutView);

       // titles      = (TextView) itemLayoutView.findViewById(R.id.title);
        thumb       = (ImageView) itemLayoutView.findViewById(R.id.imageView);
        //profile     = (TextView) itemLayoutView.findViewById(R.id.profiles);
        //lineLayout = (LinearLayout) itemLayoutView.findViewById(R.id.midlelayout);


    

tab_1.java(片段)

public class Tab1_Fragment extends Fragment 


public static final String TAG = "MYTAG";
RequestQueue QUEUE;
String URLHTTP;

private List<item_kenh> mRecyclerViewItems = new ArrayList<>();
private RecyclerView.Adapter mAdapter;
RecyclerView rv;

public static Tab1_Fragment getInstance()

    Tab1_Fragment fragmenttab1 = new Tab1_Fragment();
    return fragmenttab1;


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

public Tab1_Fragment() 
    // Required empty public constructor


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    final  View rootView = inflater.inflate(R.layout.fragment_tab1,container,false);
    rv = (RecyclerView)rootView.findViewById(R.id.rv_tab1);

    rv.setHasFixedSize(true);
    rv.setLayoutManager(new LinearLayoutManager(getContext()));
    rv.setLayoutManager(new GridLayoutManager(getContext(), 3));
    mAdapter    = new NettvAdapter(getContext(),mRecyclerViewItems,this);
    QUEUE = Volley.newRequestQueue(getContext());
    URLHTTP = getResources().getString(R.string.urlserver);
    httpGET(URLHTTP);
    mRecyclerViewItems.clear();
    return rootView;





public void httpGET(String url)

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() 
                @Override
                public void onResponse(String response) 
                    parsingData(response);
                
            , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 
            try 
                String responseBody = new String(error.networkResponse.data,"utf-8");
                Log.d(TAG,"ERROR "+responseBody);
            catch (UnsupportedEncodingException errorr)
                Log.d(TAG,errorr.toString());
            
        
    
    );
    QUEUE.add(stringRequest);



public void parsingData(String jsonData)

    try 
        JSONObject obj = new JSONObject(jsonData);
        JSONArray m_jArry = obj.getJSONArray("data");

        for (int i = 0; i < m_jArry.length(); i++) 
            JSONObject jo_inside = m_jArry.getJSONObject(i);
            String url_img = jo_inside.getString("url_img");
            item_kenh stationItem = new item_kenh(url_img);
            mRecyclerViewItems.add(stationItem);

        

        rv.setAdapter(mAdapter);
     catch (JSONException e) 
        e.printStackTrace();
    




public void clikcData(String datatitle)


    Intent int_detail = new Intent(getContext(), PlayerActivity.class);
    int_detail.putExtra("url_img", position);
    getActivity().startActivity(int_detail);


PlayerActivity.java

public class PlayerActivity extends AppCompatActivity 




@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_player);

    ImageView imageView = findViewById(R.id.image);

    Intent intent = getIntent();
    String imageUrl = intent.getStringExtra("url_img");
    Picasso.get().load(imageUrl).fit().centerInside().into(imageView);

希望有人能帮助我,谢谢

【问题讨论】:

【参考方案1】:

首先在下面的任何地方创建一个新接口(ClickListener.java):

interface ClickListener 
    void onClickData(String value);

然后将它作为构造函数参数添加到Adapter中。 另外在Adapter中也不需要Context参数(至少我没有找到任何上下文需求。) 但是,如果您需要 onBindViewHolder 中的上下文,您应该使用holder.itemView.getContext()

public class NettvAdapter extends RecyclerView.Adapter<NettvAdapter.MenuItemViewHolder> 
private final List<item_kenh> recyclerViewItems;
private listener ClickListener;


public NettvAdapter(List<item_kenh> recyclerViewItems, ClickListener listener) 
    this.recyclerViewItems = recyclerViewItems;
    this.listener = listener;


@Override
public NettvAdapter.MenuItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) 

    View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_kenh, null);
    return new MenuItemViewHolder(itemLayoutView);




@Override
public void onBindViewHolder(NettvAdapter.MenuItemViewHolder holder, final int position) 

    final item_kenh fp = (item_kenh) recyclerViewItems.get(holder.getAdapterPosition());

    //menuItemHolder.titles.setText(fp.getTitle());
   // menuItemHolder.profile.setText(fp.getProfiles());
    String url = fp.getUrl_images();
    Picasso.get().load(url).into(holder.thumb);

    holder.thumb.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
           listener.onClickData(fp.getUrl_images());
        
    );



@Override
public int getItemCount() 
    return recyclerViewItems.size();



public class MenuItemViewHolder extends RecyclerView.ViewHolder 
   // public TextView titles;
    public ImageView thumb;
   // public TextView profile;
   // public LinearLayout lineLayout;

    MenuItemViewHolder(View itemLayoutView) 
        super(itemLayoutView);

       // titles      = (TextView) itemLayoutView.findViewById(R.id.title);
        thumb       = (ImageView) itemLayoutView.findViewById(R.id.imageView);
        //profile     = (TextView) itemLayoutView.findViewById(R.id.profiles);
        //lineLayout = (LinearLayout) itemLayoutView.findViewById(R.id.midlelayout);


    

然后在你的 Fragment 中实现ClickListener

Tab1_Fragment extends Fragment implements ClickListener 

@Override 
void onClickData(String clickedValue) 
    Intent int_detail = new Intent(getContext(), PlayerActivity.class);
    int_detail.putExtra("url_img", clickedValue);
    getActivity().startActivity(int_detail);
  

并像以前一样初始化您的适配器: mAdapter = new NettvAdapter(mRecyclerViewItems, this);

【讨论】:

以上是关于单击带有recyclerview的项目片段时如何将数据传递给活动的主要内容,如果未能解决你的问题,请参考以下文章

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

单击 recyclerView 项目时未打开新片段

在使用 FirebaseRecyclerPagingAdapter 时,第二次单击 RecyclerView 中的项目时,片段显示为空

如何在片段中的 recyclerView 上打开不同的活动?

单击recyclerview上的项目时的多个数据

一旦单击带有 in 片段的回收器列表项,如何将片段意向活动,以及如何获取回收器项目值?