Java ListView复选框

Java ListView复选框,java,android,checkbox,android-sqlite,listviewitem,Java,Android,Checkbox,Android Sqlite,Listviewitem,我正在创建一个用于交流学习的Android应用程序 我制作了一个单词列表,它包含一个复选框和文本视图,文本视图显示单词,使用复选框确定我在列表视图中选择的项目 我使用“提交”按钮将单词的id存储在SQLite中。当我再次关闭并打开“活动”时,我希望看到复选框,但此代码仅保存到我的数据库中,而在我再次打开“活动”时不显示所选项目 这是活动 public class PerkembanganLevel1 extends AppCompatActivity{ private ContentD

我正在创建一个用于交流学习的Android应用程序

我制作了一个单词列表,它包含一个复选框和文本视图,文本视图显示单词,使用复选框确定我在列表视图中选择的项目

我使用“提交”按钮将单词的id存储在SQLite中。当我再次关闭并打开“活动”时,我希望看到复选框,但此代码仅保存到我的数据库中,而在我再次打开“活动”时不显示所选项目

这是活动

public class PerkembanganLevel1 extends AppCompatActivity{

    private ContentDao contentDao;
    private ChildDao childDao;
    private Child anakYangDipilih;

    public Global global;

    private AssessmentDao assessmentDao;
    private Assessment assessment;

    String idYangSudahBisa;

    PerkembanganAdapter perkembanganAdapter = null;

    ContentHistory contentHistory;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_perkembangan_level1);

        contentDao = new ContentDao(this);
        contentDao.open();

        childDao = new ChildDao(this);
        childDao.open();

        anakYangDipilih = ((Global) getApplicationContext()).getChild();

        idYangSudahBisa = anakYangDipilih.getLevel1();

        ArrayList<ContentHistory> listKataLevel1 = (ArrayList<ContentHistory>) contentDao.getAllWordByLevel(1);

        perkembanganAdapter = new PerkembanganAdapter(this, R.layout.list_perkembangan, listKataLevel1);

        ListView level1 =  findViewById(R.id.LVPlv1);
        level1.setAdapter(perkembanganAdapter);
        Log.i("listKataLevel1 ", String.valueOf(listKataLevel1));
        level1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                contentHistory = (ContentHistory) parent.getItemAtPosition(position);

            }
        });
        findViewById(R.id.BtnPLv1Submit).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                idYangSudahBisa = perkembanganAdapter.idYangSudahBisa();

                anakYangDipilih.getId();
                anakYangDipilih.setLevel1(idYangSudahBisa);
                anakYangDipilih.setCreatedBy(((Global) getApplicationContext()).getTherapist().getId());
                anakYangDipilih.setUpdatedBy(((Global) getApplicationContext()).getTherapist().getId());
                anakYangDipilih.setCreatedDate(new Date());
                anakYangDipilih.setUpdatedDate(new Date());
                anakYangDipilih = childDao.saveChild(anakYangDipilih);

                Toast.makeText(PerkembanganLevel1.this, "Perkembangan Anak pada level 1 Berhasil Diperbarui", Toast.LENGTH_SHORT).show();
            }
        });


    }

}
公共类PerkeBanganLevel 1扩展了AppCompative活动{
私有ContentDao ContentDao;
私生子道;
独生子女anakYangDipilih;
全球公共服务;
私人评估;
私人评估;
弦伊丹苏达比萨;
perkenbanganadapter perkenbanganadapter=null;
内容历史;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_Perkenbangan_level1);
contentDao=新contentDao(this);
contentDao.open();
childDao=新的childDao(本);
childDao.open();
anakYangDipilih=((全局)getApplicationContext()).getChild();
idYangSudahBisa=anakYangDipilih.getLevel1();
ArrayList listKataLevel1=(ArrayList)contentDao.getAllWordByLevel(1);
Perkenbanganadapter=新的Perkenbanganadapter(此,R.layout.list_Perkenbangan,listKataLevel1);
ListView级别1=findViewById(R.id.LVPlv1);
级别1.设置适配器(Perkenbanganadapter);
Log.i(“listKataLevel1”,String.valueOf(listKataLevel1));
level1.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
contentHistory=(contentHistory)parent.getItemAtPosition(position);
}
});
findviewbyd(R.id.BtnPLv1Submit).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
idYangSudahBisa=perkenbanganadapter.idYangSudahBisa();
anakYangDipilih.getId();
anakYangDipilih.setLevel1(idYangSudahBisa);
anakYangDipilih.setCreatedBy(((全局)getApplicationContext()).getTherapeist().getId());
anakYangDipilih.setUpdatedBy(((全局)getApplicationContext()).getTherapist().getId());
anakYangDipilih.setCreatedDate(新日期());
anakYangDipilih.setUpdatedDate(新日期());
anakYangDipilih=childDao.saveChild(anakYangDipilih);
Toast.makeText(perkenbanganlevel1.this,“perkenbangan Anak pada level 1 Berhasil Diperbarui”,Toast.LENGTH_SHORT.show();
}
});
}
}
这是适配器


