Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 180
1

Поиск в Android-справочнике

21.10.2014, 15:09. Просмотров 594. Ответов 2
Метки нет (Все метки)

Есть задача реализовать поиск в справочнике. Есть одна активити куда списком из базы данных с помощью CursorLoader выводится информация. Пробую реализовать поиск по справочнику через Android Search Widget.
На данный момент в качестве searchable activity выстуапает активити в которой выводится списком сам справуочник. Вопрос вот в чем - правильно ли это? Или нужно создать отдельную активити под поиск?

Как я понял создается копия моей активити при нажатии на поиск? Это связанные копии или нет? Могу я ее заполнять другими данными, полученными из поиска? А затем вернуться с помощью кнопки BACK к всему списку?

Добавлено через 1 час 12 минут
Приведу код. Проблема состоит в методе
Java
1
doMySearch(query);
который должен отвечать за реализацию поиска и вывод результата в текущую активити. Переопределяя список.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.example.citycode;
 
import java.util.concurrent.TimeUnit;
 
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
 
public class MainActivity extends ActionBarActivity implements LoaderCallbacks<Cursor> {
 
  ListView lvData;
  DBHelper db;
  SimpleCursorAdapter scAdapter;
 
  /** Called when the activity is first created. */
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // Открываем подключение к БД
    db = new DBHelper(this);
    db.open();
    
    // Get the intent, verify the action and get the query
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
 
 
    
    // Формируем столбцы сопоставления
    String[] from = new String[] { DBHelper.COLUMN_r_name, DBHelper.COLUMN_region, DBHelper.COLUMN_code};
    int[] to = new int[] { R.id.city_name, R.id.region_name, R.id.city_code };
 
    // Создаем адаптер и настраиваем список
    scAdapter = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0);
    lvData = (ListView) findViewById(R.id.listdata);
    lvData.setAdapter(scAdapter);
    
    
    // Создаем лоадер для чтения данных
    getSupportLoaderManager().initLoader(0, null, this);
    
    
  }
 
  protected void onDestroy() {
    super.onDestroy();
    // Закрываем подключение к БД при выходе
    db.close();
  }
  
  public void doMySearch(String query) {
        //Ищем совпадения
        Cursor cursor1 = db.fetchRecordsByQuery(query);
        startManagingCursor(cursor1);
        String[] from = new String[] { DBHelper.COLUMN_r_name, DBHelper.COLUMN_region, DBHelper.COLUMN_code};
        int[] to = new int[] { R.id.city_name, R.id.region_name, R.id.city_code };
 
        SimpleCursorAdapter records = new SimpleCursorAdapter(this,
                R.layout.item, cursor1, from, to);
        //Обновляем адаптер
        lvData.setAdapter(records);
      }
  
     @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        
        // Get the SearchView and set the searchable configuration
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_settings).getActionView();
        // Assumes current activity is the searchable activity
        //searchView.setSubmitButtonEnabled(true);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
        
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            //onSearchRequested();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
    return new MyCursorLoader(this, db);
  }
 
  @Override
  public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    scAdapter.swapCursor(cursor);
  }
 
  @Override
  public void onLoaderReset(Loader<Cursor> loader) {
  }
  
  static class MyCursorLoader extends CursorLoader {
 
      DBHelper db;
    
    public MyCursorLoader(Context context, DBHelper db) {
      super(context);
      this.db = db;
    }
    
    @Override
    public Cursor loadInBackground() {
      Cursor cursor = db.getAllData();
      try {
        TimeUnit.SECONDS.sleep(2);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      return cursor;
    }
    
  }
}
Ошибка выдается следующая:
10-21 11:32:41.357: E/AndroidRuntime(6103): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.citycode/com.example.citycode.MainActivity}: java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range. The statement has 0 parameters.

Как можно решить?

Добавлено через 2 часа 27 минут
Более детально и просто описал проьлему в другой теме: Что я неправильно делаю при реализации поиска?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2014, 15:09
Ответы с готовыми решениями:

Android поиск по сайту
Всем привет, щас попробую описать ситуацию. Задача стоит такая, на сайте есть...

Поиск в большом проекте Android Studio
Если у меня есть большой проект и этот проект писал не я. Но я хочу найти в...

Поиск движка для создания 2D игры под Android
Доброго времени суток, уважаемые форумчане! Не так давно (недели две назад)...

Поиск книг по программированию под Android в среде разработки Xamarian/VisualStudio/dot42
Прошу помоши в поиске книг по программированию под андроид в среде разработки...

Хранение данных в приложении-справочнике
Есть задача написать приложение со списком заведений города... Есть текстовой...

2
DemD10
59 / 48 / 13
Регистрация: 03.09.2013
Сообщений: 470
21.10.2014, 18:43 2
Смотря чего ты добиваешься. Как понял я тебе в списке просто нужно найти что-то. Так зачем тогда другая активность?
0
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 180
21.10.2014, 19:31  [ТС] 3
Я просто не очень разобрался как правильно реализовывать поиск... У меня выдается ошибка в коде, и я не пойму что я делаю не так... Активити в приведенном коде одна, что не так - не пойму... Помогииите!
Кстати запрос из класса с БД выглядит вот так:

Java
1
2
3
4
5
6
      String sqlQuery1 = "SELECT * FROM city AS t1, region AS t2 WHERE t1.region_number LIKE '%" + "?" + "%'";
      
         //Поиск запросом LIKE
      public Cursor fetchRecordsByQuery(String query) {
          return  myDataBase.rawQuery(sqlQuery1, new String[] {query});
      }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2014, 19:31

Откуда берутся атрибуты android:layout_width и android:layout_height в элементе LinearLayout?
Недавно начал изучать Android API, а сегодня более менее разобрал основы...

Не предлагается установка Android SDK при установке Android Studio
на сайте https://developer.android.com/studio/... скачал exeшник для...

Android studio, как запускать программу сразу на android смартфоне подключенному к usb?
android studio, как запускать программу сразу на android смартфоне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru