您的位置:首页 > 移动开发 > Android开发

关于弹框加搜索数据功能实现

2016-09-18 16:06 369 查看
先上一张图让大家好理解是什么东西,因为我也不知道这叫做什么





这是一个弹出框加上搜索功能的,为了解决平是一些选择项数据过多,主要是针对spinner的选择项才以这种形式来实现。

下面先说原理,在网上找了好多例子却没有这种实现方法,用弹框也不行,用spinner也不可能实现,所以我就想到了用Activity实现,将Activity变成弹窗的样式,来实现这个数据搜索功能

首先注册Activity并且将他注册为弹窗的样式AndroidManifest.xml中

<activity android:name=".boat.DialogActivity"
android:theme="@style/dialogstyle">
</activity>

style文件
<style name="dialogstyle">
<!--设置dialog的背景-->
<item name="android:windowBackground">@drawable/round_editstyle</item>
<!--设置Dialog的windowFrame框为无-->
<item name="android:windowFrame">@null</item>
<!--设置无标题-->
<item name="android:windowNoTitle">true</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否半透明-->
<item name="android:windowIsTranslucent">true</item>
<!--设置窗口内容不覆盖-->
<item name="android:windowContentOverlay">@null</item>
<!--设置动画,在这里使用让它继承系统的Animation.Dialog-->
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<!--背景是否模糊显示-->
<item name="android:backgroundDimEnabled">true</item>
</style>这样Activity就会已弹窗的形式来实现了
之后来看一下Activity中的布局文件

<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"
tools:context="com.ricawinter.dynamicsearch.MainActivity$PlaceholderFragment" >

<!-- to acquire focus -->
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>

<RelativeLayout android:id="@+id/top"
android:layout_width="fill_parent"
android:layout_alignParentTop="true"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:background="@drawable/top_background"
android:layout_height="40dp">

<RelativeLayout
android:id="@+id/rlSearchFrameDelete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:gravity="center_vertical" >

<EditText android:id="@+id/etSearch"
android:layout_width="fill_parent"
android:layout_height="30dp"
android:singleLine="true"
android:background="@drawable/search_frame"
android:layout_marginRight="10dp"
android:paddingLeft="32dp"
android:textSize="12sp"
android:hint="查询......"/>

<ImageView android:id="@+id/ivDeleteText"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:src="@drawable/delete"
android:layout_centerInParent="true"
android:paddingRight="20dp"
android:visibility="gone"/>

</RelativeLayout>

</RelativeLayout>

<ListView
android:id="@+id/mListView"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:layout_alignParentLeft="true"
android:cacheColorHint="#00000000"
android:layout_below="@+id/top" >
</ListView>

</RelativeLayout>


一个EditText搜索框加上一个ListView的列表
下面是Activity中的代码,来实现数据的搜索和数据的加载

package com.example.sqgl.boat;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import com.example.gkdemo.adapter.DialoglisetAdater;
import com.example.gkdemo.adapter.ShijianListItemAdapter;
import com.example.sqgl.R;
import com.umeng.analytics.MobclickAgent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class DialogActivity extends Activity{

private EditText eSearch;
private ImageView ivDeleteText;
private ListView mListView;

private ArrayList<String> mData = new ArrayList<String>();

private ArrayList<String> mListTitle = new ArrayList<String>();
private ArrayList<String> mListText = new ArrayList<String>();
// private ShijianListItemAdapter adapter2;
private DialoglisetAdater adapter2;
// private SimpleAdapter adapter;
private Bundle bundle;
private Handler myhandler = new Handler();
private String nation[];
private String nationid[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bundle = this.getIntent().getExtras();
nation=bundle.getStringArray("nation");
nationid=bundle.getStringArray("nationid");

setContentView(R.layout.activity_listdialog);

set_eSearch_TextChanged();//设置eSearch搜索框的文本改变时监听器

set_ivDeleteText_OnClick();//设置叉叉的监听器

set_mListView_adapter();//给listview控件添加一个adapter
mListView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> arg0,
View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.putExtra("name",mData.get(arg2).toString());
intent.putExtra("id",nationid[arg2]);
setResult(RESULT_OK, intent);
DialogActivity.this.finish();
}
});
}

/**
* 设置ListView的Adapter
*/
private void set_mListView_adapter()
{
mListView = (ListView) findViewById(R.id.mListView);

getmData(mData);

// adapter = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2,
// new String[]{"title"},new int[]{android.R.id.text1});
adapter2=new DialoglisetAdater(mData, DialogActivity.this);
mListView.setAdapter(adapter2);
}

