当前位置:   article > 正文

Android之——自定义下拉菜单的实现_android studio 自定义下拉列表,带编号与名称

android studio 自定义下拉列表,带编号与名称
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48101651

做过Android开发的童鞋,一般都会遇到这样一种情况,就是Android中原有的下拉控件Spinner过于单调和简单,不能够满足我们实际开发的需求了,这时候就需要我们自己自定义下拉菜单来实现相应的功能,那么,如何实现自定义下拉菜单呢?下面我就来和大家一起实现这个功能。

一、原理

我们这个下拉菜单展示的内容主要以ListView实现,在界面上放置一个文本框,文本框右侧放置一个向下的箭头图标,表示可以点击下拉。然后创建一个item.xml布局文件,这个布局文件展示的就是ListView的条目信息,条目中有一个图片,表示头像,一串数字表示qq号(暂时以显示qq号为例),后面一个删除按钮。所有的数据封装在ListView中。然后我们将这个ListView以PopupWindow的形式显示在文本框的下面。

当ListView不显示的时候,点击文本框右侧的下拉图标,则弹出PopupWindow显示ListView

当ListView显示的时候,点击文本框右侧的下拉图标,则隐藏PopupWindow从而隐藏ListView

点击ListView中每一个条目后删除图标的时候,相应的条目就会从listView中消失。

二、实现

1、MainActivity

程序很简单,我将所有的java代码都写在了MainActivity中,我们还是分解来看这个类。

1)属性字段

每个字段代表的含义见代码注释

具体代码实现如下:

  1. //界面控件
  2. private ImageButton spinner;
  3. private EditText et_name;
  4. //构造qq号用到的集合
  5. private List<String> names = new ArrayList<String>();
  6. //布局加载器
  7. private LayoutInflater mInflater;
  8. //自定义适配器
  9. private MyAdapter mAdapter;
  10. //PopupWindow
  11. private PopupWindow pop;
  12. //是否显示PopupWindow,默认不显示
  13. private boolean isPopShow = false;

2)自定义Adapter

同样,为了在ListView中更好的显示数据,我们还是用到了自定义Adapter

具体代码实现如下:

  1. /**
  2. * 自定义Adapter
  3. * @author liuyazhuang
  4. *
  5. */
  6. private class MyAdapter extends BaseAdapter{
  7. @Override
  8. public int getCount() {
  9. // TODO Auto-generated method stub
  10. return names.size();
  11. }
  12. @Override
  13. public Object getItem(int position) {
  14. // TODO Auto-generated method stub
  15. return names.get(position);
  16. }
  17. @Override
  18. public long getItemId(int position) {
  19. // TODO Auto-generated method stub
  20. return position;
  21. }
  22. @Override
  23. public View getView(final int position, View convertView, ViewGroup parent) {
  24. View view = mInflater.inflate(R.layout.item, null);
  25. final TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
  26. tv_name.setText(names.get(position));
  27. ImageButton delete = (ImageButton) view.findViewById(R.id.delete);
  28. //设置按钮的监听事件
  29. delete.setOnClickListener(new View.OnClickListener() {
  30. @Override
  31. public void onClick(View v) {
  32. // TODO Auto-generated method stub
  33. names.remove(position);
  34. isPopShow = true;
  35. mAdapter.notifyDataSetChanged();
  36. }
  37. });
  38. //设置按钮的监听事件
  39. tv_name.setOnClickListener(new View.OnClickListener() {
  40. @Override
  41. public void onClick(View v) {
  42. // TODO Auto-generated method stub
  43. et_name.setText(names.get(position));
  44. pop.dismiss();
  45. }
  46. });
  47. return view;
  48. }
  49. }

3)onCreate方法

这个方法中主要实现的功能就是,初始化界面布局,为属性字段赋值,构造要在ListView中显示的数据,同时为相应的按钮设置点击事件,控制PopupWindow的显示和隐藏。

具体实现代码如下:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. //构造qq账号
  6. for(int i = 10000; i < 10030; i++){
  7. names.add(String.valueOf(i));
  8. }
  9. spinner = (ImageButton) findViewById(R.id.spinner);
  10. et_name = (EditText) findViewById(R.id.et_name);
  11. mInflater = LayoutInflater.from(MainActivity.this);
  12. mAdapter = new MyAdapter();
  13. spinner.setOnClickListener(new View.OnClickListener() {
  14. @Override
  15. public void onClick(View v) {
  16. // TODO Auto-generated method stub
  17. if(pop == null){
  18. ListView listView = new ListView(MainActivity.this);
  19. listView.setCacheColorHint(0x00000000);
  20. listView.setAdapter(mAdapter);
  21. pop = new PopupWindow(listView, et_name.getWidth(), LayoutParams.WRAP_CONTENT, true);
  22. pop.setBackgroundDrawable(new ColorDrawable(0x00000000));
  23. isPopShow = true;
  24. }
  25. if(isPopShow){
  26. pop.showAsDropDown(et_name, 0, 0);
  27. isPopShow = false;
  28. }else{
  29. pop.dismiss();
  30. isPopShow = true;
  31. }
  32. }
  33. });
  34. }

