使用按钮删除 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 中的选定项目的主要内容,如果未能解决你的问题,请参考以下文章

android中每行中带有添加和删除按钮的ListView

winform 当中我用Listview绑定数据,我要两个按钮对listView进行删除和刷新,按钮里怎么写?

如何在 ListView 中实现删除按钮并从数据库中删除?

C# wpf listview 如何得到按钮所在行?

ListView item中按钮点击实现删除

在android studio中删除一个带有按钮的listview项目