更改自定义适配器中按钮的可见性

时间:2017-08-14 19:15:14

标签: java android listview custom-adapter

我遇到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;
}

Image of the app

应该让新元素添加到列表中,并删除按钮以添加更多elemenet,在第一个(加号按钮)。让用户列出成分列表。

1 个答案:

答案 0 :(得分:1)

你基本上是正确的;调用notifyDataSetChanged()将使您的按钮重新出现。但为什么呢?

当您致电notifyDataSetChanged()时,您的ListView将完全重绘自己,返回适配器以获取所需信息。这涉及到列表中所有当前可见项目的getView()

getView()的实施总是膨胀并返回customview。由于您总是返回一个新膨胀的视图,因此在通胀后未手动设置的所有视图属性都将设置为布局xml中的值(如果未在此处设置,则设置为默认值)。

可见性的默认值为VISIBLE,因此当您customview充气时,除非您手动将其更改为plusButton,否则GONE始终可见。

您必须存储某种关于给定position按钮是否可见或消失的指示,然后在您getView()充气后在customview内应用此内容。< / p>

PS:一般来说,每次调用getView()时都要给新视图充气是个坏主意。您应该利用convertView参数和“视图持有者”模式。这将改善您的应用程序的性能。搜索Google和此网站应该会为您提供一些相关的建议。