在Android中替代高度飞溅的SPINNER CLASS

Mer*_*mer 14 android spinner alternate android-spinner

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

1_T在弹出窗口/布局/对话框created-shows(布局膨胀)事件中没有默认侦听器.有一些解决方法,如微调器上的ontouch监听器,然后检查是否在旋转器区域发生触摸完成,然后你知道弹出窗口将显示但仍然不可靠,因为你可以用异步任务填充弹出窗口.

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

3_Spinner没有可用的功能 OnClickListener和OnItemLongTouchListener事件.

4_Changing Spinner DropDown列表divider元素的属性(如颜色)比更改所有dropdrown和spinner的背景视图本身需要更多的劳动,这是非常荒谬的.

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

那么我可以用什么而不是Spinner?哪种方式最好?

Bis*_*jit 8

您可以使用ListPopupWindow创建自定义微调器到TextView意味着单击TextView时ListPopupWindow打开像spinner下拉列表,您可以选择一个元素.如果您需要,我会帮助您.

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);
}
Run Code Online (Sandbox Code Playgroud)

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


Gul*_*han 5

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

private val listPopupView by lazy { ListPopupWindow(this) }
Run Code Online (Sandbox Code Playgroud)

然后在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() }
Run Code Online (Sandbox Code Playgroud)

你已经完成了!