0

私はアプリケーションを開発しています。データがSQLiteデータベースからのものであるリストビューが表示されます。String[]でデータを取得しています。

アプリケーションの必要性は次のとおりです。アクティビティの上部に検索バーを追加したいと思います。この検索バーは、アクティビティに表示されているリストに対してのみ検索を実行する必要があります。

ユーザーが検索バーに文字を入力すると、すべてのデータがその文字を含むリストビューに表示されます。

次のコードを試しました。

main.javaで

EditText search= (EditText) findViewById(R.id.edittext_searchbar);
search.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapter.getFilter().filter(s);
        adapter.notifyDataSetChanged();
    }   
    public void beforeTextChanged(CharSequence s, int start, int count,int after) {
    }
    @Override
    public void afterTextChanged(Editable s) {
    }
    });
listView.setAdapter(adapter);

そしてAdapterクラスで:

public void setData(String[] menuList) {   
    menuListofAdapter = menuList;//contains class items data.
}

@Override
public Filter getFilter() {
    return new Filter() {
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        if (results != null && results.count >= 0) {
        setData((String[]) results.values);//if results of search is null set the searched results data
    } else {
                setData(menuListofAdapter);// set original values
            }
            notifyDataSetInvalidated();
        }

        @SuppressWarnings("null")
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults result = new FilterResults();
            if (!TextUtils.isEmpty(constraint)) {
                constraint = constraint.toString();
                String[] fItem = null;
                if(Utility.mainMenuList!=null){
                    for(int i=0,j=0;i<Utility.mainMenuList.length;i++){
                    if (Utility.mainMenuList[i].equalsIgnoreCase(constraint.toString())) {
                             fItem[j] = Utility.mainMenuList[i];
                         j=j+1;
                     }else{
                     }
                 }
             }
             result.count = fItem.length;
             result.values = fItem;
         } else{
             result.count=-1;// no search results found
         }             
         return result;
        }
     };
 }

私はこれのために何をすべきですか。データはString[]にあります。リストビューで表示します。

どのような変更が必要か教えてください。

上記のコードを適用してアプリを実行して検索しようとすると、次のようなエラーが発生しました:

03-12 18:16:19.215: D/AndroidRuntime(836): Shutting down VM
03-12 18:16:19.215: W/dalvikvm(836): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-12 18:16:19.215: E/AndroidRuntime(836): FATAL EXCEPTION: main
03-12 18:16:19.215: E/AndroidRuntime(836): java.lang.ClassCastException: java.util.ArrayList
03-12 18:16:19.215: E/AndroidRuntime(836):  at com.abc.example.adapters.MyListAdapter$1.publishResults(MainMenuListAdapter.java:41)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.os.Looper.loop(Looper.java:123)
03-12 18:16:19.215: E/AndroidRuntime(836):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-12 18:16:19.215: E/AndroidRuntime(836):  at java.lang.reflect.Method.invokeNative(Native Method)
03-12 18:16:19.215: E/AndroidRuntime(836):  at java.lang.reflect.Method.invoke(Method.java:507)
03-12 18:16:19.215: E/AndroidRuntime(836):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-12 18:16:19.215: E/AndroidRuntime(836):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-12 18:16:19.215: E/AndroidRuntime(836):  at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

0

リストビューの上部に編集テキストを配置します。カスタムリストアダプターを用意することをお勧めします。

データベースの元の値のリストがあります。

検索条件に一致する一時データを設定する別のリストを用意します。

検索条件がリスト内の 1 つに一致する場合は、それらを founditmes に追加し、リストにデータを表示します。一致しない場合は元データをリストに表示します。

私は一般的な考えを与えました。以下のコードは、必要に応じて変更できます。私は自分で検索を実装しましたが、うまくいきます。

SOで質問したところ、How to implement search in CustomListView based on class item of POJO class in Android?から回答を得ました。.

以下を試してみてください。うまくいかない場合は、いつでも SO に質問を投稿できます。

     search= (EditText) findViewById(R.id.search);
     //look for text changing in edittext.
     search.addTextChangedListener(new TextWatcher() {

         public void onTextChanged(CharSequence s, int start, int before, int count) {
                         youradapter.getFilter().filter(s);
                         youradapter.notifyDataSetChanged();

         }

         public void beforeTextChanged(CharSequence s, int start, int count,
             int after) {


           }

           public void afterTextChanged(Editable s) {
           }
          });

