【发布时间】:2016-02-18 13:38:29
【问题描述】:
我在ListView 中有多个项目并且项目列表大于屏幕大小。要查看所有项目,我向下滚动到ListView。 ListView 包含一个CheckBox 和两个TextView。
当我选择 ListView 的第一项时,其他项目也被选中,它在 Scroll 中向下(未显示在屏幕上,将在滚动后显示)。
当我从ListView 中删除一些项目时,它可以正常工作。剩余项目适合移动屏幕。问题仅在添加滚动时出现。
从昨天开始我就被这个问题困住了。
ListView lv=findViewById(R.id.listOfStudents);
Cursor cursor = dbHelper.fetchAllData();
final String[] columns = new String[]{CountriesDbAdapter.KEY_NAME, CountriesDbAdapter.KEY_CONTACT};
int[] to = new int[]{R.id.name, R.id.phone};
dataAdapter = new SimpleCursorAdapter(this, R.layout.student_info, cursor, columns, to, 0);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lv.setAdapter(dataAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> listView, View view, int position, long id) {
CheckBox checkBox = (CheckBox) listView.getAdapter().getView(position,view , null).findViewById(R.id.checkBox);
if (checkBox.isChecked()) {
checkBox.setChecked(false);
} else {
checkBox.setChecked(true);
}
}
});
适配器代码。 CountryDbAdapter.java
package com.example.usmanasghar.studentattendancefromdatabase;
/**
* Created by Usman Asghar on 09/02/2016.
*/
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class CountriesDbAdapter {
public static final String KEY_ROWID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_CONTACT = "contact";
public static final String KEY_PRESENT = "Present";
private static final String TAG = "CountriesDbAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_NAME = "ClassRoom";
private static final String SQLITE_TABLE = "StudentInfo";
private static final int DATABASE_VERSION = 1;
private final Context mCtx;
private static final String DATABASE_CREATE =
"CREATE TABLE if not exists " + SQLITE_TABLE + " (" +
KEY_ROWID + " integer PRIMARY KEY autoincrement," +
KEY_NAME + "," +
KEY_CONTACT +
");";
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.w(TAG, DATABASE_CREATE);
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + SQLITE_TABLE);
onCreate(db);
}
}
public CountriesDbAdapter(Context ctx) {
this.mCtx = ctx;
}
public CountriesDbAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
if (mDbHelper != null) {
mDbHelper.close();
}
}
public long createCountry(String name,
String contact) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_CONTACT, contact);
return mDb.insert(SQLITE_TABLE, null, initialValues);
}
public int deleteStudentWithId(String id) {
int doneDelete;
doneDelete = mDb.delete(SQLITE_TABLE, "_id= ?", new String[]{id});//Delete from table where _id=?
return doneDelete;
}
public Cursor fetchContactsWithId(String id){
Cursor mCursor = null;
if (id == null || id.length() == 0) {
mCursor = mDb.query(SQLITE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_CONTACT},
null, null, null, null, null);
} else {
mCursor = mDb.query(true, SQLITE_TABLE, new String[]{KEY_ROWID, KEY_NAME,KEY_CONTACT},
KEY_ROWID + " like '%" + id + "%'", null,
null, null, null, null);
}
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public void UpdateData(String Name, String PhoneNumber, String id) {
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, Name);
cv.put(KEY_CONTACT, PhoneNumber);
mDb.update(SQLITE_TABLE, cv, "_id = ?", new String[]{id});
}
public Cursor fetchCountriesByName(String inputText) throws SQLException {
Cursor mCursor = null;
if (inputText == null || inputText.length() == 0) {
mCursor = mDb.query(SQLITE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_CONTACT},
null, null, null, null, null);
} else {
mCursor = mDb.query(true, SQLITE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_CONTACT},
KEY_NAME + " like '%" + inputText + "%'", null,
null, null, null, null);
}
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchAllData() {
Cursor mCursor = mDb.query(SQLITE_TABLE, new String[]{KEY_ROWID, KEY_NAME, KEY_CONTACT},
null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchOnlyContacts() {
Cursor mCursor = mDb.query(SQLITE_TABLE, new String[]{ KEY_CONTACT},
null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public void insertSomeCountries() {
createCountry("Jordan", "03096759397");
createCountry("Liza", "03094711934");
createCountry("Johny", "03321625972");
createCountry(Xeomia", "03088800088");
createCountry("Shina", "03058825525");
}
}
【问题讨论】:
-
该行中的错误。 CheckBox checkBox = (CheckBox) listView.getAdapter().getView(position,view , null).findViewById(R.id.checkBox);它为两个项目生成相同的 id。
-
请发布您的适配器代码。
-
我添加了适配器的代码。
-
尝试用
CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox);替换CheckBox checkBox = (CheckBox) listView.getAdapter().getView(position,view , null).findViewById(R.id.checkBox); -
它不起作用。通过使用它,它只检查 ListView 中的一个复选框。如果我单击其他复选框,它将取消选中第一个复选框和第二个复选框。