【发布时间】:2012-12-01 20:50:39
【问题描述】:
先生,您能帮我了解如何通过单击相应的自定义列表视图项来显示 sqlite 的详细信息吗?我的列表视图包含三列,所以我希望它显示在另一个活动中,我可以在其中编辑信息和删除等。起初,我想使用行 ID,但放弃了这个想法,因为如果我试图删除一个项目在数据库中,我无法使用已删除的行 ID。所以listview和数据库的行ID不匹配。例如。数据库 1,2,3 中的行 ID ...如果我删除了第 2 行,如果我添加另一个项目,它只会添加到第 4 行...就像第 1,3,4 行一样。提前感谢您的帮助
public class CustomListView extends Activity {
final Context context = this;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GroupDb info = new GroupDb(this);
info.open();
ArrayList<Contact> searchResults = info.getView();
final ListView lv = (ListView) findViewById(R.id.srListView);
lv.setAdapter(new MyCustomBaseAdapter(this, searchResults));
info.close();
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
}
这是我的自定义基础适配器
public class MyCustomBaseAdapter extends BaseAdapter {
private static ArrayList<Contact> searchArrayList;
private LayoutInflater mInflater;
public MyCustomBaseAdapter(Context context, ArrayList<Contact> results) {
searchArrayList = results;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.custom_row_view, null);
holder = new ViewHolder();
holder.txtName = (TextView) convertView.findViewById(R.id.name);
holder.txtPhone = (TextView) convertView.findViewById(R.id.phone);
holder.status = (TextView) convertView.findViewById(R.id.status);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtName.setText(searchArrayList.get(position).getName());
holder.txtPhone.setText(searchArrayList.get(position).getPhoneNumber());
holder.status.setText(searchArrayList.get(position).getStatus());
return convertView;
}
static class ViewHolder {
TextView txtName;
TextView txtPhone;
TextView status;
}
}
这是我在自定义列表视图中使用 GroupDb.class 中的三个字段/列保存数据库值的方式
public ArrayList<Contact> getView()
{
// TODO Auto-generated method stub
ArrayList<Contact> results = new ArrayList<Contact>();
String[] columns = new String[]{KEY_NAME, KEY_NUMBER, KEY_STATUS};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String sName = "";
String nName = "";
String status = "";
int iName = c.getColumnIndex(KEY_NAME);
int iNumber = c.getColumnIndex(KEY_NUMBER);
int iStatus = c.getColumnIndex(KEY_STATUS);
Contact contact;
for(c.moveToFirst(); ! c.isAfterLast(); c.moveToNext())
{
contact = new Contact();
sName += c.getString(iName);
nName += c.getString(iNumber);
status += c.getString(iStatus);
contact.setName(sName);
contact.setPhoneNumber(nName);
contact.setStatus(status);
results.add(contact);
sName = "";
nName = "";
status = "";
}
return results;
}
【问题讨论】:
-
使用
id是最实用的方法,我建议你想办法让它发挥作用。如果您使用extend CursorAdapter而不是BaseAdapter,那么您可以在删除或更改某些内容时简单地刷新列表视图。如果您保持原样(我不建议这样做),您可以简单地删除或更改您的arrayLists 中的某些内容,然后刷新listView。除非,您不希望 listView 反映数据库中的更改... -
此外,如果您不希望您的行 ID 排序错误,我不明白您希望如何进行任何删除完全。如果这是一笔大买卖,您可以制定一种方法来遍历您的数据库并在完成后设置行 ID 正确。但我不明白这一点,它的唯一用途是成为每一行的唯一标识符。
-
谢谢,我会试试 cursoradapter。但是,它仍然没有解决我的问题。我仍然不知道如何使用 id。我正在研究 3 天,仍然没有解决方案。
-
如果你使用
CursorAdapter,那么在OnItemClick上的long arg3实际上意味着什么。即所选行的id。您可以只查询该行的数据库,然后按照您的意愿进行操作。