繁体   English   中英

如何将数据从 RecyclerView 传递给活动

[英]How to pass data from RecyclerView to activity

我真的很ArrayList listRecipe这个,我需要的是当用户点击来自ArrayList listRecipe的菜谱图片时,它被放入RecyclerView ,来自myTextView1的值应该传递给CreateMealPlan活动,以便它可以与SQLite 数据库的日期。

希望我已经说清楚了,在此先感谢您的帮助。

活动

    public class CreateMealPlan extends MainActivity {

    DatePicker datepicker;
    Button submit;
    List<com.stu54259.plan2cook.Model.Category> listRecipe = new ArrayList<>();
    SQLiteDatabase db;
    Cursor c;
    RecyclerView recipeList;
    RecipeListAdapter adapterRecipe;
    String recipe_name;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create_meal_plan);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.home:
                        Intent a = new Intent(CreateMealPlan.this,MainActivity.class);
                        startActivity(a);
                        break;
                    case R.id.recipes:
                        Intent b = new Intent(CreateMealPlan.this,RecipeSearch.class);
                        startActivity(b);
                        break;
                    /*case R.id.shoppingList:
                        Intent c = new Intent(CreateMealPlan.this, ShoppingList.class);
                        startActivity(c);
                        break;*/
                    case R.id.mealPlan:
                        Intent d = new Intent(CreateMealPlan.this, MenuPlan.class);
                        startActivity(d);
                        break;
                    /*case R.id.reminder:
                        Intent e = new Intent(CreateMealPlan.this, Reminder.class);
                        startActivity(e);
                        break*/
                }
                return false;
            }
        });
        datepicker = findViewById(R.id.calendarView);
        ListRecipes();
        adapterRecipe = new RecipeListAdapter(this, listRecipe);
        recipeList = findViewById(R.id.recipes);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL, false);
        recipeList.setLayoutManager(mLayoutManager);
        recipeList.setItemAnimator(new DefaultItemAnimator());
        recipeList.setAdapter(adapterRecipe);
        recipeList.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            Log.d("Recipe name is", recipe_name);
            }
        });

        int day = datepicker.getDayOfMonth();
        int month = datepicker.getMonth();
        int year = datepicker.getYear();
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
        Date d_name = new Date(day, month, year);
        String dayOfTheWeek = sdf.format(d_name);
        submit = (Button) findViewById(R.id.create);

        // perform click event on submit button
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }

            });
    }
    public void ListRecipes() {
        listRecipe.clear();
        db = (new DatabaseManager(this).getWritableDatabase());
        String selectQuery = " SELECT recipe_name, image, image2, category" + " FROM " + DatabaseManager.TABLE_RECIPE + "  GROUP BY recipe_name";
        c = db.rawQuery(selectQuery, null);
        Log.d("Query", selectQuery);
        if (c.moveToFirst()) {
            do {
                com.stu54259.plan2cook.Model.Category category = new com.stu54259.plan2cook.Model.Category();
                category.setRecipe_name(c.getString(c.getColumnIndex("recipe_name")));
                category.setImage(c.getInt(c.getColumnIndex("image")));
                category.setImage2(c.getString(c.getColumnIndex("image2")));
                category.setCategory_name(c.getString(c.getColumnIndex("category")));
                listRecipe.add(category);
            } while (c.moveToNext());
            c.close();
        }

    }

}

