2015-02-20 3 views
0

Мне нужна ваша помощь. У меня есть listview и search edittext, когда я печатаю для поиска записи и совпадает с db, она отображает все записи. Однако, если ни одна запись не соответствует, она просто ничего не отображает. То, что я хочу сделать это, чтобы отобразить сообщение Нет найденных записейAndroid получить текущий счет, возвращенный курсором

Это то, что я пытался до сих пор:

etSearch.addTextChangedListener(new TextWatcher(){ 

     public void afterTextChanged(Editable arg0) { 


     } 

     public void beforeTextChanged(CharSequence arg0, int arg1, 
       int arg2, int arg3) { 


     } 

     public void onTextChanged(CharSequence cs, int arg1, int arg2, 
       int arg3) { 


      adapter.getFilter().filter(cs.toString()); 

     } 

    }); 

adapter.setFilterQueryProvider(new FilterQueryProvider() { 

     @Override 
     public Cursor runQuery(CharSequence constraint) { 

      String searchBy = constraint.toString(); 

      if(cursor.getCount() == 0) { 
       Log.e("Cursor", "" + "Empty result"); 
      } 

      return dbHelper.searchProduct(searchBy, telco); 

     } 
    }); 

UPDATE:

public Cursor searchProduct(String product, String telco) 
     { 

      final String MY_QUERY 
       = "SELECT * " + 
       "FROM products " + 
       "WHERE telco_code = '" + telco + "' " + 
       "AND product_code LIKE '%" + product + "%' " + // LIKE '% 
       "AND product_description LIKE '%" + product + "%';"; 

      Cursor localCursor = 
        this.myDataBase.rawQuery(MY_QUERY, null); 

      if (localCursor != null) 
       localCursor.moveToFirst(); 
      return localCursor; 

     } 

Любые идеи? Я с радостью порекомендую вам вашу помощь. Благодарю.

+0

вы пробовали 'cursor.getCount()'? –

+1

lol @answers ... очевидно ... проблема в том, что это сделано не в том месте ... также -1 (пожалуйста, исправьте вопрос), вы не указали **, где вы wana * отображаете сообщение * ** ни то, что вы используете (простой ListView? ListFragment/ListActivity?) – Selvin

ответ

0

Я решил проблему с помощью этого:

adapter.setFilterQueryProvider(new FilterQueryProvider() { 

     @Override 
     public Cursor runQuery(CharSequence constraint) { 

      String searchBy = constraint.toString(); 

      Cursor newCursor = dbHelper.searchProduct(searchBy, telco); 

      if(newCursor.getCount() == 0) { 
       Log.e("Cursor", "Empty"); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         tvHeader.setVisibility(View.VISIBLE); 
         tvHeader.setText(getResources().getString(R.string.no_products)); 
        } 
       }); 
      } else { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         tvHeader.setVisibility(View.GONE); 
        } 
       }); 
      } 

      return newCursor; 

     } 
    }); 
1

Заменить

if(cursor == null) 

с

if(cursor != null && cursor.getCount() == 0) 

РЕДАКТИРОВАТЬ:

реализовать метод runQuery() таким образом:

@Override 
    public Cursor runQuery(CharSequence constraint) { 

     String searchBy = constraint.toString(); 

     Cursor cursor = dbHelper.searchProduct(searchBy, telco); 

     if(cursor != null && cursor.getCount() == 0){ 

      new AlertDialog.Builder(this) 
       .setTitle("No Records Found") 
       .setMessage("No records are available.") 
       .setPositiveButton(android.R.string.ok, null) 
       .setIcon(android.R.drawable.ic_dialog_alert) 
       .show(); 
      } 

     return cursor; 

    } 

Попробуйте это. Это должно сработать.

+0

спасибо, что это работает. Мне не было известно о getCount() –

+0

он не может ... вопрос: * Что я хочу сделать, это отобразить сообщение. Не найдено записей * ... вы его прочитали? – Selvin

+0

Да, я все еще пытаюсь выяснить, куда положить сообщение –

1

Изменить следующих строки

if(cursor == null) 

в

if(cursor != null &&cursor.getCount() == 0) 

Надеется, что это поможет.

-1

Используйте функцию представления списка ListView.

В макете, где у вас есть свой ListView, вы также добавляете представление, которое вы покажете, когда ListView пуст. Затем при инициализации (в коде) ListView вы назначаете пустой вид.

ListView теперь отобразит и скроет пустое представление в зависимости от того, загружен ли ListView или нет.

activity_main.xml:

<FrameLayout ... >  

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

    <TextView 
     android:id="@+id/emptyView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text="Nothing to show..." /> 

</Frameayout> 

MainActivity.java:

ListView listView = (ListView) findViewById(R.id.list); 
    listView.setEmptyView(findViewById(R.id.emptyView)); 
    listView.setAdapter(adapter); 
+0

Действительно, почему нисходящий? Мой ответ - именно то, чего хочет исходный вопрос, но не знал, как спросить. Вопрос в том, что «когда нет совпадений поиска, я хочу отобразить сообщение:« никаких записей не найдено ».« ListView's EmptyView делает именно это. В принятом ответе точно воспроизводятся функции EmptyView, а именно: проверяют счетчик результатов запроса и соответственно определяют видимость текстового представления «без записей». Используя 'listview.setEmptyView (tvHeader)', вы можете заменить все это на одну строку. –

Смежные вопросы