質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

SimpleCursorAdapterを基に作ったListViewをフィルターしたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 329

tabasu

score 6

android studio勉強中の初心者です。

SimpleCursorAdapterを基に作ったListViewをエディットから入力した値のものでフィルターしたいのですが、調べてみるとSimpleCursorAdapterでは動的にできないようなことも書いてあるのですが、フィルター機能の実装は、難しいのでしょうか。

よろしくお願いします。

MainActivity.java

package com.example.phonelist_test;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SimpleCursorAdapter;

import java.util.ArrayList;

    /*
    Androidのデータ取得処理
    1.データベースヘルパーオブジェクト取得
    2.ヘルパーオブジェクトからデータベース接続オブジェクトをもらう
    3.SQL文字列を作成する
    4.SQLを実行する
    5.カーソルをループさせる
    6.カーソルループ内で各行のデータを取得する
    */

    /*
    rawQuery()はselect文専用です。
    insert、update、delete等は、execSQL()メソッドを使います。
    */

public class MainActivity extends Activity implements OnClickListener,
        OnItemClickListener {

    //データベースヘルパーオブジェクトを作成
    private MyOpenHelper helper = new MyOpenHelper(this);

    //データベース
    private SQLiteDatabase db;

    //新規ボタン
    private Button entryButton;

    //削除ボタン
    private Button deleteButton;

    //電話リスト
    private ListView listView;

    //電話帳テーブル名
    private String tableName = "person";

    //ダイアログ
    private AlertDialog alertDialog;

    private EditText search;
    private ArrayAdapter<String> adapter;       // ArrayAdapter
    private ArrayList<String> items;            // ArrayList

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //新規ボタンのオブジェクトを取得
        entryButton = (Button) findViewById(R.id.entry);

        //削除ボタンのオブジェクトを取得
        deleteButton = (Button) findViewById(R.id.delete);

        //新規ボタンにリスzzナーを設定
        entryButton.setOnClickListener(this);

        //削除ボタンにリスナーを設定
        deleteButton.setOnClickListener(this);

        //データベースヘルパーオブジェクトを作成
        MyOpenHelper helper = new MyOpenHelper(this);

        //データベースヘルパーオブジェクトからデータベース接続オブジェクトを取得
        SQLiteDatabase db = helper.getReadableDatabase();

        //検索SQL文字列の作成
        Cursor cursor = db.rawQuery("select rowid as _id," + PersonTable.NAME + ", "
                + PersonTable.NUMBER + " from person order by name ", null);



        //cursor.moveToFirst(); ※なくてもいいらしい
        //startManagingCursor(cursor);


        //ListViewにデータを渡すために用いられるアダプター

        /*
        SimpleCursorAdapterの引数について
        1.context:コンテキスト
        2.layout:表示するためのレイアウト
        3.cursor:SQLiteのCursor → 結果表が丸々格納されている
        4.from:表示させたいColumn名
        5.to:バインドする先のID
        6.flags:?
         */



        //電話帳リストを取得
        listView = (ListView) findViewById(R.id.PhoneList);



        search = (EditText) findViewById(R.id.search);
        listView.setTextFilterEnabled(true);

        ListAdapter adapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_2, cursor, new String[]{
                PersonTable.NAME, PersonTable.NUMBER}, new int[]{
                android.R.id.text1, android.R.id.text2});

        //電話帳にアダプターにアダプタオブジェクトをセットする
        listView.setAdapter(adapter);

        //電話帳にリスナーを設定
        listView.setOnItemClickListener(this);



    }


    /*
    新規ボタンと削除ボタンクリック時の分岐処理
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.entry:
                Intent entryIntent = new Intent(MainActivity.this,
                        EntryActivity.class);
                startActivity(entryIntent);
                break;

            case R.id.delete:
                Alert();
                break;

            default:
                break;
        }

    }
    //電話帳をタップした時の処理
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {

        //インテントとオブジェクトを生成
        Intent intent = new Intent(MainActivity.this, DetailActivity.class);

        //DetailActivity画面に送るデータを格納
        intent.putExtra("number", id);

        //DetailActivity画面の起動
        startActivity(intent);

    }
    /*
    警告ダイアログ設定
     */
    public void Alert() {
        //ダイアログビルダーを作成
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        //ダイアログのタイトル
        builder.setTitle("注意");

        //ダイアログメッセージを設定
        builder.setMessage("このアプリケーション内のすべてのデータを削除します。" + "\n" + "よろしいですか?");

        //Positive Buttonを設定
        builder.setPositiveButton("削除", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                //データベースのヘルパーオブジェクトからデータベース接続オブジェクトを取得
                db = helper.getWritableDatabase();

                //テーブルの削除
                db.delete(tableName, null, null);

                //インテントとオブジェクトを生成
                Intent intent = new Intent(MainActivity.this,
                        MainActivity.class);

                //画面の更新
                startActivity(intent);
            }
        });

        //Negative buttonの設定
        builder.setNegativeButton("キャンセル",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 自分で明示的にダイアログを閉じる
                        dialog.dismiss();
                    }
                });

        //ダイアログ以外を触るとダイアログが閉じる
        builder.setCancelable(true);

        //ダイアログオブジェクトを生成
        alertDialog = builder.create();

        //ダイアログの表示
        alertDialog.show();
    }

}


activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="15dp"
    tools:context=".MainActivity" >

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/search"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="9"
        android:gravity="top"
        android:orientation="horizontal" >

        <ListView
            android:id="@+id/PhoneList"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_weight="1"
        android:gravity="bottom"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/entry"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_weight="1"
            android:text="新規 " />

        <Button
            android:id="@+id/delete"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_weight="1"
            android:text="すべてのデータ削除" />
    </LinearLayout>

</LinearLayout>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

SimpleCursorAdapterでは動的にできないようなことも書いてある

どのように書いてあったのか, ネットなら URL , 書籍なら書籍名やページ等と, その文言を教えて頂けますか.

SimpleCursorAdapter は名前の通りシンプルに, コンストラクタの第3引数の Cursor のデータを全て表示するだけだったと思います.
ですので, 「エディット」の入力から SQL を生成して Query し, その Cursor から新しい SimpleCursorAdapter を生成して listView に再設定しては如何でしょう.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる