如何在Android ListView的OnClickItemListener中使用LoaderManager和CursorLoader

时间:2012-10-16 21:28:54

标签: android listview android-cursorloader

我有一个简单的(?)Android应用程序,它以一个Activity(" First Activity")开头,ListView列出了三个项目:Beginning,Intermediate和Advanced。到现在为止还挺好。我接下来要发生的是,如果用户点击例如首先,将查询SQLite数据库并指定所有项目" Beginning"将检索数据库中的数据。然后我想要第二个Activity(" Second Activity")来启动并让查询中的所有项目显示在该Activity上的ListView中。我使用游标工作,但我试图更新我的代码以使用LoaderManager和CursorLoader。我认为我需要在FirstView的ListView的onItemClick方法中放入一个onCreateLoader方法。举个例子,我想到这样的代码:

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并用一捆数据填充它(我的第二个Activity的ListView将需要这个数据用于其onItemClick方法)。无论如何,当我尝试这个时,Eclipse对onItemClick中的onCreateLoader不满意,给了我很多关于不匹配的花括号,缺少分号等的错误消息。那么我做错了什么?单击列表项时如何查询我的数据库?如果我在onItemClick方法之外移动onCreateLoader方法,但是在setItemClickListener中,我没有收到错误消息,但是我如何在onItemClick方法中引用它?

非常感谢任何帮助。非常感谢提前!


非常感谢这两个答案!我是一个Android新手;我试图实施你的建议,再次陷入困境。我创建了一个名为GetLevelData的新Activity。我的第一个活动现在看起来像这样:

@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是布局文件夹中leveldata.xml中LinearLayout内的TextView。当我尝试运行它时,在startActivity,我得到一个异常:找不到Activity。我错过了什么?我&#39;

2 个答案:

答案 0 :(得分:0)

为了简单起见,将选择传递给第二个活动,而不是光标。 CursorLoader也适用于不适用于一般游标的内容处理程序。上次我做了这样的事情,我相信我继承了AsyncTaskLoader

因此,在意图中传递额外的选项,让第二个活动进行查询。

答案 1 :(得分:0)

要回答这个帖子的最后一个问题:

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" />