【问题标题】:how to use context menu to remove item from listview in listactivity如何使用上下文菜单从列表活动中的列表视图中删除项目
【发布时间】:2013-12-21 21:02:36
【问题描述】:

我有一个简单的应用程序,当我单击选项菜单上的添加按钮时,它旨在将项目添加到列表视图中,然后当我长按添加到列表视图中的一个项目时,然后选择重命名或删除并重命名或删除列表视图中的该项目。我可以将它硬连接到列表视图中的一个项目,但我无法弄清楚如何在上下文菜单出现之前获取选择了哪个项目,然后重命名或删除该选定的项目。

public class MainActivity_v3 extends ListActivity {

private int optionLastClickedId = -1;
private int optionClickedId = -1;
private boolean bSortByNum = true;

ArrayList<String> listItems=new ArrayList<String>();

ArrayAdapter<String> adapter;

AdapterContextMenuInfo info;

int internalPosition;

int clickCounter=0;

protected void onListItemClick(ListView l, View v, int position, long id){
    Toast toast = Toast.makeText(null, "you clicked " + position, 
Toast.LENGTH_LONG);
    toast.show();

}

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
    super.onCreateContextMenu(menu, v, menuInfo);

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) 
menuInfo;
    internalPosition = info.position; 

    final MenuInflater inflater = getMenuInflater(); // why is this final
    if(v == getListView()){
        inflater.inflate(R.menu.list_menu_v3, menu);
    }else {
    inflater.inflate(R.menu.main_menu_v3, menu);
    }
}

public boolean onContextItemSelected(MenuItem item){

    if(item.getMenuInfo() != null && item.getMenuInfo() instanceof 
AdapterContextMenuInfo){
        info = (AdapterContextMenuInfo) item.getMenuInfo();

    }

    switch(item.getItemId()){
    case R.id.mi_delete:
        this.removeItems(internalPosition);

        break;
    case R.id.mi_rename:
        this.renameItems(internalPosition, "test1");

        break;
    case R.id.mi_cancel:
        break;
    }

    adapter.notifyDataSetInvalidated(); // test - remove later

    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {

    int itemID = item.getItemId();

    switch(itemID){
    // switch(item.getItemId()){

            case R.id.add:
                this.addItems(getListView());
                break;

            case R.id.sort:
                Toast.makeText(this, "Sort", 
Toast.LENGTH_LONG).show();
                //adapter.sort();

    }

    return super.onOptionsItemSelected(item);

}

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu_v3, menu);
    return true;
}

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_main_v3);

    View textView = findViewById(R.id.text);
    registerForContextMenu(textView);
    registerForContextMenu(getListView());

    adapter=new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1,
        listItems);
    setListAdapter(adapter);


} // end - 0nCreate --------------------------------------

public void addItems(View v) {
    listItems.add("Clicked : "+clickCounter++);
    adapter.notifyDataSetChanged();
}

public void removeItems(int selectedItem){
    listItems.remove(selectedItem);
    //listItems.remove(v);
    adapter.notifyDataSetChanged();
}

public void renameItems(int index, String object){
    //listItems.set(v., object);
    listItems.set(index, object);
    adapter.notifyDataSetChanged();
}

public boolean onPrepareOptionsMenu(Menu menu){

    MenuItem item = menu.findItem(optionLastClickedId);

    if(item != null){
        item.setEnabled(true);
    }
    item = menu.findItem(optionClickedId);
    if(item != null){
        item.setEnabled(false);
    }
    optionLastClickedId = optionClickedId;

    return super.onPrepareOptionsMenu(menu);
}

}

【问题讨论】:

    标签: listview contextmenu listactivity


    【解决方案1】:

    只需从 ListView 的 Adapter 中删除数据对象。可以从 internalPosition 中找到要删除的项目。查看下面的代码,了解如何找到 internalPosition。

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
            final int internalPosition = info.position; 
       }
    

    【讨论】:

    • 谢谢。我会试试看。
    • 嗨。我尝试按照您的建议进行操作,但我必须遗漏一些东西,因为当我单击删除时没有任何反应,并且当我单击重命名时应用程序崩溃。我更新了源代码以包含建议。我唯一不同的是在类的顶部定义变量而不是使用 final。
    • 那行得通。但是由于某种原因,我不得不将这部分的代码移动到方法中 switch 语句的 case 中。我猜这是由于 Java 中的范围问题。
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多