下拉框

2018-10-02  本文已影响4人  GeekGray

阅读原文

下拉框

1.创建步骤

1_新建一个工程:03.下拉框

把需要的图片拷贝到工程中,

2_写布局文件

3_实例化控件并准备ListView的数据

4_设置向下箭头点击事件并实例化popupwindow

5_实例化ListView并且设置适配器

6_ListView在低版本2.3的适配并且解决各个问题

写布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <EditText
        android:singleLine="true"
        android:ellipsize="middle"
        android:paddingRight="40dp"
        android:id="@+id/et_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容..." />

    <ImageView
        android:id="@+id/iv_down_arrow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@id/et_input"
        android:layout_alignTop="@id/et_input"
        android:padding="5dp"
        android:src="@drawable/down_arrow" />

/RelativeLayout>

EditText单行显示

android:singleLine="true"

EditText省略

android:ellipsize="middle"

实例化控件并准备ListView的数据

private EditText et_input;
private ImageView iv_down_arrow;
private PopupWindow popupWindow;
private ListView listview;
private MyAdapter myAdapter;


private void initView()
    {
        iv_down_arrow = (ImageView) findViewById(R.id.iv_down_arrow);
        et_input = (EditText) findViewById(R.id.et_input);
    }

设置点击事件,点击弹出popupWindow

et_input.setOnClickListener(new OnClickListener()
        {
            
            @Override
            public void onClick(View v)
            {
                if(popupWindow==null)//如果为空则创建
                {
                    popupWindow=new PopupWindow(MainActivity.this);
                    popupWindow.setWidth(et_input.getWidth());//等于输入框的宽
                    int height=DensityUtil.dip2px(MainActivity.this, 200);
                    Toast.makeText(MainActivity.this,"height=="+height,Toast.LENGTH_SHORT).show();
                    popupWindow.setHeight(height);
                    
                    popupWindow.setContentView(listview);
                    popupWindow.setFocusable(true);//设置焦点,否则点击事件不起作用
                }
                
                popupWindow.showAsDropDown(et_input,0,0);//显示在输入框的下方,距离输入框的边距为0
            }
        });

设置listView

准备listView数据

     listview = new ListView(this);
     listview.setBackgroundResource(R.drawable.listview_background);

    //准备数据
     msgs=new ArrayList();
     for(int i=0;i<100;i++)
     {
         msgs.add(i+"--aaaaaaaaaaaaaa--"+i);
     }

设置listView的适配器

     myAdapter=new MyAdapter();
     listview.setAdapter(myAdapter);//设置ListView的背景

创建MyAdapter

class MyAdapter extends BaseAdapter
    {

        @Override
        public int getCount()
        {
            return msgs.size();
        }

        @Override
        public Object getItem(int position)
        {
            return null;
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            ViewHolder viewHolder;
            if(convertView==null)
            {
                convertView=View.inflate(MainActivity.this, R.layout.item_main, null);
                viewHolder=new ViewHolder();
                viewHolder.tv_msg=(TextView) convertView.findViewById(R.id.tv_msg);
                viewHolder.iv_delete=(ImageView) convertView.findViewById(R.id.iv_delete);
                
                convertView.setTag(viewHolder);
            }
            else
            {
                viewHolder=(ViewHolder) convertView.getTag();
            }
            
            //根据位置得到数据
            final String msg=msgs.get(position);
            viewHolder.tv_msg.setText(msg);
            
            //设置删除
            viewHolder.iv_delete.setOnClickListener(new View.OnClickListener()
            {
                
                @Override
                public void onClick(View v)
                {
                    //1.从集合中删除
                    msgs.remove(msg);
                    //2.刷新ui-适配器刷新
                    myAdapter.notifyDataSetChanged();
                }
            });
            return convertView;
        }
        
        
    }

设置item的布局和viewHolder

item布局

<?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="50dp"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="10dp">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="5dp"
        android:padding="3dp"
        android:src="@drawable/user" />

    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="5dp"
        android:layout_weight="1"
        android:gravity="center"
        android:padding="2dp"
        android:text="三个火枪手"
        android:textColor="#000000" />

    <ImageView
        android:id="@+id/iv_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="5dp"
        android:padding="3dp"
        android:src="@drawable/delete" />

</LinearLayout>

viewHolder

static class ViewHolder
    {
        TextView tv_msg;
        ImageView iv_delete;
        
    }

设置ListView的点击事件

listview.setOnItemClickListener(new OnItemClickListener()
        {
            
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                 //1.得到数据
                String msg=msgs.get(position);
                 //2.设置输入框
                et_input.setText(msg);
                
                if(popupWindow!=null && popupWindow.isShowing())//不为空且显示状态
                {
                    popupWindow.dismiss();//销毁
                    popupWindow=null;//释放资源
                }
            }
        
        });

适配

代码中创建的单位为px的,使用DensityUtil工具类转换

public class DensityUtil
{
    /**
     * 根据手机的分辨率从 dip 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue)
    {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue)
    {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读