Android中存在严重缺陷的SPINNER类的替代方案

Android中存在严重缺陷的SPINNER类的替代方案,android,spinner,android-spinner,alternate,Android,Spinner,Android Spinner,Alternate,在我当前的项目中,我处理了spinner类,它几乎从每个方面都进行了定制。因此,我在处理它时获得了一些详细的方面。因此,我将从它显示为什么它有缺陷的部分开始 1_没有默认侦听器将在弹出窗口/布局/对话框创建显示(布局膨胀)事件时触发。有一些解决方法,例如在微调器上的ontouch侦听器,然后检查是否在微调器区域发生了触控完成,然后您知道将显示弹出窗口,但仍然不可靠,因为您可以用异步任务填充弹出窗口 再次选择同一索引时,不会触发2_On item selected事件。这真的很烦人,因为我可能会更

在我当前的项目中,我处理了spinner类,它几乎从每个方面都进行了定制。因此,我在处理它时获得了一些详细的方面。因此,我将从它显示为什么它有缺陷的部分开始

1_没有默认侦听器将在弹出窗口/布局/对话框创建显示(布局膨胀)事件时触发。有一些解决方法,例如在微调器上的ontouch侦听器,然后检查是否在微调器区域发生了触控完成,然后您知道将显示弹出窗口,但仍然不可靠,因为您可以用异步任务填充弹出窗口

再次选择同一索引时,不会触发2_On item selected事件。这真的很烦人,因为我可能会更新适配器取决于其他条件,这将改变当前的选择和列表顺序等。。。当然,有一种解决方法,创建自己的微调器类并将其添加到xml中,如com.myproject.customspinner等……()

3\u微调器的OnClickListener和OnItemLongTouchListener事件没有工作功能

4_更改微调器下拉列表分隔器元素的属性(如颜色)比更改所有Drop溺水和微调器的背景视图本身需要更多的劳动,这是非常荒谬的

这个名字本身很荒谬


那么我可以用什么来代替旋转器呢?哪种方法最好?

您可以使用ListPopupWindow创建自定义微调器到TextView,这意味着当单击TextView时,会打开ListPopupWindow类似微调器的下拉列表,您可以选择一个元素。如果你需要,我会帮你的

ListPopupWindow numberList;
TextView spDays;
ArrayList<Map<String, String>>() listTrans;

in oncreate() spDays.setonclicklistner(this);spDays.setText("Select");
setNumberListSpinnerView();

in onclick(){
when spDays clicked :- numberList.show();
}


void setNumberListSpinnerView() {

numberList= new ListPopupWindow(this);
numberList.setAnchorView(spDays);

numberList.setOnItemClickListener((new AdapterView.OnItemClickListener() {
    @Override
    getListItem();
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Map map = listTrans.get(position);
        spDays.setText(map.get("circle_name").toString());
        circle_name = map.get("circle_name") + "";
        circle_id = map.get("circle_id").toString();
        circleList.dismiss();
        Log.d("Circle id:", circle_id + "");
        getRetails();

    }
}));
}


void getListItem(){
String[] numbers = {"1","2","3","4","5","6"};
listTrans = new ArrayList<Map<String, String>>();
LinkedHashMap<String, String> tran = new LinkedHashMap<String, String>();
for (String number : numbers) {
    tran.put("numbers", number);
    listTrans.add(tran);
}
SimpleAdapter adapter = new SimpleAdapter(AddRetailSurvey.this, listTrans,
        android.R.layout.simple_spinner_dropdown_item,
        new String[]{"numbers"},
        new int[]{android.R.id.text1});
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
numberList.setAdapter(adapter);
}
listpopupwindownumberlist;
文本视图spDays;
ArrayList()listTrans;
在oncreate()spDays.setonclicklistner中(此);spDays.setText(“选择”);
setNumberListSpinnerView();
在onclick()中{
单击spDays时:-numberList.show();
}
void setNumberListSpinnerView(){
numberList=新列表PopupWindow(此);
数字列表setAnchorView(spDays);
numberList.setOnItemClickListener((新的AdapterView.OnItemClickListener(){
@凌驾
getListItem();
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Map Map=listTrans.get(位置);
spDays.setText(map.get(“circle_name”).toString();
circle_name=map.get(“circle_name”)+“”;
circle\u id=map.get(“circle\u id”).toString();
circleList.disclose();
Log.d(“圆圈id:,圆圈id+”);
getRetails();
}
}));
}
void getListItem(){
字符串[]数字={“1”、“2”、“3”、“4”、“5”、“6”};
listTrans=新的ArrayList();
LinkedHashMap tran=新LinkedHashMap();
用于(字符串编号:数字){
转换输入(“数字”,数字);
列表事务添加(事务);
}
SimpleAdapter=新SimpleAdapter(AddRetailSurvey.this,listTrans,
android.R.layout.simple\u微调器\u下拉菜单\u项,
新字符串[]{“数字”},
新的int[]{android.R.id.text1});
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
numberList.setAdapter(适配器);
}

检查此代码并根据您的要求进行修改。如果您发现任何问题,我会在这里帮助您。:)

这将向您展示如何用自己的实现替换微调器。很简单,重要的是使用包含列表视图的弹出窗口来模拟微调器的布局行为

这修复了Spinner实现中奇怪事件处理程序的问题。它也更容易定制


这种方法唯一的问题是,与Spinner一样,它仍然使用PopupWindow,当您处于沉浸式/全屏模式时,这会在系统UI中导致奇怪的错误。但是,当您不必同时处理Spinner的特定问题时,处理这些bug就更容易了。

在此处放置一个简化的kotlin版本的公认答案,这可能会有所帮助。首先,在您的
活动
或其他类中创建一个
ListPopupWindow
成员-

private val listPopupView by lazy { ListPopupWindow(this) }
然后在
onCreate()
方法中初始化它-

val dataList = arrayOf("item1", "item2", "item3", "item4")
listPopupView.setAdapter(ArrayAdapter(this, android.R.layout.simple_list_item_1, dataList))
listPopupView.setOnItemClickListener { _, _, position, _ ->
    selectionTextView.text = dataList[position]
    listPopupView.dismiss()
    // do other things on selection
}
listPopupView.anchorView = selectionTextView
selectionTextView.setOnClickListener { listPopupView.show() }

你完了

谢谢你!!如何将自定义视图而不是文本视图添加到ListPopupWindow,并将onclick listener添加到ListPopupWindow=)您想使用什么?如果我们可以将自定义适配器(如spinner中作为xml的自定义下拉视图)添加到ListPopupWindow,那么我的问题已经得到回答=)?。我可以设置弹出窗口的方向吗?它看起来像对话框还是下拉菜单?再次非常感谢!!?事实上,我不是这个领域的专家。但你们可以使用customlayout作为下拉视图。我在代码中已经做了,但我不确定弹出的方向。