簡體   English   中英

使用 ArrayAdapter 添加/刪除包含 EditText 的 ListView 項目

[英]Add/Delete item on ListView containing EditText with ArrayAdapter

我在使用 CustomAdaptor 時遇到問題。 在添加/編輯食譜中,我想顯示一個包含成分的列表以及使用按鈕刪除該項目的數量和可能性。 正如您在圖片上看到的,起初列表只有一個項目(沒有刪除按鈕,因為可見性 = INVISIBLE 以便有義務提供至少一種成分),我在列表下方有一個按鈕來添加其他空白項目,但其他需要繼續編輯文本

首先,當我點擊這個按鈕時,我丟失了所有編輯過的文本。 其次,我不知道由誰來管理刪除項目(我試過這個解決方案)。

我希望有人已經解決了這個問題並且可以幫助我:)


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_above="@id/btn_save">

        <LinearLayout
            android:id="@+id/block_ingredient"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/listview_ingredient"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <Button
                android:id="@+id/btn_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:text="+" />

        </LinearLayout>

    </ScrollView>

    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="SAVE" />

</RelativeLayout>

list_ingredient.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <EditText
        android:id="@+id/quantite"
        android:layout_width="0dp"
        android:layout_weight="45"
        android:layout_height="wrap_content"
        android:hint="Quantite" />

    <EditText
        android:id="@+id/ingredient"
        android:layout_width="0dp"
        android:layout_weight="45"
        android:layout_height="wrap_content"
        android:hint="Ingredient" />

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="0dp"
        android:layout_weight="10"
        android:layout_height="wrap_content"
        android:text="X" />
</LinearLayout>

Item.java

public class Item {
    private String Quantite;
    private String Ingredient;

    // --- CONSTRUCTORS ---
    public Item() {};
    public Item(String Quantite, String Ingredient) {
        this.Quantite = Quantite;
        this.Ingredient = Ingredient;
    }

    // --- GETTER ---
    public String getQuantite() { return Quantite; }
    public String getIngredient() { return Ingredient; }

    // --- SETTER ---
    public void setQuantite(String Quantite) { this.Quantite = Quantite; }
    public void setIngredient(String Ingredient) { this.Ingredient = Ingredient; }
}

IngredientAdapter.java

public class IngredientAdapter extends ArrayAdapter {

    private Context context;
    private ArrayList<Item> listItem;
    private static LayoutInflater inflater = null;
    private View v;
    private ViewHolder viewHolder;

    public IngredientAdapter(Context context, ArrayList<Item> listItem) {
        super(context, 0, listItem);
        this.context = context;
        this.listItem = listItem;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override public int getCount() { return listItem.size(); }

    @Override public Object getItem(int i) { return null; }

    public ArrayList<Item> getItems() {
        return new ArrayList<Item>(listItem);
    }

    @Override public View getView(int i, View convertView, ViewGroup parent) {
        View finalView = convertView;
        final int position = i;
        Item item = listItem.get(position);
        if (convertView == null) {
            finalView = inflater.inflate(R.layout.list_ingredient, null);
            viewHolder = new ViewHolder();
            viewHolder.Quantite = finalView.findViewById(R.id.quantite);
            viewHolder.Ingredient = finalView.findViewById(R.id.ingredient);
            viewHolder.Btn_delete = finalView.findViewById(R.id.btn_delete);
            finalView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.Quantite.setText(item.getQuantite());
        viewHolder.Ingredient.setText(item.getIngredient());
        if (listItem.size() < 2) {
            viewHolder.Btn_delete.setVisibility(View.INVISIBLE);
        }

        viewHolder.Btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Integer position = (Integer) view.getTag();
                listItem.remove(position);
                notifyDataSetChanged();
            }
        });

