Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
#1

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

21.10.2014, 15:09. Просмотров 546. Ответов 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 минут
Более детально и просто описал проьлему в другой теме: Что я неправильно делаю при реализации поиска?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2014, 15:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск в андроид справочнике (Программирование Android):

Можно ли написать веб сервер на Яве для клиента на Андроид,имея под рукой только телефон на том самом андроид? - Программирование Android
Уважаемые гуру программирования, если можно, пожалуйста, напишите поподробнее- какой программой компилировать код, какой лучше выбрать...

Хранение данных в приложении-справочнике - Программирование Android
Есть задача написать приложение со списком заведений города... Есть текстовой файл с набором данных в виде: Название организации, адрес,...

БД в Андроид - Программирование Android
Добрый день! Подскажите пожалуйста такую вещь: У меня есть 3-ри класса... К примеру: Компания, Клиент, Услуги... И есть необходимость...

Андроид БД - Программирование Android
Всем привет!!! Я в програмировании не силен, поэтому надеюсь на Вашу помощь. Хочу написать программу, где пользователь выбирает из...

С++ и Андроид - Программирование Android
Есть программы на виндовс (писал на вс 2010) , хочу их переписать под андроид. Очевидно что ехе мой там не работает) Задам несколько...

Андроид и MySql - Программирование Android
Доброго времени суток всем! Я только начал разбираться в программировании под андроид. Подскажите с чего начать чтобы подружить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 438
21.10.2014, 18:43 #2
Смотря чего ты добиваешься. Как понял я тебе в списке просто нужно найти что-то. Так зачем тогда другая активность?
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
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});
      }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2014, 19:31
Привет! Вот еще темы с ответами:

Версии Андроид - Программирование Android
Только начал изучать Android и возник вопрос по SDK. Установил SDK на винду, все пакеты, которые предлагались, оказалось, что они весят...

На С++ под андроид - Программирование Android
Можно ли создать приложение которое содержит только код на С++ без строчки на java? Ну то есть на чистом ndk, и при этом у меня будет...

Погода в андроид - Программирование Android
Как мне реализовать погоду, причем чтобы проорамма находила мое местоположение и по нем искала погоду

Приложении на андроид - Программирование Android
есть код линейной диаграммы, я хочу чтобы данные(то есть точки) вводились в текстовое поле и потом считывались при клике и добавлялись в...


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

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

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