使用按钮删除 Listview w/ArrayAdapter 中的选定项目
Posted
技术标签:
【中文标题】使用按钮删除 Listview w/ArrayAdapter 中的选定项目【英文标题】:Using button to delete selected item in Listview w/ ArrayAdapter 【发布时间】:2021-06-17 20:47:36 【问题描述】:我已经使用 Java 几个月了,但对 android 还是很陌生。这是一个食谱持有者应用程序。
我在 ListView 上设置了 ArrayAdapter,我需要在 ListView 中选择一个项目并使用 Button 将其删除(我已经成功设置了将字符串添加到 Listview)。我将 ArrayList 用于存储成分对象的列表,而不是常规数组。我正在尝试使用 AdapterView.onSelectedItemListener 来识别 ListView 中的用户选择,然后使用 Button 删除所选项目。对于 Button,我正在实现 Button.onClickItemListener。
为了将列表项放入 ListView,我使用了一个对话框。我正在使用一个接口将对话框中的字符串输入发送到RecipeFragmentNew 中的ListView。我没有遇到从对话框获取字符串到 RecipeFragmentNew 的问题,所以我没有包含任何代码。
问题:按钮正在删除列表项,但它正在删除列表中的第一项,而不是正在选择的项。
Recipe.java
public class Recipe
private UUID mID;
private String mName;
private Date mDate;
private boolean mIsFavorite;
private final ArrayList<Ingredient> ingredients;
public final ArrayList<Instruction> instructions;
public Recipe()
mID = UUID.randomUUID();
mDate = new Date();
this.ingredients = new ArrayList<>();
this.instructions = new ArrayList<>();
public UUID getID()
return mID;
public String getName()
return mName;
public void setName(String name)
mName = name;
public Date getDate()
return mDate;
public void setDate(Date date)
mDate = date;
public boolean isFavorite()
return mIsFavorite;
public void setFavorite(boolean favorite)
mIsFavorite = favorite;
public ArrayList<Ingredient> getIngredients()
return ingredients;
public ArrayList<Instruction> getInstructions()
return instructions;
Ingredient.java
public class Ingredient
private String name;
private String amount;
public Ingredient(String name, String amount)
this.name = name;
this.amount = amount;
public String getName()
return name;
public String getAmount()
return amount;
@Override
public String toString()
return this.name + " " + this.amount;
arrayList 是使用 mRecipe.getIngredients() 从 Recipe 类中检索到的。
ListView 是 mIngredientWindow。
RecipeFragmentNew.java
public class RecipeFragmentNew extends Fragment implements IngredientListDialog.OnInputSelected
public static final String TAG = "RecipeFragmentNew";
public static final String DIALOG_INGREDIENTS = "DialogIngredients";
private Recipe mRecipe;
private EditText mNameField;
private Button mIngredientAdd;
private Button mIngredientDelete;
private ListView mIngredientWindow;
private int listViewPosition;
private ArrayAdapter<Ingredient> listAdapter;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
UUID recipeId = (UUID) getArguments().getSerializable(ARG_RECIPE_ID);
mRecipe = RecipeQueue.get(getActivity()).getRecipe(recipeId);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View v = inflater.inflate(R.layout.lists_detail_view, container, false);
mIngredientDelete = v.findViewById(R.id.delete_ingredient_button);
mIngredientDelete.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
for (int i = 0; i < mRecipe.getIngredients().size(); i++)
if (i == listViewPosition)
mRecipe.getIngredients().remove(i);
listAdapter.notifyDataSetChanged();
);
listAdapter = new ArrayAdapter<Ingredient>(
getActivity(),
android.R.layout.simple_list_item_1,
mRecipe.getIngredients()
);
mIngredientWindow = v.findViewById(R.id.ingredients_window);
mIngredientWindow.setAdapter(listAdapter);
AdapterView.OnItemSelectedListener itemSelectedListener = new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
listViewPosition = position;
@Override
public void onNothingSelected(AdapterView<?> parent)
;
【问题讨论】:
【参考方案1】:按钮正在删除列表项,但它正在删除列表中的第一项 列表,而不是被选中的项目。
变量 listViewPosition 始终为 0,因为未调用 setOnItemSelectedListener
。请检查此answer
所以你可以用setOnItemClicklistener
替换这个方法,如下代码:
mIngredientWindow.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
//mIngredientWindow.setSelection(position);
listViewPosition = position;
);
【讨论】:
感谢您查看此内容。我最终不得不将其更改为单击侦听器,但还需要将其附加到列表视图。我现在可以工作了。谢谢! 但是在上面的代码中,我将监听器直接添加到列表视图中,所以它被附加了【参考方案2】:简单
listViewPosition
变量始终等于 0
这就是为什么,您已经从 AdapterView.OnItemSelectedListener
定义了一个对象,但您从未将其附加到列表视图
你需要做的就是添加
mIngredientWindow.setOnItemSelectedListener (itemSelectedListener );
【讨论】:
谢谢你!实际上,我必须将其更改为 OnItemClickListener,但我还需要根据您的评论将其附加到 ListView。我现在可以工作了。 谢谢,能不能接受我的评论以上是关于使用按钮删除 Listview w/ArrayAdapter 中的选定项目的主要内容,如果未能解决你的问题,请参考以下文章