英文:
How to pass data from RecyclerView to activity
问题
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);
// ... (skipping navigation setup)
datepicker = findViewById(R.id.calendarView);
ListRecipes();
adapterRecipe = new RecipeListAdapter(this, listRecipe);
recipeList = findViewById(R.id.recipes);
// ... (skipping RecyclerView setup)
recipeList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("Recipe name is", recipe_name);
}
});
// ... (skipping date handling and submit button click event)
}
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;
public RecipeListAdapter(Context context, List<Category> data) {
this.mInflater = LayoutInflater.from(context);
this.listRecipe = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.cardview_recipe, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull 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());
}
@Override
public int getItemCount() {
return listRecipe.size();
}
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(new View.OnClickListener() {
@Override
public void onClick(View view) {
String recipe_name = myTextView1.getText().toString();
}
});
}
@Override
public void onClick(View v) {
// Handle click event if needed
}
}
void setClickListener(com.stu54259.plan2cook.Adapters.RecipeListAdapter.ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
public interface ItemClickListener {
void onItemClick(View view, int position);
}
}
英文:
I'm really struggling with this, what I need is when the user clicks on the recipe image, which comes from the ArrayList listRecipe
put into the RecyclerView
, the value from myTextView1
should be passed to the CreateMealPlan
activity so it can be saved along with the date to an SQLite database.
Hope I've made this clear, thanks in advance for any help.
Activity
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();
}
}
}
RecyclerAdapter
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
得分: 1
你应该:
- 定义一个用于处理点击事件的接口(类似于你的
ItemClickListener
); - 通过匿名类或扩展你的
Activity
来实现这个接口; - 将这个新接口的实例传递给你的适配器;
- 设置点击监听器,处理点击事件并将数据传递回你的Activity。
步骤1:定义一个接口
示例接口:
interface OnRecipeClickListener {
void onRecipeClicked(int position, String someString);
}
步骤2:实现接口
这部分位于你的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;
// 数据在构造函数中传递
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);
英文:
You should:
- Define an interface that will be used to handle click events (similar to your
ItemClickListener
); - Implement this interface as an anonymous class or by extending your
Activity
; - Pass that instance of the new interface to your adapter;
- Set click listener, handle click events and pass data back into your Activity.
Step 1: define an interface
Sample interface:
interface OnRecipeClickListener {
void onRecipeClicked(int position, String someString);
}
Step 2: implement the interface
This part is located inside of your Activity
class:
new OnRecipeClickListener() {
public void onRecipeClicked(int position, String someString) {
Log.d(CreateMealPlan.class.getSimpleName(), "Here is the data: " + someString);
}
}
Step 3: passing this interface to the adapter
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;
}
...
}
Step 4: setting click listeners to view holders
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());
}
});
}
...
}
Code from Step 2 can be used like that:
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);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论