我有一个ListView
,它显示数据库中的信息。(id,名称和描述)。我正在使用LoaderManager.LoaderCallbacks<Cursor>
来加载所有信息。如何通过数据库中的ID更改某个ListView
的背景?不是所有的观点,而是某些观点?
答案 0 :(得分:2)
您需要使用自定义适配器,然后可以在getView
或bindView
(如果适配器是CursorAdapter的子类)方法中更改项目的背景,例如
@Override
public View getView(int position, View convertview, ViewGroup parent) {
View view = super.getView(position, convertview, parent);
int evenrow = ActionColorCoding.setHeadingColor(ctxt,
callerintent,
ActionColorCoding.getColorsPerGroup() -1 ) &
ActionColorCoding.transparency_evenrow;
int oddrow = evenrow & ActionColorCoding.transparency_oddrow;
if (position % 2 == 0) {
view.setBackgroundColor(evenrow);
} else {
view.setBackgroundColor(oddrow);
}
return view;
}
即这设置了交替的颜色。在这种情况下,将从应用程序定义的颜色池中检索颜色。可以直接将 evenrow 和 oddrow 设置为适当的颜色。
假设 position 可以用来可靠地确定行的 id (是否是这种情况取决于适配器的数据源),那么这很简单然后获取 id 并更改背景。
对于CursorAdapter的子类,然后将Cursor(适当放置)传递到bindView
方法,这样您就可以直接访问适当的行,尽管您也可以在getCursor
方法,并将其正确定位。
getView
在很大程度上取决于来源。通常,错误地将ArrayAdapters
用作源,而将要显示的值仅保存在ArrayList<String>
中(您会看到在SO上频繁更新和删除数据的问题)。最好使用Strings
作为源。然后ArrayList<object_that_has_members_for_all_required_data>
方法可以检索getItem
。
作为在自定义CursorAdapter的object_that_has_members_for_all_required_data
方法中实际使用 ID 的示例,以下代码已添加到上面的代码中:-
getView
列表如下:-
即薯片的背景已更改,您可以看到这些项目如何具有交替的背景颜色。
这是一个非常简单的示例应用程序,它可以通过单击项目中的按钮来更改其颜色。
Cursor c = this.getCursor();
if (c.getLong(c.getColumnIndex(DBAislesTableConstants.AISLES_ID_COL)) == 10 ) {
view.setBackgroundColor(0xFFAAFFFF);
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text1"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="Hit Me"/>
</LinearLayout>
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb.db";
public static final int DBVERSION = 1;
public static final String TB_MYTABLE = "_mytable";
public static final String COL_MYTABLE_ID = BaseColumns._ID;
public static final String COL_MYTABLE_NAME = "_name";
SQLiteDatabase mDB;
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String crtsql = "CREATE TABLE IF NOT EXISTS " +TB_MYTABLE +
"(" +
COL_MYTABLE_ID + " INTEGER PRIMARY KEY," +
COL_MYTABLE_NAME + " TEXT" +
")";
db.execSQL(crtsql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long addRow(String name) {
ContentValues cv = new ContentValues();
cv.put(COL_MYTABLE_NAME,name);
return mDB.insert(TB_MYTABLE,null,cv);
}
public Cursor getAllRows() {
return mDB.query(TB_MYTABLE,null,null,null,null,null,null);
}
}
public class CsrAdapter extends CursorAdapter {
public CsrAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return LayoutInflater.from(context).inflate(R.layout.item_list_with_button,viewGroup,false);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
Button button = view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((LinearLayout)view.getParent()).setBackgroundColor(0xFFAAFFAA);
}
});
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView text1 = view.findViewById(R.id.text1);
text1.setText(cursor.getString(cursor.getColumnIndex(DBHelper.COL_MYTABLE_NAME)));
}
}
public class MainActivity extends AppCompatActivity {
DBHelper mDBHlpr;
Cursor mCsr;
CsrAdapter mAdapter;
ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = this.findViewById(R.id.lisview);
mDBHlpr = new DBHelper(this);
mDBHlpr.addRow("Test1");
mDBHlpr.addRow("Test2");
mDBHlpr.addRow("Test3");
mCsr = mDBHlpr.getAllRows();
mAdapter = new CsrAdapter(this,mCsr,0);
mListView.setAdapter(mAdapter);
}
}
点击几个按钮后:-