        return finalView;
    }

    public ArrayList<Item> getAll() { return listItem; }

    public class ViewHolder {
        EditText Quantite;
        EditText Ingredient;
        Button Btn_delete;
    }

    public void setItems(ArrayList<Item> listItem) {
        this.listItem = listItem;
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private ListView listview_ingredient;
    private Button btn_add;
    private Button btn_save;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listview_ingredient = findViewById(R.id.listview_ingredient);
        btn_add = findViewById(R.id.btn_add);
        btn_save = findViewById(R.id.btn_save);

        final ArrayList<Item> IngredientList = new ArrayList<Item>();
        if (IngredientList.size() == 0) {
            IngredientList.add(new Item());
        }

        final IngredientAdapter ingredientAdapter = new IngredientAdapter(this, IngredientList);
        listview_ingredient.setAdapter(ingredientAdapter);

        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // Ajouter un item vide
                IngredientList.add(new Item());
                final IngredientAdapter ingredientAdapter = new IngredientAdapter(MainActivity.this, IngredientList);
                listview_ingredient.setAdapter(ingredientAdapter);

            }
        });

        btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // Sauvegarder les réponses

            }
        });

    }
}

我知道列表只顯示一個帶有滾動條的項目,但我已經有一個代碼可以更正,沒有它就更易讀了。

正如 Barns 所建議的那樣,我移到 RecyclerView 並在添加新項目時使用了 notifyDataSetChanged()。

如果它對其他人有幫助,我在下面進行了更改並添加了此鏈接,因為它是使用 EditText 的 RecyclerView 的好教程: https : //demonuts.com/android-recyclerview-with-edittext/

對於上面的代碼,我更改了以下內容:

activity_main.xml

僅將 ListView 更改為 RecyclerView

MainActivity.java

當我調用適配器時:

ingredientAdapter = new IngredientAdapter(this, IngredientList);
listview_ingredient.setAdapter(ingredientAdapter);
listview_ingredient.setLayoutManager(new LinearLayoutManager(getApplicationContext()) {
    @Override public boolean canScrollVertically() {
        return false;
    }
});

點擊添加按鈕:

IngredientList.add(new Item());
ingredientAdapter.notifyDataSetChanged();

和適配器成為

public class IngredientAdapter extends RecyclerView.Adapter<IngredientAdapter.ViewHolder> {

    private Context context;
    public static ArrayList<Item> IngredientList;
    private static LayoutInflater inflater = null;
    private ViewHolder viewHolder;

    // --- CONSTRUCTOR ---
    public IngredientAdapter(Context context, ArrayList<Item> listItem) {
        inflater = LayoutInflater.from(context);
        this.context = context;
        this.IngredientList = listItem;
    }

    // --- ADAPTER ---
    @Override public IngredientAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.list_ingredient, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    // --- SET TEXT TO THE ELEMENT OF THE LIST
    @Override public void onBindViewHolder(final IngredientAdapter.ViewHolder holder, final int position) {
        holder.Quantite.setText(IngredientList.get(position).getQuantite());
        holder.Ingredient.setText(IngredientList.get(position).getIngredient());
        if (getItemCount() == 1) {
            holder.Delete.setVisibility(View.INVISIBLE);
        } else {
            holder.Delete.setVisibility(View.VISIBLE);
        }
    }

    @Override public int getItemCount() {
        return IngredientList.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        protected EditText Quantite;
        protected EditText Ingredient;
        protected Button Delete;

        public ViewHolder(View itemView) {
            super(itemView);
            Quantite = (EditText) itemView.findViewById(R.id.quantite);
            Ingredient = (EditText) itemView.findViewById(R.id.ingredient);
            Delete = (Button) itemView.findViewById(R.id.btn_delete);

            Quantite.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    IngredientList.get(getAdapterPosition()).setQuantite(Quantite.getText().toString());
                }

                @Override
                public void afterTextChanged(Editable editable) {

                }
            });

            Ingredient.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    IngredientList.get(getAdapterPosition()).setIngredient(Ingredient.getText().toString());
                }

                @Override
                public void afterTextChanged(Editable editable) {

                }
            });

            Delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    IngredientList.remove(getAdapterPosition());
//                    notifyItemRemoved(getAdapterPosition());
                    notifyDataSetChanged();
                }
            });

        }
    }
}

在刪除項目時,您可以將 notifyDataSetChanged() 更改為 notifyItemRemoved() 但由於我對列表大小有條件來隱藏或顯示刪除按鈕,因此我必須“重新啟動”適配器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM