Nano Hash - криптовалюты, майнинг, программирование

При использовании ListFragment и CursorLoader get ListFragment не может привести к сообщению

Может ли кто-нибудь указать мне на простой пример использования CursorLoader для запроса базы данных SQLite и заполнения ListFragment? Приведенный ниже код будет скомпилирован, но когда я его запускаю, LogCat сообщает мне, что «ListFrag» не может быть приведен к типу LoaderManager.LoaderCallbacks. Если я изменю ListFrag так, чтобы это был не ListFrag, а просто ListFrag, мне говорят, что «ListFrag нельзя преобразовать в android.v4.support.Fragment». Обратите внимание, что моя активность расширяет FragmentActivity, а мой фрагмент расширяет ListFragment из-за информации в этого форума сообщение. Я уже некоторое время пытаюсь заставить это работать, и я просто не понимаю. Вот мой код для активности, которая содержит фрагмент и спасибо:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity

public class MyList extends FragmentActivity {
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myfragment);
}
}

И вот мой код для фрагмента:

import android.app.ListFragment;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v4.app.LoaderManager;
import android.view.View;
import android.widget.ListView;

@SuppressWarnings("hiding")
public class ListFrag<Cursor> extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {   
    private static final String TABLE_BASEPATH = "MyTable_tbl";
    private static final String AUTHORITY = "SQLData";
    public static final Uri MY_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_BASEPATH);
    private static final String[] PROJECTION = new String[] { "_id", "fieldname" };
    private SimpleCursorAdapter mAdapter;
    private static final int LOADER_ID = 0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Intent myData = getActivity().getIntent();
        Bundle info = myData.getExtras();


            SimpleCursorAdapter adapter;
            String[] dataColumns = { "fieldname" };
            int[] viewIDs = { R.id.mydetails };
            adapter = new SimpleCursorAdapter(getActivity(), R.layout.mylist, null, dataColumns, viewIDs, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            setListAdapter(adapter);
            getLoaderManager().initLoader(0, info, (LoaderCallbacks<Cursor>) this); 

    }

          @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        String item = (String) getListAdapter().getItem(position);
        DetailFrag frag = (DetailFrag) getFragmentManager().findFragmentById(R.id.frag_detail);
        if (frag != null && frag.isInLayout()) {
            frag.setText(item);
        }
    }

    @SuppressWarnings("unchecked")
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        String selection = "level='" + args.getString("Level") + "'";
        return (Loader<Cursor>) new CursorLoader(getActivity(), MY_URI,
                PROJECTION, selection, null, null); 
    }
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        switch (loader.getId()) {
          case LOADER_ID:
            mAdapter.swapCursor((android.database.Cursor) cursor);
            break;
        }


    }
    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);

    }

}

Только что увидел ваш комментарий о LogCat. Упс. Вот весь мой LogCat:

11-05 15:47:27.953: D/dalvikvm(553): Not late-enabling CheckJNI (already on)
11-05 15:47:28.643: I/dalvikvm(553): threadid=3: reacting to signal 3
11-05 15:47:28.683: I/dalvikvm(553): Wrote stack traces to '/data/anr/traces.txt'
11-05 15:47:29.143: I/dalvikvm(553): threadid=3: reacting to signal 3
11-05 15:47:29.153: I/dalvikvm(553): Wrote stack traces to '/data/anr/traces.txt'
11-05 15:47:29.643: I/dalvikvm(553): threadid=3: reacting to signal 3
11-05 15:47:29.653: I/dalvikvm(553): Wrote stack traces to '/data/anr/traces.txt'
11-05 15:47:30.143: I/dalvikvm(553): threadid=3: reacting to signal 3
11-05 15:47:30.153: I/dalvikvm(553): Wrote stack traces to '/data/anr/traces.txt'
11-05 15:47:30.643: I/dalvikvm(553): threadid=3: reacting to signal 3
11-05 15:47:30.693: D/gralloc_goldfish(553): Emulator without GPU emulation detected.
11-05 15:47:30.693: I/dalvikvm(553): Wrote stack traces to '/data/anr/traces.txt'
11-05 15:47:32.843: E/ActivityThread(553): Failed to find provider info for SQLData
11-05 15:47:32.883: D/AndroidRuntime(553): Shutting down VM
11-05 15:47:32.883: W/dalvikvm(553): threadid=1: thread exiting with uncaught exception    (group=0x409c01f8)
11-05 15:47:32.903: E/AndroidRuntime(553): FATAL EXCEPTION: main
11-05 15:47:32.903: E/AndroidRuntime(553): java.lang.NullPointerException
11-05 15:47:32.903: E/AndroidRuntime(553):  at com.MyKnitCards.project.ListFrag.onLoadFinished(ListFrag.java:71)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:425)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:393)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.Loader.deliverResult(Loader.java:103)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:81)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:35)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:221)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.os.Looper.loop(Looper.java:137)
11-05 15:47:32.903: E/AndroidRuntime(553):  at android.app.ActivityThread.main(ActivityThread.java:4424)
11-05 15:47:32.903: E/AndroidRuntime(553):  at java.lang.reflect.Method.invokeNative(Native Method)
11-05 15:47:32.903: E/AndroidRuntime(553):  at java.lang.reflect.Method.invoke(Method.java:511)
11-05 15:47:32.903: E/AndroidRuntime(553):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-05 15:47:32.903: E/AndroidRuntime(553):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-05 15:47:32.903: E/AndroidRuntime(553):  at dalvik.system.NativeStart.main(Native Method)
11-05 15:47:33.213: I/dalvikvm(553): threadid=3: reacting to signal 3
11-05 15:47:33.233: I/dalvikvm(553): Wrote stack traces to '/data/anr/traces.txt'
11-05 15:47:33.513: I/dalvikvm(553): threadid=3: reacting to signal 3
11-05 15:47:33.533: I/dalvikvm(553): Wrote stack traces to '/data/anr/traces.txt'


