【问题标题】:Using button to delete selected item in Listview w/ ArrayAdapter使用按钮删除 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) {

        }
    };

【问题讨论】:

    标签: java android listview android-arrayadapter


    【解决方案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。我现在可以工作了。
    • 谢谢,能不能接受我的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2013-08-28
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多