gpt4 book ai didi

android - 我如何在ListView中使用复选框并在android的Sqlite数据库中插入值

转载 作者:行者123 更新时间:2023-11-29 18:05:09 24 4
gpt4 key购买 nike

我正在开发一个将手机联系人显示为ListView(使用过的Cursoradapter)的android应用。现在我想向listView添加复选框,我的问题是如何根据是否选中复选框将复选框数据插入数据库?

在数据库类中,我有一个函数,用于向数据库中添加名称和数字,

      createntry(String number,String name) // in my database class


我应该在CursorAdapter类中调用此函数吗?

最近,我发现我应该使用getView函数,但是不幸的是我对getView一无所知,我的问题是

1-我应该在My CursorAdapter中使用此功能吗?

2-如何实现此功能?

我的CursorAdapterClass

     public class ContactCursorAdapterCT extends CursorAdapter {

public ContactCursorAdapterCT(Context context, Cursor c) {
super(context, c);
}
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView name = (TextView)view.findViewById(R.id.contactlistTV1);
name.setText(cursor.getString
(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
TextView phone = (TextView)view.findViewById(R.id.contactlistTV2);
phone.setText(cursor.getString
(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.lvct, parent, false);
bindView(v, context, cursor);
return v;

}

public View getView(final int pos, View inView, ViewGroup parent) { //getView

}


我的活动课

   public class Contacts extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.contacts);

Cursor cursor = getContentResolver().query
(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,null, null);
startManagingCursor(cursor);
ContactCursorAdapterCT adapter= new ContactCursorAdapterCT
(Contacts.this, cursor);
ListView contactLV = (ListView) findViewById(R.id.listviewblcontactsDB);
contactLV.setAdapter(adapter);


我的数据库类

  public long creatEntry(String inputnumber , String name) { // for add data   

// TODO Auto-generated method stub
ContentValues cv= new ContentValues();
cv.put(KEY_NUMBER, inputnumber);
cv.put(N_NAME, name);
Log.v(inputnumber, "adding to Database");
return ourdatabase.insert(DATABASE_TABLE, null, cv);
}

最佳答案

首先,不,您不需要getViewbindViewnewView结合完全可以替代它,有些人可能会说更好。此外,您无需在新视图中调用bindview。这是应该进行的重组。

    @Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = inflater.inflate(R.layout.lvct, parent, false);
return v;
}


这完全是您的要求,但是不,我不认为您应该将 createEntry方法插入适配器,至少在其方法中。事实是,适配器的方法是针对列表视图的每一行调用的,因此您可能会发生很多多余的事情,而且我个人觉得以增量方式插入数据库是浪费的。相反,我认为您别无选择,只能一次完成所有操作,因为如果有人取消选择复选框该怎么办?您删除条目?不仅浪费资源,而且跟踪光标位置或 _id也会很麻烦,而且每次添加内容时都需要重新查询。您应该做的是维护需要添加到数据库的列表,并在完成后将其批量插入。

首先,您需要创建一个对象,其中包含要插入的数据。对象是最干净的方法,因为您需要保存多条信息。在这里,这非常简单,您可以将所需的值插入到构造函数中,然后使用getter方法进行检索。

public class ContactObject {

private String name;
private String phone;

public ContactObject(String name, String phone) {
super();
this.name = name;
this.phone = phone;
}

public String getName() {
return name;
}

public String getPhone() {
return phone;
}
}


现在,您需要一个对象来检查这些对象。我知道这很奇怪,但是如果可以识别它们并且可以进行迭代,并且通常将它们组合在一起以进行引用,则会更加方便。我认为这种任务需要 HashMap。在构造函数中创建它。

contactMap = new HashMap<Integer, ContactObject>(c.getCount());


现在是时候开始狂欢了。为复选框添加方法,以从 HashMap添加和删除内容。

cbInsert.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (cbInsert.isChecked()) {
contactMap.put(cursor.getPosition(), new ContactObject(str_name, str_phone));
} else {
contactMap.remove(cursor.getPosition());
}
}
});


