android 自定义下拉框

一、 简介:

      原生Android 提供的spinner下拉框不怎么方便,样式有点丑。修改起来麻烦,于是就自己动手写了一下拉列表。

实现原理使用的是,popwindow弹框,可实现宽高自定义,下拉列表使用listview.

二、pop弹框代码,文件名SpinerPopWindow.java


import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView.OnItemClickListener;
import java.util.List;

import csu.xiaoya.robotApp.R;

/**
 * 自定义PopupWindow  
 *
 * @param <T>
 * @param <T>
 * @author Ansen
 * @create time
 */

public class SpinerPopWindow<T> extends PopupWindow {
    private LayoutInflater inflater;
    private ListView mListView;
    private List<T> list;
    private MyAdapter mAdapter;

    public SpinerPopWindow(Context context, List<T> list, OnItemClickListener clickListener) {
        super(context);
        inflater = LayoutInflater.from(context);
        this.list = list;
        init(clickListener);
    }

    private void init(OnItemClickListener clickListener) {
        View view = inflater.inflate(R.layout.spiner_window_layout, null);
        setContentView(view);
        setWidth(LayoutParams.WRAP_CONTENT);
        setHeight(LayoutParams.WRAP_CONTENT);
        setFocusable(true);
        ColorDrawable dw = new ColorDrawable(0x00);
        setBackgroundDrawable(dw);
        mListView = (ListView) view.findViewById(R.id.listview);
        mListView.setAdapter(mAdapter = new MyAdapter());
        mListView.setOnItemClickListener(clickListener);
    }

    private class MyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.spiner_item_layout, null);
                holder.tvName = (TextView) convertView.findViewById(R.id.tv_name);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.tvName.setText(getItem(position).toString());
            return convertView;
        }
    }

    private class ViewHolder {
        private TextView tvName;
    }
}


三、spiner_window_layout布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:background="@color/dwupBgColor"
    android:orientation="vertical">

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:cacheColorHint="#00000000"
        android:background="@color/dwupBgColor"
        android:scrollbars="none" >
    </ListView>
</LinearLayout>

四、spiner_item_layout子布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="@dimen/dp_23"
    android:gravity="center_vertical">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="@dimen/dp_15"
        android:paddingTop="@dimen/dp_8"
        android:paddingRight="@dimen/dp_10"
        android:paddingBottom="@dimen/dp_8"
        android:text="fdsfdsfdsf"
        android:textColor="@color/white"
        android:textSize="10sp" />

</LinearLayout>

五、使用

    //调用
  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initSpinnerList();
    }


六、对应方法


 /**
     *
     */
    private SpinerPopWindow<String> mSpinerPrincePopWindow;//省
 

    private List<String> list;//省

    private TextView tvValue;

    private void initSpinnerList() {
        initData();
        tvValue = (TextView) findViewById(R.id.tv_province);
        tvValue.setOnClickListener(clickListener);
        // 省
        mSpinerPrincePopWindow = new SpinerPopWindow<String>(this, list, itemClickListener);
        mSpinerPrincePopWindow.setOnDismissListener(dismissListener);

    }


 /**
     * 监听popupwindow取消
     */
    private OnDismissListener dismissListener = new OnDismissListener() {
        @Override
        public void onDismiss() {
            setTextImage(R.drawable.dw_arrow, mDataBinding.tvProvince);
        }
    };

    /**
     * popupwindow显示的ListView的item点击事件
     */
    private OnItemClickListener itemClickListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            mSpinerPrincePopWindow.dismiss();
            tvValue.setText(list.get(position));
        }
    };

    /**
     * 显示PopupWindow
     */
    private OnClickListener clickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.tv_province://省
                    mSpinerPrincePopWindow.setWidth(tvValue.getWidth());
                    mSpinerPrincePopWindow.showAsDropDown(tvValue);
                    setTextImage(R.drawable.icon_up, mDataBinding.tvProvince);
                    break;
             
            }
        }
    };


   /**
     * 初始化数据
     */
    private void initData() {
        list = new ArrayList<String>();//省
        list.add("北京");
        list.add("上海");
        list.add("浙江");
        list.add("广东");
        list.add("江苏");
        list.add("湖南");
        list.add("湖北");
        list.add("四川");
        list.add("陕西");
     }

七、shape_help_category_tv_bg外形布局

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 填充的颜色 -->
    <solid android:color="#ff2e2f43" />
    <corners android:radius="5dp" />
    <!-- 设置边框 -->
    <stroke
        android:width="1dp"
        android:color="#ff2e2f43" />
</shape>

