0

我有一个简单的(?)Android 应用程序,它以 Activity(“第一个 Activity”)开头,ListView 列出了三个项目:Beginning、Intermediate 和 Advanced。到目前为止,一切都很好。接下来我想要发生的是,如果用户单击开始,将查询 SQLite 数据库,并检索数据库中指定为“开始”的所有项目。然后,我希望启动第二个 Activity(“第二个 Activity”)并将查询中的所有项目显示在该 Activity 的 ListView 中。我使用游标进行这项工作,但我正在尝试更新我的代码以使用 LoaderManager 和 CursorLoader。我认为我需要在第一个活动中的 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 不满意,给了我很多关于不匹配的花括号、缺少分号等的错误消息。那么我做错了什么?单击列表项时如何查询我的数据库?如果我将 onCreateLoader 方法移到 onItemClick 方法之外,但在 setItemClickListener 内,我不会收到错误消息,但是如何在我的 onItemClick 方法中引用它?

任何帮助是极大的赞赏。提前谢谢了!


非常感谢这两个答案!我是安卓新手;我正在尝试实施您的建议并再次陷入困境。我创建了一个名为 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 中,我得到一个异常:找不到活动。我错过了什么?我'

4

2 回答 2

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" />
于 2013-08-06T13:38:20.573 回答
0

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

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

于 2012-10-16T22:21:54.400 回答