单击时切换listview项目的背景颜色

时间:2017-11-03 17:58:46

标签: android listview

我希望Listview项目的背景颜色在第一次单击时获得更改,并将之前的颜色恢复为第二次单击(切换)。 我使用以下代码,但在第二次单击它不起作用。还有一个这个应用程序应该记住listview项目重新启动后的状态。

DatabaseHelper.java

   select
     c.calendar_date on_date,
     xx.school_name,
     COALESCE(xx.cnt,0)
   from
     tbl_calendar c

   left join (
     select
       s.school_id,
       s.school_name,
       x.booked_date,
       x.cnt
     from tbl_school s
     left join (
         select 
           sb.booked_date,
           count(*) cnt,
           sb.school_id
         from 
           tbl_school_booking sb
         group by
            sb.booked_date, sb.school_id
     ) x on x.school_id = s.school_id
   ) xx on c.calendar_date=xx.booked_date;

MainActivity

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;    

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "listcolor.db";
    public static final String TABLE_NAME = "listtable";
    public static final String COL_1 = "title";
    public static final String COL_2 = "status";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + " (title TEXT, status TEXT )");
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public boolean insertData(String title, String status) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_1, title);
        contentValues.put(COL_2, status);
        db.insert(TABLE_NAME, null, contentValues);
        return true;
    }

    public Cursor getData(String title) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res = db.rawQuery("select status from " + TABLE_NAME + " where title=" + title + "", null);
        return res;
    }
}

3 个答案:

答案 0 :(得分:0)

经过一点点记录后,事实证明在离开 listView.setOnItemClickListener 功能后,所有元素都会重置为未选中。我建议您尝试通过向所选项目添加tag然后在if语句中添加check for it来解决此问题。默认情况下,标签设置为 null ,因此您可以利用此功能。

使用代码

的工作代码段
if (listView.getChildAt(position).getTag() != null) {
    listView.getChildAt(position).setBackgroundColor(Color.WHITE);
    listView.getChildAt(position).setTag(null);
} else {
    listView.getChildAt(position).setBackgroundColor(Color.GREEN);
    listView.getChildAt(position).setTag("selected");
}

答案 1 :(得分:0)

  

但是第二次点击它不起作用

这是因为每当你点击一个项目时:

listView.getChildAt(position).isSelected()

返回 true

如果要保存状态以便在重新启动应用程序后保持状态。我会将状态保存在数据库中。(例如SQLite)。

Sugar可以真正帮助你。每当状态改变时,您将其保存到数据库中,并根据您在DB中保存的状态更改颜色。

答案 2 :(得分:0)

  1. 设置标签"取消选择"到R.layout.listitem中的textview。这是您视图的默认标记。
  2. 在onClick中,检查单击的视图的标记,并根据单击的状态进行更改。您可以根据标记切换颜色。

       <TextView xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
      android:tag="De-selected"
      android:id="@+id/text"/>
    
    if (listView.getChildAt(position).getTag().equals("selected")) {
                    listView.getChildAt(position).setBackgroundColor(Color.WHITE);
                    listView.getChildAt(position).setTag("De-selected");
                } else {
                    listView.getChildAt(position).setBackgroundColor(Color.GREEN);
                    listView.getChildAt(position).setTag("selected");
                    listView.getChildAt(position).setSelected(true);
                }
    
    1. 要记住列表视图项的状态 - 单击列表中的项时,保存位置。同样,在取消选择时删除保存的位置。 通过这种方式,您将获得列表中所选项目的所有位置列表,您可以将其保存在数据库中,并在重新启动应用程序时从数据库重新加载,并将这些选定位置的标记设置为&#34;选择&# 34;从db加载以显示以前选择的列表项的不同颜色。