gpt4 book ai didi

javascript - 在包含带有 ArrayAdapter 的 EditText 的 ListView 上添加/删除项目

转载 作者:行者123 更新时间:2023-11-30 18:59:58 25 4
gpt4 key购买 nike

我在使用 CustomAdaptor 时遇到问题。在添加/编辑食谱上,我想显示一个列表,其中包含成分和数量以及使用按钮删除该项目的可能性。正如你在图片上看到的,起初列表只有一个项目(没有删除按钮,因为 visibility = INVISIBLE 为了至少提供一种成分)我在列表下方有一个按钮来添加其他空白项目 但另一个需要继续编辑文本

首先,当我点击这个按钮时,我丢失了所有编辑过的文本。其次,我看不到谁可以设法删除项目(我试过这个 solution )。

我希望有人已经解决了这个问题并且可以帮助我:)


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

}
});

}
}

I know the list show only one item with scrollbar but I already have a code to correct, it's just more readeable without.

最佳答案

正如 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();
}
});

}
}
}

On delete Item you can change notifyDataSetChanged() to notifyItemRemoved() but since I have condition on list size to hide or display delete button I have to "restart" the adapter.

关于javascript - 在包含带有 ArrayAdapter 的 EditText 的 ListView 上添加/删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59605237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com