通过数据库中的ID查找视图(不是findViewById)

时间:2018-06-26 15:24:40

标签: java android sqlite

我有一个ListView,它显示数据库中的信息。(id,名称和描述)。我正在使用LoaderManager.LoaderCallbacks<Cursor>来加载所有信息。如何通过数据库中的ID更改某个ListView的背景?不是所有的观点,而是某些观点?

1 个答案:

答案 0 :(得分:2)

您需要使用自定义适配器,然后可以在getViewbindView(如果适配器是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

列表如下:-

enter image description here

即薯片的背景已更改,您可以看到这些项目如何具有交替的背景颜色。

其他

这是一个非常简单的示例应用程序,它可以通过单击项目中的按钮来更改其颜色。

项目布局(TextView和Button) item_list_with_button.xml

    Cursor c = this.getCursor();
    if (c.getLong(c.getColumnIndex(DBAislesTableConstants.AISLES_ID_COL)) == 10 ) {
        view.setBackgroundColor(0xFFAAFFFF);
    }

DatabaseHelper DBHelper.java

<?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>

自定义光标适配器 CsrAdapter.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);
    }
}
  • 注意button.setOnClickListener ... onCLick
  • 请注意,我相信您在投射前应该真正检查父母是否符合预期

MainActivity.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)));
    }
}
  • Note每次运行将添加3行。

activity_main.xml

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);
    }
}

首次运行时:-

enter image description here

点击几个按钮后:-

enter image description here