【问题标题】:retrieve data from sqlite to perform edit/delete by clicking an item in custom listview with 3 fields/columns通过单击具有 3 个字段/列的自定义列表视图中的项目,从 sqlite 检索数据以执行编辑/删除
【发布时间】: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。您可以只查询该行的数据库,然后按照您的意愿进行操作。

标签: android listview


【解决方案1】:

您正在维护联系人数组列表。单击列表视图时,从您的数组列表中的给定位置获取位置获取联系人对象。您必须在您的 COntact 类中保存主键列。

【讨论】:

  • 终于,我明白了。我已经从我的联系人类中检索了数据。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多