如何在使用 recyclerview 单击项目片段时将数据传递到 activity

how to passing data when clicked on item fragment with recyclerview to activity

我对将点击的卡片视图数据传递给 activity 有疑问 如何当用户单击项目时,它会打开 PlayerActivity.class,并更改详细信息布局标题、urlimage、单击的项目标题和相同的描述。 这是我的文件:

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

}

希望有人能帮助我,谢谢

首先在如下任意位置创建一个新界面(ClickListener.java):

interface ClickListener {
    void onClickData(String value);
}

然后将其作为构造函数参数添加到Adapter中。
Adapter中也不需要Context参数(至少我还没有发现任何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);