Android: ListActivity с CursorAdapter не обновляется даже при наличии запроса - PullRequest
0 голосов
/ 21 марта 2011

У меня есть SearchActivity (расширяет ListActivity) и SearchAdapter, который будет извлекать результаты поиска. Я вижу в logcat, что cursor.getCount () увеличивается с каждым попаданием, а cursor.requery () возвращает true и даже getListView (). GetCount () увеличивается с каждым поисковым результатом, но ListView остается пустым. С каждым новым результатом поиска в моем адаптере также вызывается метод обновления.

Я понятия не имею, что еще может быть не так. Кто-нибудь еще здесь с такой проблемой когда-либо раньше?

public class SearchableActivity extends ListActivity implements Observer {

private static final String TAG = "SearchableActivity";
private Context mContext;
private SearchCursorAdapter mSearchAdapter;
private Uri cpUri;
private ListView mListView;
private Runnable updateUI;
private Handler handleRunnable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);
    mContext = this;
    mListView = getListView();
    tvTitle.setText(getString(R.string.search_results));
    cpUri = com.pd.database.MyProvider.CONTENT_URI.buildUpon().appendPath("searchresults").build();
    Cursor cursor = this.managedQuery(cpUri, null, null, null, null);
    mSearchAdapter = new SearchCursorAdapter(mContext, cursor);
    mListView.setAdapter(mSearchAdapter);
    mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent podcastDetails = new Intent(getApplicationContext(), MPDetails.class);
            podcastDetails.putExtra("id", id);
            startActivity(pDetails);
        }
    });
    handleRunnable = new Handler();
    updateUI = new Runnable() {

        @Override
        public void run() {
            Log.d(TAG, "in Runnable()");
            Log.d(TAG, "cursor.getCount() beforde: " + String.valueOf(mSearchAdapter.mCursor.getCount()));
            Log.d(TAG, "requery returns: " + String.valueOf(mSearchAdapter.mCursor.requery()));
            Log.d(TAG, "cursor.getCount() after: " + String.valueOf(mSearchAdapter.mCursor.getCount()));
            Log.d(TAG, "count ListViewItems: " + String.valueOf(getListView().getCount()));
            mSearchAdapter.notifyDataSetChanged();
        }
    };
    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        searchForPodcasts(query);
    }
}

private void searchForPD(String query) {
    try {
        URL searchURL = new URL(MDirectories.SEARCH+query);
        RSSHandlerSearch searchHandler = new RSSHandlerSearch(mContext, cpUri);
        searchHandler.addObserver(this);
        UrlHandlerBar stuff = new UrlHandlerBar(mContext, searchURL, searchHandler, mProgressbar, cpUri, this);
        new NetworkData().execute(stuff);
    } catch (MalformedURLException e) {}
}

@Override
public void update(Observable observable, Object data) {
    handleRunnable.post(updateUI);
}

}

Ответы [ 3 ]

1 голос
/ 19 июня 2011

У меня была эта проблема и я ее исправил. Ключ должен проверить ваши вызовы getReadableDatabase (), getWritableDatabase () и close (). Помните, что в соответствии с документацией объект базы данных, возвращаемый функцией getReadableDatabase (), «действителен до тех пор, пока не будут вызваны getWritableDatabase () или close ()».

0 голосов
/ 21 марта 2011

У меня была похожая проблема с обновлением состояния пустого ListView.

Это помогло мне:

                if( myAdapter.getCount() == 0 ) {
                    myAdapter.changeCursor(newCursor);
                    myAdapter.notifyDataSetChanged();
                }

Просто я добавил код, который менял курсор, только когда listView был пуст.

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

0 голосов
/ 21 марта 2011

ИМХО setListAdapter( mSearchAdapter ) отсутствует

Вы должны добавить его в конце onCreate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...