八、shape_popupwindow_list_bg

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- This is the main color -->
    <item>
        <shape>
            <!-- 边框颜色 -->
            <solid android:color="@color/gray"/>
        </shape>
    </item>
    <!-- 给View的上 左  右设置8dp的边框 -->
    <item
        android:left="1dp"
        android:right="1dp"
        android:bottom="1dp">
        <shape>
            <!-- View填充颜色 -->
            <solid android:color="@color/white"/>
        </shape>
    </item>

</layer-list>

九、完结

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android中,实现下拉框关联数据库的操作可以通过以下几个步骤来完成。 首先,我们需要在数据库中创建一个表格,该表格存储下拉框的选项数据。可以使用SQLite数据库来创建表格。通过编写SQL语句,创建一个包含选项数据的表格,并将其插入到数据库中。 然后,在Android应用程序中,我们需要创建一个下拉框控件,并设置其关联的数据源。可以使用Spinner控件来实现下拉框。我们可以通过查询数据库中的数据,并将其作为数据源设置给Spinner控件。 接下来,我们需要编写代码来响应用户选择下拉框中的选项。可以使用Spinner的OnItemSelectedListener来监听用户的选择事件。在监听器中,我们可以获取用户选择的数据,并使用该数据进行后续的操作。 在监听器中,我们可以根据用户选择的数据来执行相应的操作。例如,我们可以根据选择的选项,查询数据库中存储的其他相关数据,并将其展示给用户。可以使用SQL查询语句来获取相关数据。 最后,我们可以通过适配器将获取到的数据展示给用户。适配器可以将数据与Spinner控件进行绑定,并显示在下拉框中的选项列表中。可以使用ArrayAdapter或CursorAdapter来实现适配器。 综上所述,Android下拉框关联数据库的操作主要包括创建数据库表格、设置下拉框的数据源、监听用户选择事件、根据选择的选项执行相应操作,并使用适配器展示数据。通过这些步骤,可以实现下拉框与数据库的关联,并对用户选择的选项进行处理。 ### 回答2: 在Android中,我们可以通过Spinner这个下拉框控件来实现关联数据库的功能。首先,我们需要创建一个数据库,可以使用SQLite数据库来存储我们的数据。 在数据库中,我们可以创建一个表,用于存储需要在下拉框中显示的选项及其对应的数据。表的结构可以包括一个主键列作为每一项的唯一标识,以及其他需要显示的列。 接下来,我们可以通过使用Cursor对象查询数据库,获取需要显示在下拉框中的数据。我们可以使用SQL语句来从数据库中选择需要的数据,并使用Cursor对象进行遍历获取每一行的数据。 然后,我们可以将Cursor对象中的数据提取出来,将其存储到一个ArrayList或ArrayAdapter中,以便后续在下拉框中显示时使用。我们可以根据需要选择ArrayList或ArrayAdapter来存储数据,其中ArrayAdapter是一个适配器类,可以将数据与下拉框控件进行关联。 最后,我们可以将ArrayAdapter设置给Spinner控件,这样就完成了下拉框与数据库的关联。Spinner将使用ArrayAdapter中的数据来显示下拉框中的选项,并根据用户的选择来获取对应的数据。 总结起来,通过SQLite数据库存储需要显示的选项数据,使用Cursor对象查询并获取数据,然后将数据存储到ArrayList或ArrayAdapter中,并将ArrayAdapter设置给Spinner控件,即可实现Android下拉框与数据库的关联。 ### 回答3: 在Android开发中,下拉框(Spinner)可以通过关联数据库来实现数据的动态加载和选择。下面是一个简单的步骤: 1. 创建数据库:首先,你需要创建一个SQLite数据库,并定义相应的表结构。可以使用SQLiteOpenHelper类来管理数据库的创建和更新操作。 2. 查询数据库:在需要使用下拉框关联数据库的地方,你可以使用SQL语句查询数据库中的数据,并将结果存储在Cursor对象中。 3. 准备数据源:创建一个ArrayList或者CursorAdapter对象,用于存储和操作查询到的数据。 4. 设置适配器:创建一个Adapter对象,根据数据源设置适配器。如果选择使用CursorAdapter,则直接使用Cursor对象作为数据源;如果选择使用ArrayList,则可以使用ArrayAdapter或者SimpleCursorAdapter。 5. 设置下拉框:通过findViewById方法获取到Spinner控件的对象,然后调用setAdapter方法将适配器设置给下拉框。 6. 监听选择:可以为Spinner设置一个监听器,当用户选择了某个选项时,可以根据选项的位置或者值来进行相应的操作。 以上就是关联数据库的下拉框的基本实现步骤。当数据库中的数据有更新时,只需要重新查询数据,更新适配器的数据源,再调用notifyDataSetChanged方法即可实现动态的数据加载和选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值