4)完整代码如下:

  1. package com.lyz.spiner.activity;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.graphics.drawable.ColorDrawable;
  7. import android.view.LayoutInflater;
  8. import android.view.Menu;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.view.ViewGroup.LayoutParams;
  12. import android.widget.BaseAdapter;
  13. import android.widget.EditText;
  14. import android.widget.ImageButton;
  15. import android.widget.ListView;
  16. import android.widget.PopupWindow;
  17. import android.widget.TextView;
  18. /**
  19. * 程序主入口
  20. * @author liuyazhuang
  21. *
  22. */
  23. public class MainActivity extends Activity {
  24. //界面控件
  25. private ImageButton spinner;
  26. private EditText et_name;
  27. //构造qq号用到的集合
  28. private List<String> names = new ArrayList<String>();
  29. //布局加载器
  30. private LayoutInflater mInflater;
  31. //自定义适配器
  32. private MyAdapter mAdapter;
  33. //PopupWindow
  34. private PopupWindow pop;
  35. //是否显示PopupWindow,默认不显示
  36. private boolean isPopShow = false;
  37. @Override
  38. protected void onCreate(Bundle savedInstanceState) {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_main);
  41. //构造qq账号
  42. for(int i = 10000; i < 10030; i++){
  43. names.add(String.valueOf(i));
  44. }
  45. spinner = (ImageButton) findViewById(R.id.spinner);
  46. et_name = (EditText) findViewById(R.id.et_name);
  47. mInflater = LayoutInflater.from(MainActivity.this);
  48. mAdapter = new MyAdapter();
  49. spinner.setOnClickListener(new View.OnClickListener() {
  50. @Override
  51. public void onClick(View v) {
  52. // TODO Auto-generated method stub
  53. if(pop == null){
  54. ListView listView = new ListView(MainActivity.this);
  55. listView.setCacheColorHint(0x00000000);
  56. listView.setAdapter(mAdapter);
  57. pop = new PopupWindow(listView, et_name.getWidth(), LayoutParams.WRAP_CONTENT, true);
  58. pop.setBackgroundDrawable(new ColorDrawable(0x00000000));
  59. isPopShow = true;
  60. }
  61. if(isPopShow){
  62. pop.showAsDropDown(et_name, 0, 0);
  63. isPopShow = false;
  64. }else{
  65. pop.dismiss();
  66. isPopShow = true;
  67. }
  68. }
  69. });
  70. }
  71. /**
  72. * 自定义Adapter
  73. * @author liuyazhuang
  74. *
  75. */
  76. private class MyAdapter extends BaseAdapter{
  77. @Override
  78. public int getCount() {
  79. // TODO Auto-generated method stub
  80. return names.size();
  81. }
  82. @Override
  83. public Object getItem(int position) {
  84. // TODO Auto-generated method stub
  85. return names.get(position);
  86. }
  87. @Override
  88. public long getItemId(int position) {
  89. // TODO Auto-generated method stub
  90. return position;
  91. }
  92. @Override
  93. public View getView(final int position, View convertView, ViewGroup parent) {
  94. View view = mInflater.inflate(R.layout.item, null);
  95. final TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
  96. tv_name.setText(names.get(position));
  97. ImageButton delete = (ImageButton) view.findViewById(R.id.delete);
  98. //设置按钮的监听事件
  99. delete.setOnClickListener(new View.OnClickListener() {
  100. @Override
  101. public void onClick(View v) {
  102. // TODO Auto-generated method stub
  103. names.remove(position);
  104. isPopShow = true;
  105. mAdapter.notifyDataSetChanged();
  106. }
  107. });
  108. //设置按钮的监听事件
  109. tv_name.setOnClickListener(new View.OnClickListener() {
  110. @Override
  111. public void onClick(View v) {
  112. // TODO Auto-generated method stub
  113. et_name.setText(names.get(position));
  114. pop.dismiss();
  115. }
  116. });
  117. return view;
  118. }
  119. }
  120. @Override
  121. public boolean onCreateOptionsMenu(Menu menu) {
  122. // Inflate the menu; this adds items to the action bar if it is present.
  123. getMenuInflater().inflate(R.menu.main, menu);
  124. return true;
  125. }
  126. }

2、主布局文件activity_main.xml

具体实现代码如下:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@android:color/black">
  6. <EditText
  7. android:id="@+id/et_name"
  8. android:layout_width="200dip"
  9. android:layout_height="wrap_content"
  10. android:layout_centerHorizontal="true"
  11. android:hint="请输入账号" />
  12. <ImageButton
  13. android:id="@+id/spinner"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:background="@drawable/button"
  17. android:layout_alignTop="@id/et_name"
  18. android:layout_alignRight="@id/et_name"
  19. android:layout_alignBottom="@id/et_name"/>
  20. </RelativeLayout>

3、条目布局文件item.xml

具体实现代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="horizontal"
  6. android:gravity="center_vertical">
  7. <ImageView
  8. android:id="@+id/header"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:background="@drawable/user"/>
  12. <TextView
  13. android:id="@+id/tv_name"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_weight="1"/>
  17. <ImageButton
  18. android:id="@+id/delete"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:background="@drawable/delete"/>
  22. </LinearLayout>

4、AndroidManifest.xml

最后贴出AndroidManifest.xml的代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.lyz.spiner.activity"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="18" />
  9. <application
  10. android:allowBackup="true"
  11. android:icon="@drawable/ic_launcher"
  12. android:label="@string/app_name"
  13. android:theme="@style/AppTheme" >
  14. <activity
  15. android:name="com.lyz.spiner.activity.MainActivity"
  16. android:label="@string/app_name" >
  17. <intent-filter>
  18. <action android:name="android.intent.action.MAIN" />
  19. <category android:name="android.intent.category.LAUNCHER" />
  20. </intent-filter>
  21. </activity>
  22. </application>
  23. </manifest>

三、运行效果


四、温馨提示

大家可以到链接http://download.csdn.net/detail/l1028386804/9062795下载Android自定义下拉菜单示例完整源代码

本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/677560
推荐阅读
相关标签
  

闽ICP备14008679号