【问题标题】:How to get details when clicking on an item in a RecyclerView?单击 RecyclerView 中的项目时如何获取详细信息?
【发布时间】:2020-04-01 10:10:47
【问题描述】:

我正在尝试获取我在回收站视图中单击的配方的详细信息。我正在使用它来进行编辑/删除功能。这是我的主要活动的代码。

我想要获取的详细信息是获取名称、成分和方法。

public class MainActivity extends AppCompatActivity implements RecipeListAdapter.OnItemClickListener  {
    private RecipeViewModel mRecipeViewModel;
    public static final int NEW_WORD_ACTIVITY_REQUEST_CODE = 1;
    public String Name;
    public String Ingredients;
    public String Method;
    private RecipeListAdapter mAdapter;
    private RecipeDao recDao;
    private LiveData<List<Recipe>> RecipeList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        final RecipeListAdapter adapter = new RecipeListAdapter(this);
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(MainActivity.this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecipeViewModel = new ViewModelProvider(this).get(RecipeViewModel.class);

        mRecipeViewModel.getAllRecipes().observe(this, new Observer<List<Recipe>>() {
            @Override
            public void onChanged(@Nullable final List<Recipe> recipes) {
                // Update the cached copy of the words in the adapter.
                adapter.setWords(recipes);
            }
        });

        void onItemClick(int position) {
        //Delete Below test to pass data through
        Recipe recipe = new Recipe("Test", "Yeet", "Jim");


   // showAlertDialogBox();
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
    alertDialog.setTitle("Edit or Delete...");
    alertDialog.setPositiveButton("Edit", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Intent update = new Intent(MainActivity.this, UpdateRecipeActivity.class);
            update.putExtra("Name", recipe.getName());
            update.putExtra("Ingredients", recipe.getIngredients());
            update.putExtra("Method", recipe.getMethod());
            startActivity(update);
        }
    });
    alertDialog.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            //Delete
        }
    });
    alertDialog.show();
}

如果您需要,这里是 Recipe.class!

@Entity(tableName = "recipe_table")
public class Recipe {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name= "recipeId")
private int RecipeId;
private String name;
private String Ingredients;
private String Method;
@Ignore
public Recipe(String name, String Ingredients, String Method) {
    this.RecipeId = RecipeId;
    this.name = name;
    this.Ingredients = Ingredients;
    this.Method = Method;
}

public Recipe(String name) {
    this.name = name;
}

public void changeText1(String text){
    name = text;
}

//Add Image somehow!


public int getRecipeId() {
    return RecipeId;
}

public void setRecipeId(int recipeId) {
    RecipeId = recipeId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getMethod() {
    return Method;
}

public void setMethod(String method) {
    Method = method;
}

public String getIngredients() {
    return Ingredients;
}

public void setIngredients(String ingredients) {
    Ingredients = ingredients;
}
}

如果您需要更多文件,这些是我拥有的文件: - 食谱列表适配器 - 食谱道 - 食谱库 -RecipeRoomDatabase - 配方视图模型

配方适配器代码

公共类 RecipeListAdapter 扩展 RecyclerView.Adapter { 私人 OnItemClickListener mListener; 私有列表 recipeList;

public interface OnItemClickListener{
    void onItemClick(int position, Recipe recipe);

}
public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}





class RecipeViewHolder extends RecyclerView.ViewHolder {
    private final TextView recipeItemView;

    private RecipeViewHolder(View itemView) {
        super(itemView);
        recipeItemView = itemView.findViewById(R.id.textView);
        itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                if (mListener != null){
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION){
                        mListener.onItemClick(position, 
  recipeList.get(getAdapterPosition()));
                    }
                }
            }
        });
    }
}

private final LayoutInflater mInflater;
private List<Recipe> mRecipes; // Cached copy of words

RecipeListAdapter(Context context) {
    mInflater = LayoutInflater.from(context);
    this.recipeList = recipeList;
}

@Override
public RecipeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = mInflater.inflate(R.layout.recyclerview_item, parent, 
false);
    return new RecipeViewHolder(itemView);
}

@Override
public void onBindViewHolder(RecipeViewHolder holder, int position) {
    if (mRecipes != null) {
        Recipe current = mRecipes.get(position);
        holder.recipeItemView.setText(current.getName());
    } else {
        // Covers the case of data not being ready yet.
        holder.recipeItemView.setText("No Recipes");
    }
}

void setWords(List<Recipe> recipes){
    mRecipes = recipes;
    notifyDataSetChanged();
}

// getItemCount() is called many times, and when it is first called,
// mWords has not been updated (means initially, it's null, and we can't 
return null).
@Override
public int getItemCount() {
    if (mRecipes != null)
        return mRecipes.size();
    else return 0;
}
public interface OnNoteListener{}
}

【问题讨论】:

  • 目前还不清楚,能具体说说你想做什么吗?
  • 所以当我加载应用程序时,它会填充来自数据库等的食谱列表。基本上,当我点击那个项目(例如 Toast)时,它给了我一个编辑/删除的选项这个项目。如果我单击编辑,它会将您带到另一个活动,其中包含吐司的所有信息,例如方法和成分。我正在努力获取我点击的项目的信息
  • 看起来你做的一切都是正确的,那么你现在面临的问题是什么?
  • 这是同一个question。你可以看看。
  • 我只是不确定如何从我在回收站视图中单击的项目中获取所选配方的详细信息

标签: java android android-recyclerview adapter


【解决方案1】:

在onItemClick内部还有一个参数需要添加。

void onItemClick(int position, Recipe recipe) {
        //Delete selected recipe from recipe list
        arrayList.remove(recipe)
}

onItemClick 方法将从适配器调用,您必须从那里传递选定的收据。在适配器中,您必须使用 recipeList.get(getAdapterPosition()) 来获取点击的收据并将其传递给接口方法 onItemClick 以及位置。

所以你的代码在适配器中看起来像这样,

itemClickListener.onItemClick(位置, recipeList.get(getAdapterPosition()))

请注意,请确保您需要使用ArrayList而不是List来执行删除操作。

【讨论】:

  • 谢谢,我刚刚尝试过,但无法正常工作。当我单击回收站视图中的项目时,它崩溃了。我已将适配器类代码放在主问题线程上。
  • 而不是 recipeList.get(getAdapterPosition()),从 mRecipes.get(getAdapterPosition()) 中获取单击的项目。请尝试这样做,如果它不能解决问题,请检查 logcat,以了解执行期间发生的异常。所以这将有助于解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2021-01-20
相关资源
最近更新 更多