【问题标题】:How to navigate from recycler view to an other activity and pass parameters如何从回收站视图导航到其他活动并传递参数
【发布时间】:2020-12-01 13:41:18
【问题描述】:

我实现了一个回收器视图,它工作正常,但是当我想处理按钮的单击时,我在回收器视图片段中使用了一个意图,但似乎我不能在这里使用意图将参数传递给一个活动并导航到它

//我的回收器视图适配器

package com.example.miniprojetandroid.adapters;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.miniprojetandroid.R;
import com.example.miniprojetandroid.models.Bike;
import com.example.miniprojetandroid.ui.activities.BikeDetails;
import com.example.miniprojetandroid.ui.activities.MainActivity;


public class BikesAdapter  extends RecyclerView.Adapter<BikesAdapter.BikesViewHolder> {

    private final ArrayList<Bike> bikes;
    private Context mContext;

public BikesAdapter(Context mContext, ArrayList<Bike> bikes) {
        this.mContext = mContext ;
        this.bikes = bikes;
        }

@NonNull
@Override
public BikesAdapter.BikesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View mItemView = LayoutInflater.from(mContext).inflate(R.layout.bike_list_item, parent, false);

        return new BikesViewHolder(mItemView, this);
        }

@Override
public void onBindViewHolder(@NonNull BikesAdapter.BikesViewHolder holder, int position) {
final Bike singleItem = bikes.get(position);

        holder.BikeName.setText(singleItem.getModel());

        holder.BikeImage.setBackgroundResource(singleItem.getImage());
        holder.bikeView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(this, BikeDetails.class);
                intent.putExtra("bike_id", singleItem.getId());
                intent.putExtra("model", singleItem.getModel());
                intent.putExtra("type", singleItem.getType());
                intent.putExtra("price",   singleItem.getPrice());
                intent.putExtra("image",  singleItem.getImage());
                startActivity(intent);
                finish();
            }
        });
        holder.BikeImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
        Toast.makeText(mContext,singleItem.getModel(),Toast.LENGTH_SHORT).show();
        }
        });
        }

@Override
public int getItemCount() {
        return bikes.size();
        }

public class BikesViewHolder extends RecyclerView.ViewHolder {

    public final TextView BikeName;
    public final ImageView BikeImage;
    public final Button bikeView;
    final BikesAdapter mAdapter;

    public BikesViewHolder(@NonNull View itemView, BikesAdapter mAdapter) {
        super(itemView);
        this.BikeName = itemView.findViewById(R.id.bikeName);
        this.BikeImage = itemView.findViewById(R.id.bikeImage);
        this.bikeView = itemView.findViewById(R.id.btn_view);
        this.mAdapter = mAdapter;
    }
}



}

如何在单击 bikeView 按钮后使用意图参数导航到 BikeDetails? 为什么这里无法识别意图?

整个问题出在以下几行:

holder.bikeView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(this, BikeDetails.class);
                intent.putExtra("bike_id", singleItem.getId());
                intent.putExtra("model", singleItem.getModel());
                intent.putExtra("type", singleItem.getType());
                intent.putExtra("price",   singleItem.getPrice());
                intent.putExtra("image",  singleItem.getImage());
                startActivity(intent);
                finish();
            }
        });

【问题讨论】:

    标签: android android-intent android-recyclerview


    【解决方案1】:

    您应该使用回调将事件传递到使用您的 RecyclerView 的活动中。 查看这篇文章https://medium.com/pongploydev/how-to-use-listener-interface-callback-in-activity-fragment-ff3733c80ddd 了解更多信息。

    【讨论】:

    • 如果我删除 DetailsActivity 并将其替换为一个片段,该片段将显示回收器视图所选项目的详细信息,但我想知道片段如何将对象 Bike 传递给另一个片段
    【解决方案2】:

    当你创建一个启动一个activity的intent时,第一个参数应该是一个Context并且startActivity方法属于Context类,而不是RecyclerView.Adapter。此外,finish 方法属于 Activity,因此从适配器调用它也不起作用。

    下面的示例应该让您大致了解如何使其工作。

    holder.bikeView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Context context = v.getContext();
            Intent intent = new Intent(context, BikeDetails.class);
            // extras
            context.startActivity(intent);
        }
    });
    

    旁注:您的 Bike 对象可以是 Parcelable 的一个实现,这样您就不需要将它的每个字段作为额外的内容传递给您的意图,您可以简单地传递整个内容,如下所示:

    // Passing data
    intent.putExtra("bike", singleItem);
    
    // Fetching data
    Bike bike = getIntent().getParcelableExtra<Bike>("bike");
    

    【讨论】:

    • intent.putExtra("bike", singleItem);没用,看来行是红色的,语法错误
    • 这可能是因为您的 Bike 类还不是 Parcelable 的实现。但这并不完全在这个问题的范围内,这只是一个提示
    • 我做到了,从回收者视图片段到 BikeDetails 活动的数据为空
    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多