【问题标题】:How to pass reference from RecyclerView to another activity如何将 RecyclerView 的引用传递给另一个活动
【发布时间】:2018-12-30 03:15:36
【问题描述】:

我的代码有问题。我需要将 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));

        }    
    }

【问题讨论】:

  • getName() 正在返回 null

标签: java android android-recyclerview android-studio-3.0


【解决方案1】:

在您的适配器的 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);

【讨论】:

  • 我已经更新了 Home.java 和点击项目后的截图
  • @Chxk 确保价格类型正确(float、double、int)
猜你喜欢
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多