public class PerkembanganAdapter extends ArrayAdapter<ContentHistory> {


    String idYangSudahBisa;

    private ChildDao childDao;
    private Child anakYangDipilih;

    public ArrayList<ContentHistory> contentHistories;

    public PerkembanganAdapter(Context context, int id, ArrayList<ContentHistory> contentHistories){
        super(context, id, contentHistories);
        this.contentHistories = new ArrayList<>();
        this.contentHistories.addAll(contentHistories);



        childDao = new ChildDao(getContext());
        childDao.open();

        anakYangDipilih = ((Global) context.getApplicationContext()).getChild();
        this.idYangSudahBisa = anakYangDipilih.getLevel1();

    }

    private class ViewHolder{
        TextView title;
        CheckBox checkBoxes;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        ViewHolder viewHolder = null;
        if (convertView == null){
            LayoutInflater layoutInflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_perkembangan, null);

            viewHolder = new ViewHolder();
            viewHolder.title = convertView.findViewById(R.id.TVListPerkembangan);
            viewHolder.checkBoxes = convertView.findViewById(R.id.CBListPerkembangan);

            convertView.setTag(viewHolder);

            viewHolder.checkBoxes.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox checkBox = (CheckBox) v;
                    ContentHistory contentHistory = (ContentHistory) checkBox.getTag();
                    contentHistory.setSelected(checkBox.isChecked());
                    if (checkBox.isChecked()){
                        idYangSudahBisa = idYangSudahBisa + ","+contentHistory.getId();
                        //Toast.makeText(getContext(), ""+idYangSudahBisa,Toast.LENGTH_SHORT).show();
                    } else {
                        idYangSudahBisa = idYangSudahBisa.replace(","+contentHistory.getId(), "");
                        //Toast.makeText(getContext(), ""+idYangSudahBisa,Toast.LENGTH_SHORT).show();
                    }

                }
            });



        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }


        ContentHistory contentHistory = contentHistories.get(position);
        viewHolder.title.setText(contentHistory.getTitle());

        viewHolder.checkBoxes.setChecked(contentHistory.getSelected());
        viewHolder.checkBoxes.setTag(contentHistory);


        return convertView;

    }

    public String idYangSudahBisa(){

        return this.idYangSudahBisa;
    }

}
...

公共类PerkeBanganadapter扩展了ArrayAdapter{
弦伊丹苏达比萨;
私生子道;
独生子女anakYangDipilih;
公共ArrayList内容历史;
公共PerkeBanganadapter(上下文上下文、int-id、ArrayList内容历史记录){
super(上下文、id、contentHistories);
this.contentHistories=新的ArrayList();
this.contentHistories.addAll(contentHistories);
childDao=新的childDao(getContext());
childDao.open();
anakYangDipilih=((全局)context.getApplicationContext()).getChild();
this.idYangSudahBisa=anakYangDipilih.getLevel1();
}
私有类视窗持有者{
文本视图标题;
复选框;
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
ViewHolder ViewHolder=null;
if(convertView==null){
LayoutInflater LayoutInflater=(LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
convertView=LayoutFlater.充气(R.layout.list_Perkenbangan,空);
viewHolder=新的viewHolder();
viewHolder.title=convertView.findViewById(R.id.tvlistperkenbangan);
viewHolder.checkbox=convertView.findViewById(R.id.cblistperkenbangan);
convertView.setTag(viewHolder);
viewHolder.checkbox.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
复选框=(复选框)v;
ContentHistory ContentHistory=(ContentHistory)checkBox.getTag();
contentHistory.setSelected(checkBox.isChecked());
如果(checkBox.isChecked()){
idYangSudahBisa=idYangSudahBisa+“,”+contentHistory.getId();
//Toast.makeText(getContext(),“”+idiangsudahbisa,Toast.LENGTH_SHORT).show();
}否则{
idYangSudahBisa=idYangSudahBisa.replace(“,”+contentHistory.getId(),”);
//Toast.makeText(getContext(),“”+idiangsudahbisa,Toast.LENGTH_SHORT).show();
}
}
});
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
ContentHistory ContentHistory=contentHistories.get(位置);
viewHolder.title.setText(contentHistory.getTitle());
viewHolder.checkbox.setChecked(contentHistory.getSelected());
viewHolder.checkbox.setTag(contentHistory);
返回视图;
}
公共字符串idYangSudahBisa(){
归还这个。idYangSudahBisa;
}
}
...