Ответы:


1

Сначала попробуйте переключить эти импорты на версии библиотеки поддержки. Изменять:

import android.app.ListFragment;
import android.app.LoaderManager.LoaderCallbacks;

to:

import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;

Затем убедитесь, что вы запрашиваете диспетчер фрагментов поддержки:

DetailFrag frag = (DetailFrag) getActivity().getSupportFragmentManager().findFragmentById(R.id.frag_detail);
//                                              ^^^^^^^

(Это может не решить все, если вам все еще нужна помощь в публикации ошибок LogCat из этих изменений, чтобы мы могли точно видеть, что происходит.)


Дополнение mAdapter равно null, измените adapter на mAdapter здесь:

mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.mylist, null, dataColumns, viewIDs, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
05.11.2012
  • Спасибо за быстрый ответ! Я внес два изменения в предложенный вами импорт, но замена getFragmentManager на getSupportFragmentManager не скомпилировалась. Ошибка заключалась в том, что getSupportFragmentManager() не определен для типа ListFrag‹Cursor›. Изменение имени моего класса на просто ListFrag не помогло. Итак, с двумя импортами, указывающими на библиотеку поддержки и вызывающими getFragmentManager, я опубликую свой LogCat в следующем комментарии. 06.11.2012
  • Добавьте LogCat к своему вопросу с правкой (в левом нижнем углу), комментарии плохо форматируются... 06.11.2012
  • Хорошо, я не могу опубликовать весь свой LogCat; это слишком долго, но есть эта строка: 11-05 15:47:32.843: E/ActivityThread(553): не удалось найти информацию о поставщике для SQLData. Это дает нам подсказку? SQLData — это мой класс, определяющий базу данных SQLite. В качестве альтернативы я могу опубликовать весь свой LogCat в качестве ответа на вопрос, но я не уверен, что это разрешено. Посоветуйте и спасибо! 06.11.2012
  • Хорошо, я просто поставил LogCat в начальный вопрос. 06.11.2012
  • Хм, это ошибка вашего ContentProvider. Я искал Не удалось найти информацию о поставщике и это может помочь. 06.11.2012
  • Я заметил, что вы случайно используете SimpleCursorAdapter adapter, а не mAdapter в onCreate(), мой новый ответ показывает, что нужно изменить. Что дальше? :) 06.11.2012
  • Хммм... Насколько я понимаю, мне нужен ContentProvider только в том случае, если я хочу обмениваться данными между приложениями. Это не тот случай здесь. У меня просто есть база данных (которую я создал ранее), которую я хочу запросить. Или я что-то не так понимаю? 06.11.2012
  • Да, проблема была в SimpleCursorAdapter вместо mAdapter! Это работает сейчас, хотя я не получаю никаких данных. :( Но это еще кое-что, о чем стоит покопаться. Большое вам спасибо! 06.11.2012
  • Пожалуйста. Хотя глядя на класс CursorLoader, я вижу loadInBackground() зависит от ContentProvider... 06.11.2012
  • Хорошо, я посмотрю на это. Я не использую loadInBackground, так что, возможно, это не имеет значения. Я признаю, что совершенно не понимаю, нужен ли мне ContentProvider или нет. Спасибо еще раз. 06.11.2012

  • 2

    Вы должны проверить Sherlock, они предлагают разные версии загрузчиков, работающих с фрагментами. Вам просто нужно скачать их пакет, и внутри вы найдете работающие образцы.

    Апс, я только что увидел, что этому семимесячная давность. Надеюсь, это все еще полезно.

    06.06.2013
  • По какой-то причине я так и не получил электронное письмо с уведомлением о вашем ответе. Я только сегодня это заметил. Я посмотрю на Шерлока и проголосую за вас, если это поможет. Спасибо! 15.11.2013
  • ;). если вам нравится Ruby, вы также должны проверить Ruboto. Может значительно облегчить управление базами данных. 16.11.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..