Найти представление по идентификатору из базы данных (не findViewById) - PullRequest
0 голосов
/ 26 июня 2018

У меня есть ListView, который отображает информацию из базы данных (идентификатор, имя и описание). Я использую LoaderManager.LoaderCallbacks<Cursor> для загрузки всей информации. Как я могу изменить фон определенного ListView по идентификатору из базы данных? Не на все взгляды, а на некоторые из них?

1 Ответ

0 голосов
/ 26 июня 2018

Вам необходимо использовать пользовательский адаптер, и затем вы можете изменить фон элемента с помощью метода 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);
    }

Список выглядит так: -

enter image description here

т.е. Фон для 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>

При первом запуске: -

enter image description here

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...