2014-10-23 3 views
0

У меня такая проблема. У меня есть один ListView, и в первую очередь я его заполняю из базы данных SQLIte с помощью адаптера. Затем я реализую поиск и хочу поместить новые данные поиска в этот ListView (метод doMySearch), но я получаю тот же результат - данные не обновляются. Что можно сделать, чтобы исправить это? Вот код:Не удается обновить ListView с помощью адаптера

package com.example.citycode; 

import android.app.SearchManager; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.ListView; 
import android.widget.SearchView; 
import android.widget.SimpleCursorAdapter; 

public class MainActivity extends ActionBarActivity { 

    ListView lvData,lvData1; 
    DBHelper db; 
    SimpleCursorAdapter scAdapter; 
    Cursor cursor; 
    Cursor cursor1; 

    final String LOG_TAG = "myLogs"; 
    final String LOG_TAG1 = "myLogs1"; 

    /** 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); 
    } 

    // получаем курсор 
    cursor = db.getAllData(); 
    startManagingCursor(cursor); 

    // Формируем столбцы сопоставления 
    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, cursor, from, to); 
    lvData = (ListView) findViewById(R.id.listdata); 
    lvData.setAdapter(scAdapter); 
    } 

    public void doMySearch(String query) { 
     lvData1 = (ListView) findViewById(R.id.listdata); 
     //Ищем совпадения 
     Log.d(LOG_TAG, "Before get the C"); 
     cursor1 = db.fetchRecordsByQuery(query); 
     Log.d(LOG_TAG, "After get the C"); 
     String t = Integer.toString(cursor1.getCount()); 
     Log.d(LOG_TAG, t); 
     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 scAdapter1; 

     scAdapter = new SimpleCursorAdapter(this, 
       R.layout.item, cursor1, from, to); 

     Log.d(LOG_TAG, "Setting the adapter"); 
     //Обновляем адаптер 
     logCursor(cursor1); 
     lvData1.setAdapter(scAdapter); 
     Log.d(LOG_TAG, "Adapter was set"); 
     } 

//вывод в лог данных из курсора 
void logCursor(Cursor c) { 
    if (c != null) { 
    if (c.moveToFirst()) { 
     String str; 
     do { 
     str = ""; 
     for (String cn : c.getColumnNames()) { 
      str = str.concat(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; "); 
     } 
     Log.d(LOG_TAG1, str); 
     } while (c.moveToNext()); 
    } 
    } else 
    Log.d(LOG_TAG1, "Cursor is null"); 
} 



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

     // Associate searchable configuration with the SearchView 
     SearchManager searchManager = 
       (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = 
       (SearchView) menu.findItem(R.id.action_settings).getActionView(); 
     searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 

     return true; 
    } 


    protected void onDestroy() { 
    super.onDestroy(); 
    // закрываем подключение при выходе 
    db.close(); 
    } 

} 
+0

В ваш 'onCreate' вы сначала выполните поиск с помощью' doMySearch (query) ', а затем перейдете к' db.getAllData(); 'который заменит ваши результаты поиска. Для начала попробуйте вставить 'return' после' doMySearch (query) '. –

ответ

0

В настоящий момент вы должны переписать результат поиска по вызову db.getAllData().

Поскольку doMySearch делает почти то же самое, как ваш onCreate, попробуйте удалить ваш doMySearch и добавьте следующий код (заменяющий onCreate, добавив onNewIntent и loadData, который выполняет поиск или загружает все данные, в противном случае).

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

    // Get the ListView once. 
    lvData = (ListView) findViewById(R.id.listdata); 

    // открываем подключение к БД 
    db = new DBHelper(this); 
    db.open(); 

    loadData(getIntent()); 

} 

// Also handle calls to onNewIntent. 
@Override 
protected void onNewIntent(Intent intent) { 
    loadData(intent); 
} 

// Perform a search or load all data. 
private void loadData(Intent intent){ 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     cursor = db.fetchRecordsByQuery(query); 
    } else { 
     cursor = db.getAllData(); 
    } 

    startManagingCursor(cursor); 

    // Формируем столбцы сопоставления 
    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, cursor, from, to); 
    lvData.setAdapter(scAdapter); 
} 
+0

Большое вам спасибо! Он работает сейчас! Но почему я не мог изменить данные ListView с помощью метода doMySearch? Почему данные не обновлялись? Является ли ваша реализация лучшей? Или лучше сделать еще одну операцию для поиска? Как вы думаете? Еще раз спасибо! – SergeiK

+0

Вы также можете использовать метод 'doMySearch', но после вызова его в' onCreate' вам нужно будет убедиться, что ** не ** заполнить 'ListView' ** всеми ** результатами из базы данных (в вашем Например, примерно в трех строках ниже 'doMySearch' вы начинаете получать все записи из базы данных и устанавливаете их в« ListView ». Теперь, как это работает, существует также менее избыточный код, что всегда хорошо. :) –

+0

Не могли бы вы пожалуйста, покажите вариант с методом doMySearch, если это возможно? Способ использования onluy - не выбирать все данные? Но почему? Ваш вариант, безусловно, намного лучше. Но я хотел бы понять, что не так с моим) – SergeiK

0

Вы пытались scAdapter.notifyDataSetChanged();? Это общий вызов, когда вы хотите, чтобы ваше представление отражало обновления данных.

+0

Где я должен писать? Не могли бы вы написать весь код? Дело в том, что я попробовал, но может быть в неправильном месте. – SergeiK

0

Попытка удалить Д.Е. lvData1 и использовать lvData в doMySearch и удалить:

lvData1 = (ListView) findViewById(R.id.listdata);

у вас есть aready findViewById в onCreated.

0

Вы можете попробовать, как это,

  runOnUiThread(new Runnable() { 
       public void run() { 
        scAdapter.notifyDataSetChanged() 
       } 
      }); 

попробовать это, у меня есть комментарии несколько строк «// Комментарий Тарака» и добавил несколько строк «// DO Тарака»

public class MainActivity extends ActionBarActivity { 

    ListView lvData,lvData1; 
    DBHelper db; 
    SimpleCursorAdapter scAdapter; 
    Cursor cursor; 
    Cursor cursor1; 

    final String LOG_TAG = "myLogs"; 
    final String LOG_TAG1 = "myLogs1"; 

    /** 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); 
    } 

    // получаем курсор 
    cursor = db.getAllData(); 
    startManagingCursor(cursor); 

    // Формируем столбцы сопоставления 
    // Comment Tharaka String[] from = new String[] { DBHelper.COLUMN_r_name, DBHelper.COLUMN_region, DBHelper.COLUMN_code}; 
    // Comment Tharaka int[] to = new int[] { R.id.city_name, R.id.region_name, R.id.city_code }; 

    // создааем адаптер и настраиваем список 
    // Comment Tharaka scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to); 
    // Comment Tharaka lvData = (ListView) findViewById(R.id.listdata); 
    // Comment Tharaka lvData.setAdapter(scAdapter); 
    } 

    public void doMySearch(String query) { 
     lvData1 = (ListView) findViewById(R.id.listdata); 
     //Ищем совпадения 
     Log.d(LOG_TAG, "Before get the C"); 
     cursor1 = db.fetchRecordsByQuery(query); 
     Log.d(LOG_TAG, "After get the C"); 
     String t = Integer.toString(cursor1.getCount()); 
     Log.d(LOG_TAG, t); 
     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 scAdapter1; 

     scAdapter = new SimpleCursorAdapter(this, 
       R.layout.item, cursor1, from, to); 

     //DO Tharaka 
     lvData.setAdapter(scAdarpter); 
     Log.d(LOG_TAG, "Setting the adapter"); 
     //Обновляем адаптер 
     logCursor(cursor1); 
     lvData1.setAdapter(scAdapter); 
     Log.d(LOG_TAG, "Adapter was set"); 
     } 

//вывод в лог данных из курсора 
void logCursor(Cursor c) { 
    if (c != null) { 
    if (c.moveToFirst()) { 
     String str; 
     do { 
     str = ""; 
     for (String cn : c.getColumnNames()) { 
      str = str.concat(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; "); 
     } 
     Log.d(LOG_TAG1, str); 
     } while (c.moveToNext()); 
    } 
    } else 
    Log.d(LOG_TAG1, "Cursor is null"); 
} 



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

     // Associate searchable configuration with the SearchView 
     SearchManager searchManager = 
       (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = 
       (SearchView) menu.findItem(R.id.action_settings).getActionView(); 
     searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 

     return true; 
    } 


    protected void onDestroy() { 
    super.onDestroy(); 
    // закрываем подключение при выходе 
    db.close(); 
    } 

} 
+0

Не работает. Или я ошибаюсь. Пожалуйста, покажите весь код. – SergeiK

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