我们在 HashMap中将光标位置用作ID的对象的ID。并且当我们的复选框未选中并且我们想要删除放入的对象时,我们可以仅引用我们使用的那个标识符。谨慎一些的人可能要根据自己的判断,先检查一下该位置是否有东西。现在我们快完成了。我们如何将HashMap转换为数据库中的条目?您必须访问一个数据库对象,进行遍历,然后逐个访问您的对象。现在的问题是在哪里。您可以在适配器中正确执行此操作,但是我通常会在活动中执行类似的操作,因为在我的情况下,我通常已经为该活动为其他任务创建了一个数据库,并且我不希望创建比我更多的对象推到。因此,我们可以做的就是在我们的HashMap适配器中使用getter方法完成操作:

    public HashMap<Integer, ContactObject> getContactMap() {
return contactMap;
}


现在,我想您要在离开应用程序时执行类似的操作,所以就到这里了。

@Override
protected void onDestroy() {
super.onDestroy();
HashMap<Integer, ContactObject> contactMap = adapter.getContactMap();
DatabaseHelper db = new DatabaseHelper(this);
// iterate through hashmap
for (Map.Entry<Integer, ContactObject> entry : contactMap.entrySet()) {
Integer key = entry.getKey();
ContactObject value = entry.getValue();

db.creatEntry(key, value.getPhone(), value.getName());
}
db.close();
}


现在情况看起来有点怪异,我使用您的输入方法怎么办?

public long creatEntry(Integer id, String inputnumber, String name) { // for add data
long lng;
String strId = id.toString();
String[] selectionArgs = {strId};
Cursor cursor = ourdatabase.query(DATABASE_TABLE, null, "other_id = ?", selectionArgs, null, null, null);
if (cursor.moveToFirst()) {
// it exists, i'd assume that you might not want anything else done here
lng = -1;
} else {
// it doesn't exist
ContentValues cv= new ContentValues();
cv.put(KEY_NUMBER, inputnumber);
cv.put(N_NAME, name);
cv.put(KEY_OTHERID, strId);
Log.v(inputnumber, "adding to Database");
lng = ourdatabase.insert(DATABASE_TABLE, null, cv);
}
// cursor.close();
return lng;
}


如您所见,我对其进行了修改,以便它也可以使用id。我认为您遇到的一个问题是数据库中会重复。我以为您可以通过在另一个字段中修改ID来管理它,该ID指的是从 HashMap传入的ID。我发现,每次插入时,都首先要检查该先前的ID是否存在,然后再决定要做什么。这不是一个完美的解决方案,但我只是想提醒您该问题是可能的,并给出管理该问题的可能提示。通常,如果您只想插入几行,则insert方法应该很好,但是如果要插入很多东西,则可能需要研究批量事务以提高性能。

还有一件事,不能期望列表视图中的复选框保持其状态不变,就像您通常期望的那样。您必须明确规定复选框在每个位置处的状态。如果您的 HashMap有一些用其对应键填充的东西,我就将其设为对应。这是完整的适配器方法,希望可以使它更清晰:

public class ContactCursorAdapterCT extends CursorAdapter {

private LayoutInflater inflater;
private HashMap<Integer, ContactObject> contactMap;

public ContactCursorAdapterCT(Context context, Cursor c) {
super(context, c);
inflater = LayoutInflater.from(context);
contactMap = new HashMap<Integer, ContactObject>(c.getCount());
// i used c.getCount() as a capacity limit for this.
// if you opened made this multiple times, it might get over inflated and
// slow things down.
}

@Override
public void bindView(View view, Context context, final Cursor cursor) {
TextView name = (TextView)view.findViewById(R.id.contactlistTV1);
TextView phone = (TextView)view.findViewById(R.id.contactlistTV2);
final CheckBox cbInsert = (CheckBox) view.findViewById(R.id.contactlistCB1);

String str_name = cursor.getString
(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String str_phone = cursor.getString
(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

name.setText(str_name);
phone.setText(str_phone);

boolean isFilled = contactMap.containsKey(cursor.getPosition());
cbInsert.setChecked(isFilled);

// insert, remove objects to hashmap
cbInsert.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (cbInsert.isChecked()) {
contactMap.put(cursor.getPosition(), new ContactObject(str_name, str_phone));
} else {
contactMap.remove(cursor.getPosition());
}
}
});

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = inflater.inflate(R.layout.lvct, parent, false);
return v;
}

public HashMap<Integer, ContactObject> getContactMap() {
return contactMap;
}
}

关于android - 我如何在ListView中使用复选框并在android的Sqlite数据库中插入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13746905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com