自定义Spinner——使用listView和PopupWindow实现 2023-05-22 13:59 1阅读 0赞 1.建立用于spinner显示选框的布局文件sp\_select\_view.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:id="@+id/compound" android:background="@drawable/sp_select_item" > <TextView android:id="@+id/text" android:layout_width="76dp" android:layout_height="32dp" android:paddingLeft="10dp" android:text="文本文字" android:gravity="center_vertical" android:textSize="14sp" android:padding="5dp" android:singleLine="true" /> <ImageView android:id="@+id/btn" android:layout_width="24dp" android:layout_height="24dp" android:layout_toRightOf="@+id/text" android:src="@mipmap/img_sp_downbtn" android:padding="5dp" android:layout_centerVertical="true" android:gravity="center"/> </RelativeLayout> 2.建立用于显示下拉列表的布局文件sp\_dropdown\_list.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listView" android:layout_width="100dp" android:layout_height="wrap_content" android:divider="#666666" android:dividerHeight="1dp"/> </LinearLayout> 3.建立下拉列表的每一列的布局文件sp\_dropdown\_list\_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_container" android:background="@drawable/sp_select_item" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="5dp" android:paddingRight="5dp"> <TextView android:id="@+id/tv_sp_listitem" android:layout_width="match_parent" android:layout_height="32dp" android:gravity="center_vertical" android:textSize="16sp" android:textColor="#000000"/> </LinearLayout> 4.在drawable文件夹下建立下拉列表的每一列的背景样式布局和显示选框的背景样式布局sp\_select\_item.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/colorPrimary"/> <item android:drawable="@color/colorPrimaryDark"/> </selector> 5.建立自定义Spinner控件类的实现类 package com.htkrail.railgrinding.view; import java.util.ArrayList; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; /** * 下拉列表框控件 * Created by Administrator on 2020-04-15. */ public class MySpinner extends LinearLayout{ private TextView editText; private ImageView imageView; private PopupWindow popupWindow = null; private ArrayList<String> dataList = new ArrayList<String>(); private View mView; public MySpinner(Context context) { this(context,null); // TODO Auto-generated constructor stub } public MySpinner(Context context, AttributeSet attrs) { this(context, attrs,0); // TODO Auto-generated constructor stub } public MySpinner(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub initView(); } public void initView(){ String infServie = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater layoutInflater; layoutInflater = (LayoutInflater) getContext().getSystemService(infServie); View view = layoutInflater.inflate(R.layout.sp_select_view, this,true); editText= (TextView)findViewById(R.id.text); imageView = (ImageView)findViewById(R.id.btn); this.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(popupWindow == null ){ showPopWindow(); }else{ closePopWindow(); } } }); } /** * 打开下拉列表弹窗 */ private void showPopWindow() { // 加载popupWindow的布局文件 String infServie = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater layoutInflater; layoutInflater = (LayoutInflater) getContext().getSystemService(infServie); View contentView = layoutInflater.inflate(R.layout.sp_dropdown_list, null,false); ListView listView = (ListView)contentView.findViewById(R.id.listView); listView.setAdapter(new XCDropDownListAdapter(getContext(), dataList)); popupWindow = new PopupWindow(contentView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); popupWindow.setBackgroundDrawable(getResources().getDrawable(R.color.transparent)); popupWindow.setOutsideTouchable(true); popupWindow.showAsDropDown(this); } /** * 关闭下拉列表弹窗 */ private void closePopWindow(){ popupWindow.dismiss(); popupWindow = null; } /** * 设置数据 * @param list */ public void setItemsData(ArrayList<String> list){ dataList = list; editText.setText(list.get(0).toString()); } /** * */ public String getItemData(){ return editText.getText().toString().trim(); } /** * 数据适配器 * @author caizhiming * */ class XCDropDownListAdapter extends BaseAdapter{ Context mContext; ArrayList<String> mData; LayoutInflater inflater; public XCDropDownListAdapter(Context ctx,ArrayList<String> data){ mContext = ctx; mData = data; inflater = LayoutInflater.from(mContext); } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub // 自定义视图 ListItemView listItemView = null; if (convertView == null) { // 获取list_item布局文件的视图 convertView = inflater.inflate(R.layout.sp_dropdown_list_item, null); listItemView = new ListItemView(); // 获取控件对象 listItemView.tv = (TextView) convertView .findViewById(R.id.tv_sp_listitem); listItemView.layout = (LinearLayout) convertView.findViewById(R.id.layout_container); // 设置控件集到convertView convertView.setTag(listItemView); } else { listItemView = (ListItemView) convertView.getTag(); } // 设置数据 listItemView.tv.setText(mData.get(position).toString()); final String text = mData.get(position).toString(); listItemView.layout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub editText.setText(text); closePopWindow(); } }); return convertView; } } private static class ListItemView{ TextView tv; LinearLayout layout; } } 6.使用自定义的Spinner和使用普通的自带的控件一样 (1)首先需要在布局文件中引用该控件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" > <com.htkrail.railgrinding.view.MySpinner android:id="@+id/sp_model" android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" /> </RelativeLayout> (2)其次,就是在代码中使用该控件: package com.htkrail.railgrinding; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import com.htkrail.railgrinding.view.MySpinner; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private MySpinner spModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spModel = (MySpinner)findViewById(R.id.sp_model); ArrayList<String> list = new ArrayList<String>(); for(int i = 0;i< 6;i++){ list.add("下拉列表项"+(i+1)); } spModel.setItemsData(list); } } 7.最终样式 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pjbjU5Njc4NTE1NA_size_16_color_FFFFFF_t_70] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pjbjU5Njc4NTE1NA_size_16_color_FFFFFF_t_70]: /images/20230521/455e89a0c25b4884ae11dcf175f12146.png 文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。
相关 android 自定义listview android 自定义listview MainActivity.java public class MainActivity extends AppCompa 短命女/ 2022年03月11日 13:08/ 0 赞/ 113 阅读
相关 android Spinner自定义下拉框 Spinner下拉框在android中有2种绑定方式 1.通过在string.xml中配置 array 的item 去实现(缺点:下拉框中的内容是写死的) <arr 喜欢ヅ旅行/ 2022年07月13日 14:51/ 0 赞/ 84 阅读
相关 RefreashListView(自定义ListView) 1.先写下拉刷新的头布局文件.注意,根部局必须是LinearLayout ![Image 1][] ![这里写图片描述][20160725110009274] ゝ一世哀愁。/ 2022年07月20日 20:29/ 0 赞/ 75 阅读
相关 Android初试--自定义ListView的使用 Android初试\--自定义ListView的使用 上一篇文章中我们介绍了,关于ListView的简单使用,现在我们就来看看如何自定义ListView的使用。 1.将使用 秒速五厘米/ 2022年08月26日 19:17/ 0 赞/ 45 阅读
相关 【Android】时间选择器PopupWindow(自定义) 时间选择器PopupWindow > preview ![在这里插入图片描述][watermark_type_d3F5LXplbmhlaQ_shadow_50_text 一时失言乱红尘/ 2022年09月17日 14:25/ 0 赞/ 65 阅读
相关 自定义Spinner下拉列表 说道android下拉框spineer,框架中虽有现成的控件,但实际效果可能并不是我们所需要的那种,如下图: ![1364301946_2970.gif][] 其实我们更需 妖狐艹你老母/ 2022年09月20日 13:53/ 0 赞/ 44 阅读
相关 listview的使用及自定义baseAdapter 整个编码步骤如下: 1.首先编写一个main\_activity.xml,在其中加入listview控件; 2.编写listview中子项要展示数据的布局文件item.xm 雨点打透心脏的1/2处/ 2022年10月01日 08:39/ 0 赞/ 54 阅读
相关 android自定义下拉筛选,Android自定义下拉列表——PopupWindow+ListView(单选模式)... 最近在项目中使用android原生的Spinner发现其显示效果没有想象中的好,于是就动手写了一个popuwindow的弹出框下拉列表,在popuwindow中主要使用了Lis Bertha 。/ 2022年10月16日 08:42/ 0 赞/ 274 阅读
相关 java的spinner_Spinner的自定义 首先在main.xml中添加一个 main.xml 1 2 xmlns:tools="http://schemas.android.com/tools" 3 andro 小鱼儿/ 2022年11月07日 22:41/ 0 赞/ 45 阅读
相关 自定义Spinner——使用listView和PopupWindow实现 1.建立用于spinner显示选框的布局文件sp\_select\_view.xml <?xml version="1.0" encoding="utf-8"?> 朱雀/ 2023年05月22日 13:59/ 0 赞/ 2 阅读
还没有评论,来说两句吧...