[英]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
本身; 但它的实施方式。
当您第一次点击菜单时,它会正确显示,因为converView
是null
并且满足建立绑定 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.