リストにフィルターを実装する

 public void setData(ArrayList mPpst) {   
         set data either searched data or original values from database
        mPostingData = mPpst;//contains class items data.
    }

 @Override
 public Filter getFilter() {
     return new Filter() {
         @Override
         protected void publishResults(CharSequence constraint, FilterResults results) {
             if (results != null && results.count >= 0) {
                 setData( results.values);//if results match set data
             } else {
                 setData(mOri);// set data for listview original values.
             }

             notifyDataSetInvalidated();
         }



        @Override
         protected FilterResults performFiltering(CharSequence constraint) {
             FilterResults result = new FilterResults();
             if (!TextUtils.isEmpty(constraint)) {
                   ArrayList foundItems = new ArrayList();
                 constraint = constraint.toString().toLowerCase();
                 if(listitems!=null)
                 {
                         if(listitems.equals(constarint))//matching
                         foundItems.add(listitems);

                     }
                     else
                     {

                     }
                 }
                 }
                 result.count = foundItems.size();//search results found return count
                 result.values = foundItems;// return values
             } 
             else
             {
                 result.count=-1;// no search results found
             }


             return result;
         }
     };
 }

編集 1

json で解析されたデータをリストビューに設定し、検索機能を追加する方法。リンクの答えは機能します。一時データを使用し、検索機能を実行しました。データフォームデータベースを表示し、同じものを変更できます。

編集2:

 public class MainActivity extends Activity {

// List view
private ListView lv;

// Listview Adapter
ArrayAdapter<String> adapter;

// Search EditText
EditText inputSearch;


// ArrayList for Listview
ArrayList<HashMap<String, String>> productList;

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

    // Listview Data
    String products[] = {"aaa","bbbb","cccc","dddd"};

    lv = (ListView) findViewById(R.id.list_view);
    inputSearch = (EditText) findViewById(R.id.inputSearch);

    // Adding items to listview
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products);
    lv.setAdapter(adapter);

    /**
     * Enabling Search Filter
     * */
    inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            MainActivity.this.adapter.getFilter().filter(cs);   
        }

        @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                          
        }
    });
  }

}

編集3データベースからのデータで検索

 public class SearchActivity extends ListActivity {
 ArrayAdapter<String> dataAdapter = null;

  private ArrayList<String> results = new ArrayList<String>();
  private String tableName = DatabaseHandler.TABLE_SEARCH;
  private SQLiteDatabase newDB;
  ArrayAdapter<String> adapter = null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.page_search);

   DatabaseHandler dbHelper = new DatabaseHandler(this.getApplicationContext());
   newDB = dbHelper.getWritableDatabase();
   Cursor c = newDB.rawQuery("SELECT skeys FROM " +
        tableName, null);
   if (c != null ) {
    if  (c.moveToFirst()) {
        do {
            String skeys = c.getString(c.getColumnIndex("skeys"));
            results.add(skeys);
        }while (c.moveToNext());
    } 
 }           

dataAdapter = new ArrayAdapter<String>(this,
        R.layout.listviews_search, results);

setListAdapter(new ArrayAdapter<String>(this,
        R.layout.listviews_search, results));

  ListView listView = (ListView) findViewById(android.R.id.list);
  listView.setAdapter(dataAdapter);
  listView.setTextFilterEnabled(true);

  listView.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {
          Toast.makeText(getApplicationContext(),
                  ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
      }
  });

  EditText myFilter = (EditText) findViewById(R.id.search);
  myFilter.addTextChangedListener(new TextWatcher(){
      public void afterTextChanged(Editable s) {
  }

      public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  }

      public void onTextChanged(CharSequence s, int start, int before, int count) {
   dataAdapter.getFilter().filter(s.toString());
      }
  });
 }
}
于 2013-03-12T10:16:39.743 に答える
0

あなたの要件では、アンドロイドでセクションリストビューを使用する必要があります。こちらのリンクをご覧ください。 http://samir-mangroliya.blogspot.in/2012/05/android-sectioned-listview-with-search_6865.html . 大いに役立ちます。疑問がある場合はお知らせください。

于 2013-03-12T09:55:33.440 に答える