/**
* 设置搜索框的文本更改时的监听器
*/
private void set_eSearch_TextChanged()
{
eSearch = (EditText) findViewById(R.id.etSearch);

eSearch.addTextChangedListener(new TextWatcher() {

@Override
public v
b0d8
oid onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
//这个应该是在改变的时候会做的动作吧,具体还没用到过。
}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
//这是文本框改变之前会执行的动作
}

@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
/**这是文本框改变之后 会执行的动作
* 因为我们要做的就是,在文本框改变的同时,我们的listview的数据也进行相应的变动,并且如一的显示在界面上。
* 所以这里我们就需要加上数据的修改的动作了。
*/
if(s.length() == 0){
ivDeleteText.setVisibility(View.GONE);//当文本框为空时,则叉叉消失
}
else {
ivDeleteText.setVisibility(View.VISIBLE);//当文本框不为空时,出现叉叉
}

myhandler.post(eChanged);
}
});

}

Runnable eChanged = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

String data = eSearch.getText().toString();

mData.clear();//先要清空,不然会叠加

getmDataSub(mData, data);//获取更新数据

adapter2.notifyDataSetChanged();//更新

}
};

/**
* 获得根据搜索框的数据data来从元数据筛选,筛选出来的数据放入mDataSubs里
* @param mDataSubs
* @param data
*/

private void getmDataSub(ArrayList<String> mDataSubs, String data)
{
int length = mListTitle.size();
for(int i = 0; i < length; ++i){
if(mListTitle.get(i).contains(data)){
HashMap<String,String> item = new HashMap<String,String>();
// item.put("FTITLE", mListTitle.get(i));
//// item.put("text", mListText.get(i));
mDataSubs.add(mListTitle.get(i));
}
}
}

/**
* 设置叉叉的点击事件,即清空功能
*/

private void set_ivDeleteText_OnClick()
{
ivDeleteText = (ImageView) findViewById(R.id.ivDeleteText);
ivDeleteText.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
eSearch.setText("");
}
});
}

/**
* 获得元数据 并初始化mDatas
* @param mDatas
*/

private void getmData(ArrayList<String> mDatas)
{
HashMap<String, String> item = new HashMap<String, String>();
// mListTitle = (ArrayList<String>) Arrays.asList(nation);
for (int i = 0; i < nation.length; i++) {
mListTitle.add(nation[i]);
mDatas.add(nation[i]);
// item.put("FTITLE", mListTitle.get(i));
}

System.out.println(mListTitle+"1241241");
System.out.println(mDatas+"333333333333");
// mListTitle.add("这是一个标题!");
// mListText.add("这是文本.\n2014.09.18.19.50");
//

// item.put("text", mListText.get(0));

// mListTitle.add("这是另一个标题!");
// mListText.add("这是另一个文本.\n2014.09.18.19.51");
//
// item = new HashMap<String, Object>();
// item.put("title", mListTitle.get(1));
// item.put("text", mListText.get(1));
// mDatas.add(item);
}

}
然后就是要在一个textiew中来触发点击这个弹框,来跳转到相关界面,这里用到了startActivityForResult因为这个弹窗是一个Activity所以选中的数据要用到上一个界面来返回数据
tv_liushoutv.setOnClickListener(new OnClickListener() {

@SuppressLint("NewApi")
@Override
public void onClick(View arg0) {

Intent intent = new Intent(InputLSRen.this,
DialogActivity.class);
Bundle bundle = new Bundle();
bundle.putStringArray("nation", type);
bundle.putStringArray("nationid", typeid);
intent.putExtras(bundle);
startActivityForResult(intent, LIUSH);
// TODO Auto-generated method stub

}

});

监听点击来跳转来触发弹窗,并把相应的数据传入
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
android.util.Log.e("onTabActivityResult", "onActivityResult");
Log.v("resultCode", resultCode + "");
Log.v("requestCode", requestCode + "");
switch (requestCode) {

case LIUSH:

if (resultCode == RESULT_OK) {

bundle = data.getExtras();

name = bundle.getString("name");
id = bundle.getString("id");

tv_jiankangtv.setText(name);
s_spinner_jiankang = id;

}
break;


通过onActivityResult的方法获取到你所点击的数值到此这个功能就实现了,有什么不懂可以留言仔细看很好理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android