如何将引用从 RecyclerView 传递给另一个 activity

How to pass reference from RecyclerView to another activity

我的代码有问题。我需要将引用从 RecylerViewAdapter.java 传递到 DrinkActivity.java。当我在 RecyclerView 上单击一个项目时,它应该将位置传递给 DrinkActivity,以便我可以显示名称和价格。在 Home.java 中显示名称、价格和图像时没有问题。但是,当我 运行 它在 DrinkActivity 上出现空指针异常时,我不知道发生了什么。

谢谢。

This is the screenshot of my recyclerview

This is the screenshot after clicked on an item

这是我的RecylerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.myViewHolder> {

private Context mContext;
private List<Drink> mData;

RequestOptions option;

public RecyclerViewAdapter(Context mContext, List<Drink> mData) {
    this.mContext = mContext;
    this.mData = mData;

    //Request option for Glide
    option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);
}

@Override
public myViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.drink_item, parent, false);

    final myViewHolder viewHolder = new myViewHolder(view);

    viewHolder.view_container.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(mContext, DrinkActivity.class);
            i.putExtra("name", mData.get(viewHolder.getAdapterPosition()).getName());
            i.putExtra("price", mData.get(viewHolder.getAdapterPosition()).getPrice());
            i.putExtra("img", mData.get(viewHolder.getAdapterPosition()).getImage_url());

            mContext.startActivity(i);
        }
    });

    return viewHolder;
}

@Override
public void onBindViewHolder(myViewHolder myViewHolder, int position) {
    myViewHolder.drink_name.setText(mData.get(position).getName());
    myViewHolder.drink_price.setText(String.valueOf(mData.get(position).getPrice()));

    Glide.with(mContext).load(mData.get(position).getImage_url()).apply(option).into(myViewHolder.img_thumbnail);
}

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

    public static class myViewHolder extends RecyclerView.ViewHolder {

        TextView drink_name;
        TextView drink_price;
        ImageView img_thumbnail;

        LinearLayout item_drink;
        LinearLayout view_container;

        public myViewHolder(View itemView) {
            super(itemView);

            view_container = (LinearLayout) itemView.findViewById(R.id.container);

            item_drink = (LinearLayout) itemView.findViewById(R.id.drink_item_id);

            drink_name = itemView.findViewById(R.id.name);
            drink_price = itemView.findViewById(R.id.price);
            img_thumbnail = itemView.findViewById(R.id.thumbnail);
        }
    }    
}

这是Home.java

public class Home extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private RecyclerView recycler_menu;
private RecyclerView.LayoutManager layoutManager;

private List<Drink> drinkList = new ArrayList<>();

DatabaseReference dbDrink;

Dialog myDialog;
TextView titleTv, priceTv;

public Home(){

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle("Customer");
    setSupportActionBar(toolbar);

    myDialog = new Dialog(this);

    dbDrink = FirebaseDatabase.getInstance().getReference().child("Drink");

    final FirebaseDatabase database = FirebaseDatabase.getInstance();

    //Load drink
    recycler_menu = (RecyclerView) findViewById(R.id.recyclerview_id);
    recycler_menu.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    recycler_menu.setLayoutManager(layoutManager);

    loadDrink();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);


}

private void loadDrink() {
    FirebaseRecyclerAdapter<Drink, DrinkViewHolder> adapter = new FirebaseRecyclerAdapter<Drink, DrinkViewHolder>(Drink.class, R.layout.drink_item, DrinkViewHolder.class, dbDrink) {

        @Override
        protected void populateViewHolder(DrinkViewHolder viewHolder, final Drink model, int position) {

            viewHolder.txtDrinkName.setText(model.getName());
            viewHolder.txtPrice.setText(String.valueOf(model.getPrice()));

            Picasso.get().load(model.getImage_url())
                    .into(viewHolder.imageView);
            final Drink clickItem = model;

            viewHolder.setItemClickListener(new ItemClickListener() {

                @Override
                public void onClick(View view, int position, boolean isLongClick) {
                    Toast.makeText(Home.this, "" + clickItem.getName(), Toast.LENGTH_SHORT).show();

                    Intent main =  new Intent(Home.this, DrinkActivity.class);
                    main.putExtra("name", model.getName());
                    main.putExtra("price", model.getPrice());
                    main.putExtra("img", model.getImage_url());
                    startActivity(main);
                }
            });
        }
    };
    recycler_menu.setAdapter(adapter);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.home, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_menu) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

这是DrinkActivity.java

    public class DrinkActivity extends AppCompatActivity {

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

        TextView tv_name = (TextView) findViewById(R.id.name);
        TextView tv_price = (TextView) findViewById(R.id.price);

        String name = getIntent().getExtras().getString("name");
        double price = getIntent().getExtras().getDouble("price");

        tv_name.setText(name);
        tv_price.setText(String.valueOf(price));

        }    
    }

在您的适配器的 onClick 中,您在不传递任何数据的情况下启动 DrinkActivity:

Intent main =  new Intent(Home.this, DrinkActivity.class);
startActivity(main);

您还需要传递名称和价格,即

Intent main =  new Intent(Home.this, DrinkActivity.class);
main.putExtra("name", model.getName());
main.putExtra("price", model.getPrice());
startActivity(main);