Android 从数据库中快速搜索匹配数据并添加监听事件

本文介绍了一种利用ListView和CursorAdapter结合SQLite数据库实现模糊搜索的方法,并提供了详细的代码示例。

如何从数据库中搜索与我们目标相符的数据呢?
我使用的是List view+cursoradapter。现在应该很少有人使用list view了吧,原来打算换换recyclerview来写的,但是recyclerview不支持cursor view啊。暂且先记着,等日后研究出来了再改一改吧。

下面是效果图:
这里写图片描述

使用navicat进行模糊查找,结果也是一样的
这里写图片描述
贴出核心代码:

package com.example.geekp.searchfromdatabase;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.example.geekp.searchfromdatabase.dbDao.Config;
import com.example.geekp.searchfromdatabase.dbDao.DBHelper;
import com.example.geekp.searchfromdatabase.dbDao.DBUtil;
import com.example.geekp.searchfromdatabase.dbDao.DBUtilConcreate;

import butterknife.BindView;
import butterknife.ButterKnife;

import static com.example.geekp.searchfromdatabase.GlobeContext.getContext;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.edittext)
    EditText mEditText;
    @BindView(R.id.imageview)
    ImageView mImageView;
    @BindView(R.id.textview)
    TextView mTextView;
    @BindView(R.id.listview)
    ListView mListView;
    Cursor cursor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        DBUtil dbUtil= DBUtilConcreate.getInstance();
        dbUtil.initDataBase();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        initView();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        cursor.close();
    }

    private void initView() {


        //设置删除图片的点击事件
        mImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //把EditText内容设置为空
                mEditText.setText("");
                //把ListView隐藏
                mListView.setVisibility(View.GONE);
            }
        });

        //EditText添加监听
        mEditText.addTextChangedListener(new TextWatcher() {
            @Override
            //文本改变之前执行
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            //文本改变的时候执行
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //如果长度为0
                if (s.length() == 0) {
                    //隐藏“删除”图片
                    mImageView.setVisibility(View.GONE);
                } else {//长度不为0
                    //显示“删除图片”
                    mImageView.setVisibility(View.VISIBLE);
                    //显示ListView
                    showListView();
                }
            }

            //文本改变之后执行
            public void afterTextChanged(Editable s) {
            }
        });

        mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //如果输入框内容为空,提示请输入搜索内容
                if (TextUtils.isEmpty(mEditText.getText().toString().trim())) {
//                    ToastUtils.showToast(context,"请输入您要搜索的内容");
                    ToastUtils.showToast(getContext(), "请输入您要搜索的内容");
                } else {
                    //判断cursor是否为空
                    if (cursor != null) {
                        int columnCount = cursor.getCount();
                        if (columnCount == 0) {
                            //  ToastUtils.showToast(context, "对不起,没有你要搜索的内容");
                            ToastUtils.showToast(getContext(), "对不起,没有你要搜索的内容");
                        }
                    }
                }

            }
        });
    }

    private void showListView() {
        mListView.setVisibility(View.VISIBLE);
        //获得输入的内容
        String str = mEditText.getText().toString().trim();
        //获取数据库对象
//        MyOpenHelper myOpenHelper = new MyOpenHelper(getContext());
        DBHelper dbHelper = new DBHelper(getContext());
        final SQLiteDatabase db = dbHelper.getReadableDatabase();
        //得到cursor
        cursor = db.rawQuery("SELECT QuestionNum as _id,QuestionContent  FROM Question WHERE QuestionContent LIKE '%" + str + "%'", null);
        SearchViewCursorAdapter adapter = new SearchViewCursorAdapter(getContext(), cursor);

        mListView.setAdapter(adapter);

        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //把cursor移动到指定行
                cursor.moveToPosition(position);
                String name = cursor.getString(cursor.getColumnIndex(Config.COLUMN_QUESTIONCONTENT));

                String itemname = cursor.getString(cursor.getColumnIndex("_id"));
                ToastUtils.showToast(getContext(), "点击了" + name);
            }
        });
    }
}
package com.example.geekp.searchfromdatabase;

import android.content.Context;
import android.database.Cursor;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

import com.example.geekp.searchfromdatabase.dbDao.Config;


/**
 * Created by Administrator on 2016/5/21 0021.
 */
public class SearchViewCursorAdapter extends CursorAdapter {
    public SearchViewCursorAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        ViewHolder viewHolder = new ViewHolder();
        //获取view
        View view = View.inflate(context, R.layout.search_listview, null);
        //寻找控件
        viewHolder.textView = (TextView) view.findViewById(R.id.textview);
        view.setTag(viewHolder);
        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        ViewHolder viewHolder = (ViewHolder) view.getTag();
        //从cursor中获取值
        String name =cursor.getString(cursor.getColumnIndex("_id"))+cursor.getString(cursor.getColumnIndex(Config.COLUMN_QUESTIONCONTENT));
        //把数据设置到控件上面
        viewHolder.textView.setText(name);

    }

    class ViewHolder {
        TextView textView;
    }
}

需要源码的请移步我的Github

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值