SearchView搜索的整个流程

23 篇文章 0 订阅
2 篇文章 0 订阅

前几天写了那个框架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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值