【问题标题】:How to implement a search filter on a listview in prepopulated sqlite android app?如何在预填充的 sqlite android 应用程序中的列表视图上实现搜索过滤器?
【发布时间】:2018-02-16 01:35:40
【问题描述】:

我是 android 开发的新手,我一直在尝试在预填充的 sqlite android 应用程序中的列表视图上实现搜索过滤器。我尝试按照各种教程开始,但没有成功。

搜索应该过滤学生姓名。

我有以下文件:

DatabaseHelper.java

package com.example.test.test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.util.Log;

class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_PATH = "/data/data/com.example.test.test/databases/";  //MAKE SURE TO UPDATE THIS FOR YOUR ACTIVITY!!!
    private static final String DATABASE_NAME= "test.db";
    private static final int SCHEMA_VERSION=1;
    public static final String TABLE_NAME = "students";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_TITLE = "name";
    public SQLiteDatabase dbSqlite;
    private final Context myContext;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, SCHEMA_VERSION);
        this.myContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // check if exists and copy database from resource

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public void createDatabase() {
        createDB();
    }

    private void createDB() {
        boolean dbExist = DBExists();
        if (!dbExist) {
            //By calling this method we create an empty database into the default system location
            //We need this so we can overwrite that database with our database.
            this.getReadableDatabase();
            //now we copy the database we included!
            copyDBFromResource();
        }
    }

    private boolean DBExists() {
        SQLiteDatabase db = null;
        try {
            String databasePath = DATABASE_PATH + DATABASE_NAME;
            db = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READWRITE);
            db.setLocale(Locale.getDefault());
            db.setLockingEnabled(true);
            db.setVersion(1);
        } catch (SQLiteException e) {
            Log.e("SqlHelper", "database not found");
        }

        if (db != null) {
            db.close();
        }

        return db != null ? true : false;
    }

    private void copyDBFromResource() {
        InputStream inputStream = null;
        OutputStream outStream = null;
        String dbFilePath = DATABASE_PATH + DATABASE_NAME;

        try {
            inputStream = myContext.getAssets().open(DATABASE_NAME);
            outStream = new FileOutputStream(dbFilePath);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) > 0) {
                outStream.write(buffer, 0, length);
            }

            outStream.flush();
            outStream.close();
            inputStream.close();
        } catch (IOException e) {
            throw new Error("Problem copying database from resource file.");
        }
    }

    public void openDataBase() throws SQLException {
        String myPath = DATABASE_PATH + DATABASE_NAME;
        dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);
    }

    @Override
    public synchronized void close() {
        if (dbSqlite != null)
        {
            dbSqlite.close();
        }
        super.close();
    }


    public Cursor getCursor() {
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
        queryBuilder.setTables(TABLE_NAME);
        String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE};
        //make sure you get your search by string pass correctly!
        Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null,null, null, null, "name ASC");
        return mCursor;
    }

    public String getName(Cursor c) {
        return(c.getString(1));
    }

    public Cursor getBrandByID(String id) {
        String[] args={id};

        return(getReadableDatabase()
                .rawQuery("SELECT _id, name FROM students WHERE _id=?",args));
    }
}

SelectStudent.java

  package com.example.test.test;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.text.TextWatcher;
import android.widget.FilterQueryProvider;
import android.os.Bundle;
import android.support.v7.widget.SearchView;
import android.text.Editable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


 public class SelectStudent extends Activity {

     public final static String ID_EXTRA="com.example.test.test._ID";
     private DatabaseHelper dbDatabaseHelper = null;
     private Cursor ourCursor = null;
     private DatabaseAdapter adapter=null;

     public void onCreate(Bundle savedInstanceState) {
         try
         {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_select_students);
             ListView myListView = (ListView)findViewById(R.id.myListView);
             dbDatabaseHelper=new DatabaseHelper(this);
             dbDatabaseHelper.createDatabase();
             dbDatabaseHelper.openDataBase();
             ourCursor=dbDatabaseHelper.getCursor();
             startManagingCursor(ourCursor);
             adapter=new DatabaseAdapter(ourCursor);
             myListView.setAdapter(adapter);
             myListView.setOnItemClickListener(onListClick);
         }
         catch (Exception e)
         {
             Log.e("ERROR", "ERROR IN CODE: " + e.toString());
             e.printStackTrace();
         }
     }

     private AdapterView.OnItemClickListener onListClick=new AdapterView.OnItemClickListener() {
         public void onItemClick(AdapterView<?> parent, View view, int position, long id)
         {
             Intent i=new Intent(getBaseContext(), AddCard.class);
             i.putExtra(ID_EXTRA, String.valueOf(id));
             startActivity(i);
         }
     };


     class DatabaseAdapter extends CursorAdapter {
         DatabaseAdapter(Cursor c) {
             super(SelectStudent.this, c);
         }
         @Override
         public void bindView(View row, Context ctxt, Cursor c) {
             DatabaseHolder holder=(DatabaseHolder)row.getTag();
             holder.populateFrom(c, dbDatabaseHelper);
         }
         @Override
         public View newView(Context ctxt, Cursor c, ViewGroup parent) {
             LayoutInflater inflater=getLayoutInflater();
             View row=inflater.inflate(R.layout.row, parent, false);
             DatabaseHolder holder=new DatabaseHolder(row);
             row.setTag(holder);
             return(row);
         }
     }

     static class DatabaseHolder {
         private TextView name=null;

         DatabaseHolder(View row) {
             name=(TextView)row.findViewById(R.id.studentsText);
         }

         void populateFrom(Cursor c, DatabaseHelper r) {
             name.setText(r.getName(c));
         }
     }

 }

activity_select_students.xml

<?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"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <EditText android:id="@+id/myFilter" android:layout_width="match_parent"
        android:layout_height="wrap_content" android:ems="10"
        android:hint="Search.....">
    </EditText>

    <ListView
        android:id="@+id/myListView"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@+id/myFilter" />

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/studentsText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#EE0000"
        />
</LinearLayout>

如果能帮助我入门,我们将不胜感激,在此先感谢。

【问题讨论】:

    标签: java android sqlite listview filter


    【解决方案1】:

    你可以像这样使用你的编辑文本

    seardh.addTextChangedListener(new TextWatcher() {
                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                    String strVNo = search.getText().toString();
                    searching(strVNo);
                }
    
                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {
                    // TODO Auto-generated method stub
                }
    
                @Override
                public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub
                }
            })
    

    ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      相关资源
      最近更新 更多