我发现了另一个关于同样问题的问题,但代码在一个似乎不适用于我的地方有错误。对不起,如果这是重复。
我的活动应该显示用户输入的主题列表。我的问题是,当我运行应用程序时,只显示ArrayList中的第一项。老实说我不知道错误在哪里,所以我的所有相关代码都在下面,包括XML。我很感激任何人都能给我的帮助。
编辑:是的,我已经调试过了。游标和ArrayList都包含预期的项目,但ListView只显示第一个。我的DatabaseHelper类中的相关函数:
public Cursor getSubjects(int level){
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select * from "+TABLE_NAME + " where " + COL_3 + "="+level,null);
return res;
}
我的活动类的代码:
public class Level1Activity extends Activity implements OnClickListener {
private Button subject1Btn, level2Btn, level3Btn;
DatabaseHelper myDb;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_level1);
myDb = new DatabaseHelper(this);
//set up buttons
subject1Btn = (Button)findViewById(R.id.subject1);
level2Btn = (Button)findViewById(R.id.Level2);
level3Btn = (Button)findViewById(R.id.Level3);
level2Btn.setOnClickListener(this);
level3Btn.setOnClickListener(this);
lv = (ListView)findViewById(R.id.subjectList);
Cursor subjectCursor = myDb.getSubjects(1);
ArrayList<String> mArrayList = new ArrayList<String>();
for(subjectCursor.moveToFirst(); !subjectCursor.isAfterLast(); subjectCursor.moveToNext()) {
mArrayList.add(subjectCursor.getString(1));
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
this, R.layout.subject_list_item, mArrayList);
lv.setAdapter(arrayAdapter);
}
我的xml文件中的相关代码:
subject_list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<!-- Single List Item Design -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="120dp"
android:padding="10dip"
android:textSize="16dip"
android:textColor="#ffffffff"
android:textStyle="bold" >
</TextView>
activity_level1.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/app_back">
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="2dp">
<Button
android:id="@+id/subject1"
android:layout_width="match_parent"
android:layout_height="120dp"
android:onClick="onClick"
android:text="Subject 1"
android:textColor="#ff000000"
android:textSize="20sp"
android:textStyle="bold"
android:background="#ffff0000"
android:layout_margin="4dp"/>
<ListView
android:id="@+id/subjectList"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
<Button
android:id="@+id/newSubject"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center|right"
android:background="#ff444444"
android:onClick="onClick"
android:text="+"
android:textColor="#ffff0000"
android:textSize="80sp" />
</LinearLayout>
</ScrollView>
答案 0 :(得分:1)
关于只显示1个项目,您是否调试了Cursor中有多少项?或者mArrayList
中添加了多少项?尝试调试一次。
<强>建议:强>
你应该在helper类本身编写游标迭代代码,这是为了避免Activity类中的数据库操作代码。
在getSubjects()方法中包含以下代码并返回ArrayList类型:
Cursor subjectCursor = myDb.getSubjects(1);
ArrayList<String> mArrayList = new ArrayList<String>();
for(subjectCursor.moveToFirst(); !subjectCursor.isAfterLast(); subjectCursor.moveToNext()) {
mArrayList.add(subjectCursor.getString(1));
}
答案 1 :(得分:1)
我找到了问题的答案。感谢大家的帮助和调试建议。
如果其他人遇到同样的问题,那么解决方案就是:
ListView本身是可滚动的。它不会在ScrollView内部工作,因此在我的情况下,它只显示一个ArrayList中的一个项目。通过将其从ScrollView中取出,您可以指定要在屏幕上占据的高度,它将自动滚动项目。