【问题标题】:How to use context menu in listview for android when creating sqlite database and make operation for sqlite?创建sqlite数据库并为sqlite进行操作时如何在android的listview中使用上下文菜单?
【发布时间】:2013-01-02 03:21:48
【问题描述】:

我在列表视图上创建了数据库和 Y 显示记录,如果我长按列表视图记录,则上下文菜单打开。在上下文菜单中,有两个操作,一是显示操作,二是删除操作。如果我选择显示,则在下一个活动中显示完整记录。

ListActivity.java

public class ListActivity extends Activity {
    ListView lv;
    ArrayList<String> items = new ArrayList<String>();
    ArrayList<String> items_id = new ArrayList<String>();
    dbhelper dh;
    SQLiteDatabase db;
    int index_id;
    Button btn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        Button btn;
        btn = (Button)findViewById(R.id.newProjectlist);
        btn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub


                    Intent intent= new Intent(ListActivity.this,NewProject.class);
                startActivity(intent);
            }
        });  
        lv = (ListView)findViewById(R.id.projectListView);
        setUpList();
        dh = new dbhelper(this);
        Cursor c = getAllData();
        showAllData(c);  
        registerForContextMenu(lv);      
    }

  @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);

        if(v.getId() == R.id.projectList){
            menu.setHeaderIcon(R.drawable.ic_launcher);
            menu.setHeaderTitle("Record List");
            menu.add(0,1,menu.NONE,"Delete Record");
            menu.add(0,2,menu.NONE,"Show Record");
        }
    }

    @Override
public boolean onContextItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
        int itemId = item.getItemId();
        if(itemId == 1)
        {
            AdapterView.AdapterContextMenuInfo menuinfo;
            menuinfo = (AdapterContextMenuInfo) item.getMenuInfo();
            index_id = menuinfo.position;
            deleteUserData(index_id);
        }
        if(itemId == 2){
            AdapterView.AdapterContextMenuInfo menuinfo;
            menuinfo = (AdapterContextMenuInfo) item.getMenuInfo();
            index_id = menuinfo.position;
            editUserData(index_id);
        }
    return super.onContextItemSelected(item);
}

    private void editUserData(int indexid) {
        // TODO Auto-generated method stub
        String user_id = items_id.get(indexid);
        Intent intEdit = new Intent(ListActivity.this, MainActivity.class);
        intEdit.putExtra("EditID", user_id);
        startActivityForResult(intEdit, 1);
    }

    private void deleteUserData(int indexid) {
        // TODO Auto-generated method stub
        String user_id = items_id.get(indexid);
        //Toast.makeText(getApplicationContext(), "id " + user_id, 1).show();
        db = dh.getWritableDatabase();
        db.delete("timer","_ID" + "=" + user_id, null);
        finish();
//      Toast.makeText(getApplicationContext(), "Record deleted successfully", 1).show();
    }

    private void showAllData(Cursor c) {
        // TODO Auto-generated method stub
        while(c.moveToNext())
        {
            int id = c.getInt(0);
            String name = c.getString(1);
            String timerpoint1 = c.getString(2);
            String timerpoint2 = c.getString(3);
            String timerpoint3 = c.getString(4);
            String servicetime1 = c.getString(5);
            String servicetime2 = c.getString(6);
            items.add("" + name);
            items_id.add(""+id);
        }
        setUpList();
    }

    private Cursor getAllData() {
        // TODO Auto-generated method stub
        db = dh.getReadableDatabase();
        //String sortorder = dh.Name + "DESC";
    //  String query ="SELECT DISTINCT name FROM timer";
    //  Cursor c = db.rawQuery(query, null);
    //   if (c != null) {
    //            c.moveToFirst();
    //        }
        String[] cols = new String[] {dh.Name, "name"};
        Cursor c = db.query(true, "timer",null,null,null,null,"ASC",null, null);   
        //Cursor cur = db.query(Distinct,"timer", null, null, null, null, null, null, null);
        startManagingCursor(c);
        return c;   
        }
    private void setUpList() {
        // TODO Auto-generated method stub
        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items));
    }   

    }

如果我选择删除然后删除记录。使用上下文菜单我们可以实现这个目标。我有该应用程序的一些代码,但代码无法正常工作。所以,请帮忙。

【问题讨论】:

  • 它为什么不能正常工作?应用程序崩溃了吗?没有明显的变化?

标签: android sqlite contextmenu


【解决方案1】:

请提供有关您所看到内容的更多详细信息,但是查看您的代码,我猜测列表视图可能保持相同的状态,并且在您删除后不会刷新。如果是这种情况,您可能需要re-query 您的光标。此方法已弃用,但您应该能够使用它来验证是否是问题所在,或者只需获取光标的新实例并将其加载为 docs 建议。

【讨论】:

    【解决方案2】:

    有几件事:首先你的删除方法是关闭的。您获得了 id 字段,然后找到了要删除的相应字符串,但您仍然希望使用此字符串在 _id 字段中删除。这种方式不会删除任何内容,因为这些字符串不会在该列中。更好的是简单地删除原来的long id

    private void deleteUserData(long indexid) {
        db.delete("timer","_ID" + "=" + indexid, null);
        finish();
    }
    

    就是这样。现在另一个问题实际上是检索要删除的 id。你正在使用

    index_id = menuinfo.position;
    

    但这不会在数据库中为您提供任何 id。这只是为您提供ListView 适配器上的位置。你需要使用这个位置,得到这个_id。由于您使用的是ArrayAdapter,这意味着从用于填充此列表视图的相应集合中获取_id

    所以根据你的人口方法。

    private void showAllData(Cursor c) {
        while(c.moveToNext())
        {
            int id = c.getInt(0);
            String name = c.getString(1);
            .....
            items.add("" + name);
            items_id.add(""+id);
        }
        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items));
    }
    

    现在应该很明显,您需要做什么才能根据现在的位置获得这个_id

        @Override
        public boolean onContextItemSelected(MenuItem item) {
            int itemId = item.getItemId();
            if(itemId == 1)
            {
                AdapterView.AdapterContextMenuInfo menuinfo = (AdapterContextMenuInfo) item.getMenuInfo();
                int position = menuinfo.position;
                String id_string = items_id.get(position);
                long id = Long.valueOf(id_string);
                deleteUserData(id);
    //          then you probably want it off the corresponding collection too
                items_id.remove(position);
            }
            .....
    

    【讨论】:

    • 我尽我所能用你的代码来解决,但我得说它不是最优雅的实现。对于这样的任务,您可能需要查看CursorAdapters,因为他们可以直接向适配器提供_id。此外,它只需要使用数据库作为唯一的数据集。
    • 但是当我长按列表视图记录时,上下文菜单不显示。请给我建议上下文菜单的工作
    • 请给我上下文菜单的代码,用于在 android 中检索(删除和显示)数据
    • 我的问题是,在您将代码修改为我所写的内容之前,是否正在显示上下文菜单。尝试删除代码括号if(v.getId() == R.id.projectList){
    • menu.setHeaderIcon(R.drawable.ic_launcher); menu.setHeaderTitle("记录列表"); menu.add(0,1,menu.NONE,"删除记录"); menu.add(0,2,menu.NONE,"显示记录");
    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2013-04-27
    • 2016-11-18
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多