不需要提交按钮,因为单击复选框时,您可以实时更新(toggele)数据库

重要的方面是在ContentDao中添加了一个方法,例如:-

public void toggleCheckedById(long id) {

    db.execSQL(
            "UPDATE " + TABLE_NAME +
                    " SET " + COLUMN_CHECKED + " = NOT  " + COLUMN_CHECKED +
                    " WHERE " + COLUMN_ID + "=?",
            new String[]{String.valueOf(id)}
    );
}
  • T
    public class DatabaseHelper extends SQLiteOpenHelper {
    
        public static final String DBNAME = "perkembangan.db";
        public static final int DBVERSION = 1;
    
        private static DatabaseHelper sInstance;
    
        private DatabaseHelper(Context context) {
            super(context, DBNAME, null, DBVERSION);
        }
    
        public static synchronized DatabaseHelper getInstance(Context context) {
            if (sInstance == null) {
                sInstance = new DatabaseHelper(context);
            }
            return sInstance;
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            String createContentSQL = "CREATE TABLE IF NOT EXISTS " + ContentDao.TABLE_NAME +
            "(" +
                    ContentDao.COLUMN_ID + " INTEGER PRIMARY KEY, " +
                    ContentDao.COLUMN_NAME + " TEXT, " +
                    ContentDao.COLUMN_CHECKED + " INTEGER DEFAULT 0" +
                    ")";
            db.execSQL(createContentSQL);
            /* ADD SOME TESTING DATA WHEN THE DATABASE IS CREATED */
            ContentValues cv = new ContentValues();
            for (int i=0; i < 3; i++) {
                cv.clear();
                cv.put(ContentDao.COLUMN_NAME,"Name" + String.valueOf(i));
                db.insert(ContentDao.TABLE_NAME,null,cv);
            }
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public static String qualifyColumnName(String table, String column) {
            return table + "." + column;
        }
    }
    
    public class ContentDao {
    
        private static DatabaseHelper sInstance;
        private static SQLiteDatabase db;
    
        public static final String TABLE_NAME = "content";
        public static final String COLUMN_ID = BaseColumns._ID;
        public static final String QUALIFIEDCOLUMN_ID = DatabaseHelper.qualifyColumnName(TABLE_NAME,COLUMN_ID);
        public static final String COLUMN_NAME = "name";
        public static final String COLUMN_CHECKED = "checked";
    
    
    
        public ContentDao(Context context) {
            db =(sInstance = DatabaseHelper.getInstance(context)).getWritableDatabase();
        }
    
        public void toggleCheckedById(long id) {
    
            db.execSQL(
                    "UPDATE " + TABLE_NAME +
                            " SET " + COLUMN_CHECKED + " = NOT  " + COLUMN_CHECKED +
                            " WHERE " + COLUMN_ID + "=?",
                    new String[]{String.valueOf(id)}
            );
        }
    
        public SQLiteDatabase getDb() {
            return db;
        }
    
        public int updateCheckedById(ContentHistory ch) {
            ContentValues cv = new ContentValues();
            cv.put(COLUMN_CHECKED,ch.isChecked());
            return db.update(TABLE_NAME,cv,COLUMN_ID + "=?",new String[]{String.valueOf(ch.getId())});
        }
    
        public ArrayList<ContentHistory> getContentHistory() {
            ArrayList<ContentHistory> rv = new ArrayList<>();
            Cursor csr = db.query(TABLE_NAME,null,null,null,null,null,null);
            while (csr.moveToNext()) {
                rv.add(new ContentHistory(csr.getLong(csr.getColumnIndex(COLUMN_ID)),
                        csr.getString(csr.getColumnIndex(COLUMN_NAME)),
                        csr.getInt(csr.getColumnIndex(COLUMN_CHECKED))> 0)
                );
            }
            csr.close();
            return rv;
        }
    
    
    
        public class ContentHistory {
            private long id;
            private String name;
            private boolean checked;
    
            ContentHistory(long id, String name, boolean checked) {
                this.id = id;
                this.name = name;
                this.checked = checked;
            }
    
            public long getId() {
                return id;
            }
    
            public void setId(long id) {
                this.id = id;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public boolean isChecked() {
                return checked;
            }
    
            public void setChecked(boolean checked) {
                this.checked = checked;
            }
        }
    }
    
    public class PerkembanganAdapter extends ArrayAdapter<ContentDao.ContentHistory> {
    
        ContentDao contentDao;
    
    
        public ArrayList<ContentDao.ContentHistory> contentHistories;
    
        public PerkembanganAdapter(Context context, int id, ArrayList<ContentDao.ContentHistory> contentHistories){
            super(context, id, contentHistories);
            contentDao = new ContentDao(context);
            this.contentHistories = new ArrayList<>();
            this.contentHistories.addAll(contentHistories);
            /*
            childDao = new ChildDao(getContext());
            childDao.open();
    
            anakYangDipilih = ((Global) context.getApplicationContext()).getChild();
            this.idYangSudahBisa = anakYangDipilih.getLevel1();
    
            */
    
        }
    
        private class ViewHolder{
            TextView title;
            CheckBox checkBoxes;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            ViewHolder viewHolder;
            if (convertView == null){
                LayoutInflater layoutInflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.list_perkembangan, null);
    
                viewHolder = new ViewHolder();
                viewHolder.title = convertView.findViewById(R.id.TVListPerkembangan);
                viewHolder.checkBoxes = convertView.findViewById(R.id.CBListPerkembangan);
    
                convertView.setTag(viewHolder);
    
                viewHolder.checkBoxes.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        CheckBox checkBox = (CheckBox) v;
                        ContentDao.ContentHistory contentHistory = (ContentDao.ContentHistory) checkBox.getTag();
                        contentHistory.setChecked(checkBox.isChecked());
                        contentDao.toggleCheckedById(contentHistory.getId()); //<<<<< will update (toggle) database in real time
                        /* NOT NEEDED
                        if (checkBox.isChecked()){
                            //idYangSudahBisa = idYangSudahBisa + ","+contentHistory.getId();
                            //Toast.makeText(v.getContext(), ""+idYangSudahBisa,Toast.LENGTH_SHORT).show();
                        } else {
                            //idYangSudahBisa = idYangSudahBisa.replace(","+contentHistory.getId(), "");
                            //Toast.makeText(getContext(), ""+idYangSudahBisa,Toast.LENGTH_SHORT).show();
                        }
                         */
                    }
                });
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
            ContentDao.ContentHistory contentHistory = contentHistories.get(position);
            viewHolder.title.setText(contentHistory.getName());
            viewHolder.checkBoxes.setChecked(contentHistory.isChecked());
            viewHolder.checkBoxes.setTag(contentHistory);
            return convertView;
        }
    }
    
    public class PerkembanganLevel1 extends AppCompatActivity{
    
        private ContentDao contentDao;
        private ListView level1;
        private PerkembanganAdapter perkembanganAdapter;
        private ArrayList<ContentDao.ContentHistory> contentHistory;
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_perkembangan_level1);
            level1 = this.findViewById(R.id.level1);
    
            contentDao = new ContentDao(this);
            manageListView();
    
            /*contentDao.open();
    
            childDao = new ChildDao(this);
            childDao.open();
    
            anakYangDipilih = ((Global) getApplicationContext()).getChild();
    
            idYangSudahBisa = anakYangDipilih.getLevel1();
    
             */
    
            /*
            ArrayList<ContentDao.ContentHistory> listKataLevel1 = (ArrayList<ContentDao.ContentHistory>) contentDao.getAllWordByLevel(1);
    
            perkembanganAdapter = new PerkembanganAdapter(this, R.layout.list_perkembangan, listKataLevel1);
    
            //ListView level1 =  findViewById(R.id.LVPlv1);
            level1.setAdapter(perkembanganAdapter);
            Log.i("listKataLevel1 ", String.valueOf(listKataLevel1));
            level1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    contentHistory = (ContentDao.ContentHistory) parent.getItemAtPosition(position);
    
                }
            });
            findViewById(R.id.BtnPLv1Submit).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    idYangSudahBisa = perkembanganAdapter.idYangSudahBisa();
    
                    anakYangDipilih.getId();
                    anakYangDipilih.setLevel1(idYangSudahBisa);
                    anakYangDipilih.setCreatedBy(((Global) getApplicationContext()).getTherapist().getId());
                    anakYangDipilih.setUpdatedBy(((Global) getApplicationContext()).getTherapist().getId());
                    anakYangDipilih.setCreatedDate(new Date());
                    anakYangDipilih.setUpdatedDate(new Date());
                    anakYangDipilih = childDao.saveChild(anakYangDipilih);
    
                    Toast.makeText(PerkembanganLevel1.this, "Perkembangan Anak pada level 1 Berhasil Diperbarui", Toast.LENGTH_SHORT).show();
                }
            });
    
             */
    
        }
    
        /* Will refresh the Listview when returning from an invoked activity just in case data has changed */
        @Override
        protected void onResume() {
            super.onResume();
            manageListView();
        }
    
        private void manageListView() {
            contentHistory = contentDao.getContentHistory();
            if (perkembanganAdapter == null) {
                perkembanganAdapter = new PerkembanganAdapter(this,R.layout.list_perkembangan,contentHistory);
                level1.setAdapter(perkembanganAdapter);
    
            } else {
                perkembanganAdapter.notifyDataSetChanged(); // Not really needed if updating when checked
            }
        }
    }