微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用按钮删除带有 ArrayAdapter

如何解决使用按钮删除带有 ArrayAdapter

我已经使用 Java 几个月了,但对 Android 还是陌生的。这是一个食谱夹应用。

我在 ListView 上设置了一个 ArrayAdapter,我需要在 ListView 中选择一个项目并使用 Button 删除它(我已经成功设置了向 Listview 添加字符串)。我使用 ArrayList 作为用于存储 Ingredient 对象的列表而不是常规数组。我正在尝试使用 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;
    }
}

使用 mRecipe.getIngredients() 从 Recipe 类中检索 arrayList。

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) {

        }
    };

解决方法

简单

listViewPosition 变量总是等于 0

这就是为什么,您从 AdapterView.OnItemSelectedListener 定义了一个对象,但从未将其附加到列表视图

您需要做的就是添加

mIngredientWindow.setOnItemSelectedListener (itemSelectedListener );
,

按钮正在删除列表项,但它正在删除列表中的第一项 列表,而不是正在选择的项目。

变量 listViewPosition 始终为 0,因为未调用 void sort(vector<double> &playerStats,int vectorSize) 。请检查此answer 所以你可以像下面的代码一样用 setOnItemSelectedListener 替换这个方法:

setOnItemClicklistener

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。