ListView 项目的删除选项始终删除第一个项目,无论单击哪个项目

Posted

技术标签:

【中文标题】ListView 项目的删除选项始终删除第一个项目,无论单击哪个项目【英文标题】:Delete option for ListView items always deletes first item irrespective of which item is clicked 【发布时间】:2016-04-23 07:14:55 【问题描述】:

我是一个新手,我一直在尝试开发一个联系人应用程序以及另一个待办事项应用程序,但这是一个与我的联系人应用程序相关的问题。

插入、查看和删除功能正常工作,但唯一的问题是,无论我选择在 ListView 上删除什么项目,它总是删除最顶部的项目。

这里有一些代码:

主活动:

 protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv=(ListView) findViewById(R.id.listView1);
        im=(ImageButton) findViewById(R.id.add);
        ii=(ImageButton) findViewById(R.id.image);
        list = new ArrayList<HashMap<String,String>>();//memory allocation
        list = db.getvalues();

        ListAdapter ad= new SimpleAdapter(MainActivity.this, list,  R.layout.custom, new String[]"id","name", new int[]R.id.id,R.id.name);
        lv.setAdapter(ad);
    lv.setOnItemLongClickListener(new OnItemLongClickListener() 

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                           int arg2, long arg3) 
                // TODO Auto-generated method stub
                TextView numtask = (TextView) arg1.findViewById(R.id.name);
                phnum = numtask.getText().toString();
                registerForContextMenu(lv);
                return false;
            
        );


        ii.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                Intent i =new Intent(MainActivity.this,Main1Activity.class);
                startActivity(i);
            
        );


    



    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo   menuInfo)
    
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Select The Action");
        menu.add(0, v.getId(), 1, "DELETE");

    

    public boolean onContextItemSelected(MenuItem item)


        String number=phnum;



         if(item.getTitle()=="DELETE")
            TextView id1=(TextView) findViewById(R.id.id);
            db.deleterow(id1.getText().toString());
            Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show();
             list = new ArrayList<HashMap<String,String>>();//memory allocation
             list = db.getvalues();

             ListAdapter ad= new SimpleAdapter(MainActivity.this, list,  R.layout.custom, new String[]"id","name", new int[]R.id.id,R.id.name);
             lv.setAdapter(ad);


    else
        return false;
    
    return true;

我不打算添加从 SQLiteOpenHelper 类扩展而来的 DBConnector 类,因为它包含工作的函数,因为正在填充数据库并且正在删除项目,所以我认为这没有问题。但是,如果您要我添加,如果您要我添加,我将这样做...

这是 custom.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >

<TextView
    android:id="@+id/id"
    android:layout_
    android:layout_
    android:text="Small Text"
    android:textAppearance="?android:attr/textAppearanceSmall" />

<TextView
    android:id="@+id/name"
    android:layout_
    android:layout_
    android:text="Large Text"
    android:textStyle="bold"
    android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

下面是 DBconnector 类的 deleterow 方法:

public void deleterow(String numid) 


        // TODO Auto-generated method stub
        SQLiteDatabase sb = this.getWritableDatabase();
        String sq = "DELETE FROM user WHERE id="+numid+";";
        sb.execSQL(sq);
    

另外,我需要关于如何在 ListView 中显示 ID 编号和名称的建议。

请帮帮我!我指望你们所有人!

【问题讨论】:

您的问题很可能在这里:TextView id1=(TextView) findViewById(R.id.id); 假设这个TextViewListView 行中,在活动上调用findViewById() 可以返回any 具有该 ID 的 TextView 小部件,并且每行有一个。上下文菜单已经被认为已经过时五年了,所以我对它们如何工作的记忆很模糊。但是,有一个获取 position 的秘诀,它触发了您的 onContextItemSelected() 方法中的上下文菜单。 我可以使用其他菜单来轻松找到项目的位置吗? 【参考方案1】:

您在onContextItemSelected(MenuItem item) 方法中调用TextView id1=(TextView) findViewById(R.id.id);,因此它将返回第一个项目的文本,因为您没有给出所选项目的View

您的问题的解决方案是AdapterContextMenuInfo。当为此AdapterView 启动上下文菜单时,它用于获取提供给onCreateContextMenu(ContextMenu, View, ContextMenuInfo) 回调的额外菜单信息。

您可以获取所选项目的View,然后在您的情况下从TextView 获取文本。

这里修改onContextItemSelected(MenuItem item)方法。

public boolean onContextItemSelected(MenuItem item)
        String number=phnum;
        if(item.getTitle()=="DELETE")
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            TextView id1=((TextView) info.targetView).findViewById(R.id.id);
            db.deleterow(id1.getText().toString());
            Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show();
            list = new ArrayList<HashMap<String,String>>();//memory allocation
            list = db.getvalues();
            ListAdapter ad= new SimpleAdapter(MainActivity.this, list,  R.layout.custom, new String[]"id","name", new int[]R.id.id,R.id.name);
            lv.setAdapter(ad);
        else
            return false;
        
    return true;

【讨论】:

以上是关于ListView 项目的删除选项始终删除第一个项目,无论单击哪个项目的主要内容,如果未能解决你的问题,请参考以下文章

WPF ListView在运行时不更新

如何从 ListView 中删除一个项目并在 Firebase 上删除它?

android从listview中删除任何项目删除最后一个元素

单击 ListView 上的删除按钮后删除 ListView 上的项目

如何从android的listview中删除一个项目

C# ListView 删除项目后的项目选择问题