【问题标题】:How to delete listview dialog item from contextmenu in Android?如何从 Android 的上下文菜单中删除列表视图对话框项?
【发布时间】:2013-10-30 05:01:52
【问题描述】:

我有一个正在显示列表视图的对话框。长按列表上下文菜单中的项目会弹出。现在在上下文菜单中按删除应该删除列表视图中的相应项目。 这是我到目前为止编写的代码...

public class ViewContacts extends Activity {

   List<String> contacts;
   SharedPreferences prefs;
   SharedPreferences.Editor editor;
   ArrayAdapter<String> adapter;
   Dialog dialog;
   ListView lv;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       // TODO Auto-generated method stub
       super.onCreate(savedInstanceState);
        contacts = new ArrayList<String>();
       dialog = new Dialog(ViewContacts.this);
       dialog.setTitle("My Contacts");
       dialog.setContentView(R.layout.activity_mycontacts);
       dialog.setCancelable(true);

       dialog.show();
        contacts.add("Abc");
        contacts.add("xyx");
        contacts.add("klm");

       lv =(ListView)dialog.findViewById(R.id.lv);
       adapter =new ArrayAdapter<String>(this,R.layout.row,R.id.contacts,contacts);
       lv.setAdapter(adapter);
       registerForContextMenu(lv);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenu.ContextMenuInfo menuInfo) {

        MenuInflater inflater =getMenuInflater();
        inflater.inflate(R.menu.menu_list, menu);

}

@Override
public boolean onContextItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    AdapterContextMenuInfo info =(AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
    case R.id.del_menu:
        contacts.remove(adapter.getItem(info.position));
        adapter.notifyDataSetChanged();
        return true;
    case R.id.can_menu:
       return true;
    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

}

menu_list.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
  <menu xmlns:android="http://schemas.android.com/apk/res/android" >
       <item android:id="@+id/del_menu"
         android:title="Delete">
       </item>
        <item android:id="@+id/can_menu"
         android:title="Cancel">
       </item>


 </menu>

我的代码没有做任何事情。可能是什么问题?对于这种从列表视图中删除项目的方法有什么建议或替代方法吗?

【问题讨论】:

    标签: android listview android-listview contextmenu


    【解决方案1】:

    我通过使用 OnItemlongclicklistener 解决了这个问题。感谢@Dhara Shah 的建议..

    这是我的代码..

    lv.setOnItemLongClickListener(new OnItemLongClickListener() {
    
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int position, long id) {
                // TODO Auto-generated method stub
    
                Intent i = new Intent(ViewContacts.this,Delete_Confirm.class).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        //I am sending position of listitem in putExtra below//     
                i.putExtra("position", position);
                startActivityForResult(i,CONFIRM);
                return true;
    
            }
        });
    

    在这个 Delete_Confirm 类中是包含自定义对话框的 Activity,用于从用户那里获取是否删除它的确认..

    这就是我的 Delete_Confirm.java 代码:

    public class Delete_Confirm extends Activity implements OnClickListener {
    
    Dialog dialog;
    Button del,cancel;
    int pos;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Bundle bundle = getIntent().getExtras();
        pos = bundle.getInt("position");
        Log.d("msg","position is " + pos); 
        dialog = new Dialog(Delete_Confirm.this);
    
        dialog.setTitle("My Contacts");
        dialog.setContentView(R.layout.activity_del);
        del = (Button) dialog.findViewById(R.id.del_con);
        cancel = (Button) dialog.findViewById(R.id.no_del_con);
        del.setOnClickListener(this);
        cancel.setOnClickListener(this);
        dialog.setCancelable(true);
        dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
    
            @Override
            public void onCancel(DialogInterface arg0) {
                // TODO Auto-generated method stub
                dialog.dismiss();
                finish();
            }
        });
        dialog.show();
    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.del_con:
            Intent yes = this.getIntent();
            yes.putExtra("position", pos);
            this.setResult(RESULT_OK,yes);
            finish();
            break;
        case R.id.no_del_con:
            Intent no = this.getIntent();
            this.setResult(RESULT_CANCELED,no);
            finish();
            break;
        default:
            break;
        }
    }
    

    现在在 onActivityResult 中,我从 Delete_Confirm.java 的 setResult() 方法中获得用户的选择。

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
          if(requestCode==CONFIRM){
    
              if(resultCode==RESULT_OK){
                  int posi = data.getIntExtra("position",0);
                      Log.d("msg","positionwa is " + posi);
    
                      Log.d("msg","Do we reach here?");
                      if(posi==0){
                      contacts.remove(posi);
                      adapter.notifyDataSetChanged();
                      }
    
    
                      else if(posi==1){
                          contacts.remove(posi);
                          adapter.notifyDataSetChanged();
    
                          }
    
    
                      else if(posi==2){
                          contacts.remove(posi);
                          adapter.notifyDataSetChanged();
    
                           }
    
    
    
              }
              if(resultCode==RESULT_CANCELED){
                  dialog.dismiss();
                  finish();
              }
          }
    

    如果有人遇到同样的问题,我会发布我的答案..

    【讨论】:

      【解决方案2】:

      长项目点击监听器有位置。

      listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
      
              public boolean onItemLongClick(AdapterView<?> arg0, View v,
                      int index, long arg3) {
                  // TODO Auto-generated method stub
                  // store the position of the item that has to be deleted 
                  return true;
              }
      }); 
      

      当按下或点击上下文菜单中的删除时,由于您有位置,在这种情况下,从列表中删除该项目,如

      list.remove(position);
      

      然后再次致电notifyDatasetChanged()

      【讨论】:

      • 好的会试一试.. 但是为什么 info.position 在我的情况下不起作用?
      • 我不知道为什么,我可能需要尝试一个例子然后告诉你:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多