26

在我目前的项目中,我处理了几乎从各个方面进行定制的微调器类。因此,我在处理它时获得了一些详细的方面。所以我将从它说明为什么它有缺陷的部分开始。

1_在弹出窗口/布局/对话框 created-showed(layout inflated) 事件中不会触发默认侦听器。有一些解决方法,例如微调器上的 ontouch 侦听器,然后检查微调器区域中是否发生触摸完成,然后您知道会显示弹出窗口但仍然不可靠,因为您可以使用异步任务填充弹出窗口..

2_当再次选择相同的索引时,不会触发项目选择事件。这真的很烦人,因为我可能会根据其他条件更新适配器,这将改变当前选择和列表顺序等...当然有一种解决方法,方法是创建自己的微调器类并将其添加到 com.myproject.customspinner 之类的 xml 中等等.....(微调器:当所选项目保持不变时不调用onItemSelected

3_微调器没有有效的功能OnClickListener 和 OnItemLongTouchListener 事件。

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

5_Spinner 这个名字本身就很荒谬 =)))。

那么我可以用什么来代替 Spinner 呢?最好的方法是什么?

4

3 回答 3

11

您可以使用 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);
}

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

于 2014-12-12T09:45:09.290 回答
6

在此处放置已接受答案的简化 kotlin 版本,这可能会有所帮助。首先让ListPopupWindowActivity或其他班级的成员-

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() }

你完成了!

于 2019-05-19T04:15:15.447 回答
0

这向您展示了如何用您自己的实现替换 Spinner。这很简单,重要的是使用包含列表视图的 PopupWindow 来模仿 Spinner 的布局行为。

https://www.androidcode.ninja/show-listview-as-drop-down-android/

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

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

于 2018-08-15T18:47:56.567 回答