繁体   English   中英

Java 暴露的下拉菜单只有一项

[英]Java Exposed DropDown Menu only one item

我尝试使用公开的下拉菜单创建 Android 应用程序,如下所示:
https://material.io/components/menus/android#exposed-dropdown-menus

有时它会这样显示 预期产出

左图出现在第一次打开菜单时。 选择一项,改变正确的情况。 再次重新选择相同的项目,会变回左边的情况。

这是我的适配器的实现:

public class FilterMenuCategoryAdapter extends ArrayAdapter<String> {
    private static final String TAG = "FilterMenuCategoryAdapter";
    List<String> categoryList;
    LvElCategoryBinding binding;
    Context context;

    public FilterMenuCategoryAdapter(Context context) {
        super(context, 0, getCompleteCategoryList());
        this.context = context;
        this.categoryList = getCompleteCategoryList();
    }

    public FilterMenuCategoryAdapter(Context context, List<String> categoryList) {
        super(context, 0, categoryList);
        this.context = context;
        this.categoryList = new ArrayList<>(categoryList);
    }

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

    @Override
    public String getItem(int position) {
        return categoryList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.lv_el_category, parent, false);
        }
        String category = categoryList.get(position);
        binding.tvTitle.setText(category);
        binding.icon.setImageResource(new IconNameMapper().get(category));
        return binding.getRoot();
    }

}

这是使用过的 XML:

 <com.google.android.material.textfield.TextInputLayout
    style="@style/dropDownMenuOnWhite"
    android:layout_width="match_parent"
    android:layout_height="50dp">

    <AutoCompleteTextView
        android:id="@+id/filterMenu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inputType="none"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:text="@string/show_all"
        android:textAlignment="textEnd"
        android:textColor="@color/primaryTextColor"
        android:textSize="@dimen/font_size" />
</com.google.android.material.textfield.TextInputLayout>

在我的片段 Class 中,我这样称呼它:

FilterMenuCategoryAdapter adapter = new FilterMenuCategoryAdapter(this.getContext());
binding.filterMenu.setAdapter(adapter);

目前,菜单中的每个选择都会破坏我的onClick事件。 所以我很高兴得到任何帮助!

更新:我修好了。 在 getView() 中使用 DataBinding 每次都会为我杀死它。
以下解决方案有效:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(
                    R.layout.lv_el_category, parent, false
            );
        }
        TextView title = convertView.findViewById(R.id.tv_title);
        ShapeableImageView image = convertView.findViewById(R.id.icon);
        String category = categoryList.get(position);
        title.setText(category);
        image.setImageResource(new IconNameMapper().get(category));
        return convertView;
    }

如果您知道如何在 getView() 中使用 DataBinding,请告诉我!

问题不在于dataBinding本身; 但它的实施方式。

当您第一次点击菜单时,它会正确显示,因为converViewnull并且满足建立绑定 object 的条件。

单击项目时菜单项消失的原因; 当再次调用getView()时,它有一个新的convertView object ,它有一个新的 state ,它不同于旧的getView()调用; 但是您忽略了它,并使用旧的binding object 及其原始 state 来查找视图; 而这使得dataBinding无法膨胀新的state的意见(可能是指旧回收的意见)。

这就是为什么convertView作为方法参数传递的原因; 因此每次回收视图时都需要使用全新的convertView

解决这个问题; 您需要通过保存 dataBinding 的视图来做同样的事情; binding.getRoot()返回。 而且你必须使用convertView来保存这个dataBinding view state on。 这通常可以使用ViewHolder并使用setTag()保存视图及其 state 来完成:

ViewHolder 与RecyclerView视图持有者有类似的想法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ItemViewHolder holder;
    if (convertView == null) {
        LvElCategoryBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.lv_el_category, parent, false);
        holder = new ItemViewHolder(binding);
        holder.view = binding.getRoot();
        holder.view.setTag(holder); 
    } else {
        holder = (ItemViewHolder) convertView.getTag();
    }
    String category = categoryList.get(position);
    holder.binding.tvTitle.setText(category);
    holder.binding.icon.setImageResource(new IconNameMapper().get(category));
    return holder.view;
}

private static class ItemViewHolder {
    private View view;
    private LvElCategoryBinding binding;

    ItemViewHolder(LvElCategoryBinding binding) {
        this.view = binding.getRoot();
        this.binding = binding;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM