前几天写了那个框架SearchView,弹出结果不是自己想要的,所以今天就自己写一个searchview从数据库拿数据完整版。
首先看一下布局,动画没有,只是换了个输入框,去掉原始的下划线和搜索图标,其中的toolbar大家可以换成其他布局,不影响。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.myapplication14.Activity.SearchResultActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:gravity="center_horizontal"
android:orientation="horizontal">
<android.support.v7.widget.Toolbar
android:id="@+id/search_tool_bar"
android:paddingRight="16dp"
style="@style/toolbar_style">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.SearchView
android:id="@+id/search_people"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:layout_marginTop="6dp"
android:paddingLeft="27dp"
android:background="@drawable/search_shape"
app:defaultQueryHint="搜索用户名、手机号"
app:iconifiedByDefault="false"
app:queryBackground="@null"
app:searchIcon="@null"/>
<ImageView
android:layout_marginLeft="10dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_arrow_back_grey600_24dp"/>
</FrameLayout>
</android.support.v7.widget.Toolbar>
</LinearLayout>
<ListView
android:id="@+id/search_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/search_tool_bar">
</ListView>
</LinearLayout>
listView布局:只一个头像,一个名字
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/search_people_pic"
android:src="@drawable/ic_launcher"
android:layout_width="45dp"
android:layout_height="45dp"/>
<TextView
android:text="小明"
android:layout_marginLeft="6dp"
android:textSize="18sp"
android:layout_toEndOf="@+id/search_people_pic"
android:layout_centerVertical="true"
android:id="@+id/search_people_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
</LinearLayout>
下面就是看核心代码,实体类就不在这里显示了(数据加载框架xutil和ImagerLoader):
package com.example.administrator.myapplication14.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.example.administrator.myapplication14.Adapter.MySearchAdapter;
import com.example.administrator.myapplication14.MyApplication;
import com.example.administrator.myapplication14.R;
import com.example.administrator.myapplication14.be.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class SearchResultActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
MySearchAdapter mAdapter;
ListView mListView;
List<User> mList;
String url;
SearchView mSearchView;
Callback.Cancelable post;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_result);
initView();
initData();
}
private void initView() {
mSearchView= (SearchView) findViewById(R.id.search_people);
//监听事件
mSearchView.setOnQueryTextListener(this);
mListView= (ListView) findViewById(R.id.search_lv);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent=new Intent(SearchResultActivity.this,PersonCenterActivity.class);
Bundle bundle=new Bundle();
bundle.putInt("id",mList.get(i).getUser_id());
intent.putExtras(bundle);
startActivity(intent);
}
});
}
private void initData() {
url= MyApplication.getUrl()+"/QueryServlet";
mList=new ArrayList<>();
}
//提交搜索
@Override
public boolean onQueryTextSubmit(String query) {
if (!query.isEmpty()){
if (post != null && !post.isCancelled()){
post.cancel();
}
search(query);
}
return true;
}
//监听文字变化
@Override
public boolean onQueryTextChange(String newText) {
if (!newText.isEmpty()){
if(post!=null&&!post.isCancelled()){
post.cancel();
}
search(newText);
}else {
mList.clear();
mAdapter.notifyDataSetChanged();
}
return true;
}
//网络请求
private void search(String query) {
RequestParams params=new RequestParams(url);
params.addQueryStringParameter("flag","17");
params.addQueryStringParameter("query",query);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
upDateList(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
//更新界面
private void upDateList(String result) {
if (!"nothing".equals(result)){
Gson gson=new Gson();
Type type=new TypeToken<List<User>>(){}.getType();
ArrayList<User> list=gson.fromJson(result,type);
mList.clear();
mList.addAll(list);
if(mAdapter==null){
mAdapter=new MySearchAdapter(this,mList);
mListView.setAdapter(mAdapter);
}else {
mAdapter.notifyDataSetChanged();
}
}
}
}
适配器:
package com.example.administrator.myapplication14.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.administrator.myapplication14.R;
import com.example.administrator.myapplication14.be.User;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import java.util.List;
/**
* @author BULUSILI
* @描述
* @项目名称
* @包名 com.example.administrator.myapplication14.Adapter
* @2016/8/27--20:13
*/
public class MySearchAdapter extends BaseAdapter {
Context mContext;
List<User> mList;
DisplayImageOptions options;
ImageLoader imageLoader;
public MySearchAdapter(Context context, List<User> list) {
mContext = context;
mList = list;
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.load2) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.load_fail) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisk(true) // 设置下载的图片是否缓存在SD卡中
.displayer(new RoundedBitmapDisplayer(45)) // 设置成圆角图片
.build(); // 构建完成
imageLoader = ImageLoader.getInstance();
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int i) {
return mList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
ViewHolder mHolder;
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if (view == null) {
view = LayoutInflater.from(mContext).inflate(R.layout.search_people, null);
mHolder = new ViewHolder();
mHolder.mImageView = (ImageView) view.findViewById(R.id.search_people_pic);
mHolder.mTextView = (TextView) view.findViewById(R.id.search_people_name);
view.setTag(mHolder);
} else {
mHolder = (ViewHolder) view.getTag();
}
//加载数据
imageLoader.displayImage(mList.get(i).getUser_pic(), mHolder.mImageView, options);
mHolder.mTextView.setText(mList.get(i).getUser_name());
return view;
}
class ViewHolder {
ImageView mImageView; //头像
TextView mTextView; //名字
}
}
这是客户端的代码,服务端代码如下:
接口:
//搜索用户
public List<User> getNameList(String name);
实现方法(框架连接池c3p0,Gson):
@Override
public List<User> getNameList(String name) {
List<User> list=new ArrayList<User>();
//查询多项,用concat
String sql="select user_id,user_name,user_pic from user where concat(user_phone,user_name) like ?;";
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JDBCUtil.getConnection();
ps=conn.prepareStatement(sql);
ps.setString(1, "%"+name+"%");
rs=ps.executeQuery();
while(rs.next()){
int user_id=rs.getInt(1);
String user_name=rs.getString(2);
String user_pic=rs.getString(3);
User user=new User(user_id, user_name, user_pic);
list.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.releaseConnection(conn);
}
return list;
}
servlet:
case "17":
//搜索人物
String name=request.getParameter("query");
FansDaoImp fansDaoImp10=new FansDaoImp();
List<User> list=fansDaoImp10.getNameList(name);
result=gson.toJson(list);
System.out.println(result+"==result");
pw.write(result);
pw.close();
break;
偶了。因为整个代码嵌套与整个工程里面,所以就懒得拿出来了。
今天运行开了服务器,没问题,然后关闭服务器,点击输入后边取消的“X”,发现报空指针异常,所以有做了修改,只在这段代码做了修改
//监听文字变化
@Override
public boolean onQueryTextChange(String newText) {
if (!newText.isEmpty()){
if(post!=null&&!post.isCancelled()){
post.cancel();
}
search(newText);
}else {
if (mList!=null){
mList.clear();
if (mAdapter!=null){
mAdapter.notifyDataSetChanged();
}
}
}
return true;
}