Как использовать LoaderManager и CursorLoader внутри OnClickItemListener Android ListView

У меня есть простое (?) Android-приложение, которое начинается с Activity («Первое действие») с ListView, в котором перечислены три элемента: Beginning, Intermediate и Advanced. Все идет нормально. Далее я хочу, чтобы пользователь нажимал, например. Вначале будет запрошена база данных SQLite, и будут извлечены все элементы, обозначенные как «Начало» в базе данных. Затем я хочу запустить второе действие («Второе действие») и отобразить все элементы из запроса в ListView в этом действии. У меня это работает с помощью курсора, но я пытаюсь обновить свой код, чтобы использовать LoaderManager и CursorLoader. Я думаю, что мне нужно поместить метод onCreateLoader в метод onItemClick ListView в первом действии. Чтобы привести пример, я думаю о таком коде:

public class FirstActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {
    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ListView listview = getListView();
    String[] values = new String[] {
            "Beginning", "Intermediate", "Advanced"
    };

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);
    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(this, <myUri>,
            <myFields>, <myQuery>, null, null); 
}               
        }

    });
}

}

Также в моем onClickItem я собираюсь создать Intent и заполнить его пакетом данных (ListView моей второй активности понадобятся эти данные для его метода onItemClick). В любом случае, когда я пытаюсь это сделать, Eclipse недоволен onCreateLoader внутри onItemClick, выдавая мне множество сообщений об ошибках о несоответствии фигурных скобок, отсутствующих точках с запятой и т. д. Так что же я делаю неправильно? Как мне запросить мою базу данных при нажатии на элемент списка? Если я перемещаю метод onCreateLoader за пределы метода onItemClick, но внутри setItemClickListener, я не получаю сообщения об ошибках, но как мне тогда ссылаться на него в моем методе onItemClick?

Любая помощь приветствуется. Спасибо заранее!


Большое спасибо за оба ответа! Я новичок в Android; Я пытаюсь реализовать ваши предложения и снова застрял. Я создал новую активность под названием GetLevelData. Моя первая активность теперь выглядит так:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ListView listview = getListView();
    final String[] values = new String[] {
            "Beginning", "Intermediate", "Advanced"
    };

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);
    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            Intent choice = new Intent(getApplicationContext(), com.MyProject.project.GetLevelData.class);
            Bundle dataBundle = new Bundle();
            String chosenValue = values[position];
            dataBundle.putString("Level",chosenValue);
            choice.putExtras(dataBundle);
            try {
                startActivity(choice);
            } catch (Exception e) {
                Dialog d = new Dialog(getApplicationContext());
                d.setTitle("MyProjectActivity line 60");
                TextView tv = new TextView(getApplicationContext());
                tv.setText(e.toString());
                d.setContentView(tv);
                d.show();
            } finally {

            }
        }

    });
}

Моя новая активность выглядит так:

public class GetLevelData extends Activity {
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.leveldata);

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

    if (info != null){
        TextView myTextView = (TextView)findViewById(R.id.textView1);
        String level = info.getString("Level");
        myTextView.setText(level);
    }
}

}

textView1 — это TextView внутри LinearLayout в leveldata.xml в моей папке макета. Когда я пытаюсь запустить это, в startActivity я получаю исключение: действие не найдено. Что мне не хватает? Я'


person Melanie    schedule 16.10.2012    source источник
comment
В onClick я бы начал новую активность, она выполняет всю загрузку, а затем либо отображает результат, либо переходит к третьей активности (как вы хотите), чтобы отобразить результат. Таким образом, вы можете получить некоторую ясность в своем коде, и у каждого действия есть только одна обязанность. Это может прояснить, как использовать загрузчик для вас, а затем   -  person Blundell    schedule 17.10.2012


Ответы (2)


Чтобы было проще, передайте выбор второму действию, а не курсору. Также CursorLoader предназначен для обработчиков содержимого, а не для обычных курсоров. В прошлый раз, когда я делал что-то подобное, я полагаю, что унаследовал AsyncTaskLoader.

Таким образом, передайте выбор дополнительно в намерении и позвольте второму действию выполнить запрос.

person Tobias Ritzau    schedule 16.10.2012
comment
Большое спасибо, Тобиас. Знаете ли вы ссылку с хорошим простым примером использования AsyncTaskLoader? - person Melanie; 18.10.2012
comment
Да, Тобиас, я пытался задать свой вопрос в комментарии, но он не прошел - может быть, потому, что я включал код? В любом случае, теперь я буду задавать вопросы в новых темах. Ваше предложение добавить мою активность в манифест было проблемой. Я новичок в Android, и меня постоянно отвлекают от этого проекта, поэтому я чувствую, что мне нужно снова и снова изучать Java для Android. Эрк. И я отметил ваш ответ как полезный, но я не знаю, потребовалось ли это. Так что спасибо, спасибо, спасибо! - person Melanie; 18.10.2012

Чтобы ответить на самый последний вопрос для тех, кто найдет этот пост:

textView1 is a TextView inside a LinearLayout in leveldata.xml in my layout folder. When I try to run this, at startActivity, I get an exception: Activity not found. What am I missing?

Вам необходимо зарегистрировать новую активность в манифесте. Используя что-то подобное в файле AndroidManifest:

<activity android:name="com.my.package.GetLevelData"
        android:label="Level Data" />
person jacobianism    schedule 06.08.2013