Вам необходимо использовать пользовательский адаптер, и затем вы можете изменить фон элемента с помощью метода 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, Курсор (с соответствующим расположением) передается методу bindView
, чтобы вы могли напрямую обращаться к соответствующим строкам, хотя вы также можете использовать метод getCursor
в методе getView
и снова он будет соответствующим образом расположен.
ArrayAdapters
очень сильно зависит от источника. Часто ошибочно, ArrayList<String>
используется в качестве источника, и только значения, которые должны отображаться, хранятся в Strings
(часто возникают проблемы с обновлением и удалением данных в SO). Гораздо лучше использовать ArrayList<object_that_has_members_for_all_required_data>
в качестве источника. Затем метод getItem
может получить object_that_has_members_for_all_required_data
.
В качестве примера фактического использования ID в пользовательском методе CursorAdapter getView
следующий код был добавлен к приведенному выше коду: -
Cursor c = this.getCursor();
if (c.getLong(c.getColumnIndex(DBAislesTableConstants.AISLES_ID_COL)) == 10 ) {
view.setBackgroundColor(0xFFAAFFFF);
}
Список выглядит так: -

т.е. Фон для Crisps был изменен, вы можете видеть, как элементы имеют чередующиеся цвета фона.
Дополнительно
Вот пример очень простого примера приложения, которое меняет цвет элемента, нажимая кнопку в этом элементе.
Макет элемента (TextView и кнопка) item_list_with_button.xml
<?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>
DatabaseHelper DBHelper.java
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);
}
}
Адаптер пользовательского курсора CsrAdapter.java
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)));
}
}
- ПРИМЕЧАНИЕ. Button.setOnClickListener ... onCLick
- ПРИМЕЧАНИЕ. Полагаю, что вы должны действительно проверить, что родитель, как и ожидалось, перед кастом
MainActivity.java
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);
}
}
- Примечание добавит 3 строки при каждом запуске.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<ListView
android:id="@+id/lisview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
При первом запуске: -

После нажатия нескольких кнопок: -
