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

如何从数据库中搜索与我们目标相符的数据呢?
我使用的是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

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是Android登录和注册用户名密码并连接云数据库MySQL的详细代码步骤: 1. 创建一个Android项目,添加以下依赖项: ``` implementation 'com.android.volley:volley:1.1.1' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.squareup.picasso:picasso:2.5.2' ``` 2. 在XML布局文件添加登录和注册界面所需的UI元素,如EditText、Button、TextView等。 3. 创建一个Java类,用于处理与MySQL数据库的交互。该类需要继承自Volley的Request类,并实现Volley的回调接口。在该类,需要定义以下方法: - 注册方法:向MySQL数据库插入新用户的信息。 - 登录方法:从MySQL数据库检索用户信息,验证用户名和密码是否匹配。 以下是一个简单的MySQL交互类的示例代码: ```java public class MySQLHelper extends Request<String> { private Map<String, String> params; private Response.Listener<String> listener; public MySQLHelper(String url, Map<String, String> params, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); this.params = params; this.listener = listener; } @Override protected Map<String, String> getParams() throws AuthFailureError { return params; } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String responseString = ""; if (response != null) { responseString = new String(response.data); } return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response)); } @Override protected void deliverResponse(String response) { listener.onResponse(response); } public static void register(String name, String email, String password, Response.Listener<String> listener, Response.ErrorListener errorListener) { String url = "http://yourapi.com/register.php"; Map<String, String> params = new HashMap<>(); params.put("name", name); params.put("email", email); params.put("password", password); MySQLHelper request = new MySQLHelper(url, params, listener, errorListener); Volley.newRequestQueue(context).add(request); } public static void login(String email, String password, Response.Listener<String> listener, Response.ErrorListener errorListener) { String url = "http://yourapi.com/login.php"; Map<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); MySQLHelper request = new MySQLHelper(url, params, listener, errorListener); Volley.newRequestQueue(context).add(request); } } ``` 4. 在登录和注册界面的Java类,使用MySQLHelper类的方法来处理与MySQL数据库的交互,并在回调接口处理服务器的响应。 以下是一个简单的登录Activity类的示例代码: ```java public class LoginActivity extends AppCompatActivity { private EditText emailEditText, passwordEditText; private Button loginButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); emailEditText = findViewById(R.id.emailEditText); passwordEditText = findViewById(R.id.passwordEditText); loginButton = findViewById(R.id.loginButton); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String email = emailEditText.getText().toString().trim(); String password = passwordEditText.getText().toString().trim(); MySQLHelper.login(email, password, new Response.Listener<String>() { @Override public void onResponse(String response) { if (response.equals("success")) { // 登录成功 } else { // 登录失败 } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 处理错误 } }); } }); } } ``` 同样,注册Activity类的代码也类似。在注册Activity类的onClick方法,调用MySQLHelper类的register方法来处理用户注册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值