[英]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.