回收器适配器

    public class RecipeListAdapter extends RecyclerView.Adapter<com.stu54259.plan2cook.Adapters.RecipeListAdapter.ViewHolder> {

        private List<Category> listRecipe;
        private LayoutInflater mInflater;
        private com.stu54259.plan2cook.Adapters.RecipeListAdapter.ItemClickListener mClickListener;

        // data is passed into the constructor
        public RecipeListAdapter(Context context, List<Category> data) {
            this.mInflater = LayoutInflater.from(context);
            this.listRecipe = data;
        }

        // inflates the row layout from xml when needed
        @Override
        public com.stu54259.plan2cook.Adapters.RecipeListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = mInflater.inflate(R.layout.cardview_recipe, parent, false);
            return new com.stu54259.plan2cook.Adapters.RecipeListAdapter.ViewHolder(view);
        }


        @Override
        public void onBindViewHolder(@NonNull com.stu54259.plan2cook.Adapters.RecipeListAdapter.ViewHolder holder, int position) {
            holder.myTextView1.setText(listRecipe.get(position).getRecipe_name());
            holder.myTextView2.setText(listRecipe.get(position).getCategory_name());
            String image2 = listRecipe.get(position).getImage2();
            Bitmap myBitmap = BitmapFactory.decodeFile(image2);
            if (myBitmap != null)
                holder.imgImage.setImageBitmap(myBitmap);
            else
                holder.imgImage.setImageResource(listRecipe.get(position).getImage());

        }


        // total number of rows
        @Override
        public int getItemCount() {
            return listRecipe.size();
        }


        // stores and recycles views as they are scrolled off screen
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            TextView myTextView1;
            TextView myTextView2;
            ImageView imgImage;

            ViewHolder(View itemView) {
                super(itemView);
                myTextView1 = itemView.findViewById(R.id.txtName);
                myTextView2 = itemView.findViewById(R.id.txtCategory);
                imgImage = itemView.findViewById(R.id.imgImage);
                myTextView1.setOnClickListener(this);

                myTextView1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        String recipe_name = myTextView1.getText().toString();
                    }
                });
            }

            /**
             * Called when a view has been clicked.
             *
             * @param v The view that was clicked.
             */
            @Override
            public void onClick(View v) {

            }
        }


        // allows clicks events to be caught
        void setClickListener(com.stu54259.plan2cook.Adapters.RecipeListAdapter.ItemClickListener itemClickListener) {
            this.mClickListener = itemClickListener;
        }

        // parent activity will implement this method to respond to click events
        public interface ItemClickListener {
            void onItemClick(View view, int position);


        }
    }

你应该:

  1. 定义一个将用于处理点击事件的接口(类似于您的ItemClickListener );
  2. 将此接口实现为匿名类或通过扩展您的Activity
  3. 将新接口的实例传递给您的适配器;
  4. 设置单击侦听器,处理单击事件并将数据传回您的活动。

第一步:定义接口

示例界面:

interface OnRecipeClickListener {
    void onRecipeClicked(int position, String someString);
}

第二步:实现接口

这部分位于您的Activity类中:

new OnRecipeClickListener() {
    public void onRecipeClicked(int position, String someString) {
        Log.d(CreateMealPlan.class.getSimpleName(), "Here is the data: " + someString);
    }
}

第 3 步:将此接口传递给适配器


public class RecipeListAdapter extends RecyclerView.Adapter<com.stu54259.plan2cook.Adapters.RecipeListAdapter.ViewHolder> {

    ...
    private OnRecipeClickListener clickListener;

    // data is passed into the constructor
    public RecipeListAdapter(Context context, List<Category> data, OnRecipeClickListener clickListener) {
        ...
        this.clickListener = clickListener;
    }

    ...
}

第 4 步:设置点击监听器以查看持有者


public class RecipeListAdapter extends RecyclerView.Adapter<com.stu54259.plan2cook.Adapters.RecipeListAdapter.ViewHolder> {

    ...
        @Override
    public void onBindViewHolder(@NonNull com.stu54259.plan2cook.Adapters.RecipeListAdapter.ViewHolder holder, int position) {
        ...
        holder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                clickListener.onRecipeClicked(position,
                                              holder.textView1.getText().toString());
            } 
        });
    }

    ...
}

步骤 2 中的代码可以这样使用:

OnRecipeClickListener listener = new OnRecipeClickListener() {
    public void onRecipeClicked(int position, String someString) {
        Log.d(CreateMealPlan.class.getSimpleName(), "Here is the data: " + someString);
    }
};

adapterRecipe = new RecipeListAdapter(this, listRecipe, listener);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM