我遇到listview和自定义适配器的问题。当我点击它时,我试图将按钮的可见性消失,为列表创建一个新元素进行编辑和更改。
但它不起作用。我认为这是因为notifyOnDataChange再次将按钮可见性视为可见。
public class CustomAdapterIngredientsUser extends ArrayAdapter<Recipe.Ingredients.Ingredient>
List<Recipe.Ingredients.Ingredient> ingredientList;
Context context;
EditText textQuantity;
EditText textName;
Button xButton;
Button plusButton;
public CustomAdapterIngredientsUser(Context context, List<Recipe.Ingredients.Ingredient> resource) {
super(context,R.layout.ingredient_new_recipe,resource);
this.context = context;
this.ingredientList = resource;
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
final View customview = layoutInflater.inflate(R.layout.ingredient_new_recipe,parent,false);
textQuantity = (EditText) customview.findViewById(R.id.quantityText);
textName = (EditText) customview.findViewById(R.id.ingredientName);
plusButton= (Button) customview.findViewById(R.id.newIngredientButton);
xButton = (Button) customview.findViewById(R.id.Xbutton);
xButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ingredientList.remove(position);
notifyDataSetChanged();
}
});
plusButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
plusButton.setVisibility(customview.GONE);
String name = textName.getText().toString();
String qnt = textQuantity.getText().toString();
Recipe.Ingredients.Ingredient ing2 = new Recipe.Ingredients.Ingredient("Quantity","Name","Photo");
ingredientList.add(ing2);
notifyDataSetChanged();
}
});
return customview;
}
应该让新元素添加到列表中,并删除按钮以添加更多elemenet,在第一个(加号按钮)。让用户列出成分列表。
答案 0 :(得分:1)
你基本上是正确的;调用notifyDataSetChanged()
将使您的按钮重新出现。但为什么呢?
当您致电notifyDataSetChanged()
时,您的ListView将完全重绘自己,返回适配器以获取所需信息。这涉及到列表中所有当前可见项目的getView()
。
getView()
的实施总是膨胀并返回customview
。由于您总是返回一个新膨胀的视图,因此在通胀后未手动设置的所有视图属性都将设置为布局xml中的值(如果未在此处设置,则设置为默认值)。
可见性的默认值为VISIBLE
,因此当您customview
充气时,除非您手动将其更改为plusButton
,否则GONE
始终可见。
您必须存储某种关于给定position
按钮是否可见或消失的指示,然后在您getView()
充气后在customview
内应用此内容。< / p>
PS:一般来说,每次调用getView()
时都要给新视图充气是个坏主意。您应该利用convertView
参数和“视图持有者”模式。这将改善您的应用程序的性能。搜索Google和此网站应该会为您提供一些相关的建议。