在Android中使用ListView和contextmenu

35

我正在开发一个android应用程序。我将使用listview,并设置长按listview项时出现上下文菜单。当选择上下文菜单中的操作后,如何获取所选listview项中的项目(例如listview textview中的文本),以便进行处理?以下是一些代码:

protected void onCreate(Bundle savedInstanceState) {
    -------
    lv1 = (ListView) findViewById(R.id.listings);

    registerForContextMenu(lv1);
    lv1.setOnItemClickListener(this);

}

并且onCreateContextMenu:

public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();
    switch (item.getItemId()) {
    case R.id.watch:
        String name = "";
        return true;
    case R.id.buy:
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}

我想从列表项的文本视图中获取文本。我该怎么做?


所以有两个列表视图,一个是主列表,另一个是长按时出现的三个项目。我看不到长按被调用的地方。 - Zypps987
7个回答

37

要从 ListView 中选中的项获取项目,请参考 ContextMenuInfo 对象(请参阅下面实施的最后一个方法)。完整解决方案如下:

1)在 ListActivity 类中注册 ListView 以获得上下文菜单。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    getListView().setAdapter(mAdapter);
    registerForContextMenu(getListView());
}

如果您的列表中有复杂的视图,您可能需要在适配器类中为每个列表视图启用长按。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        RelativeLayout layout = (RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
        itemLayout = layout;
        itemLayout.setLongClickable(true);
    }
    // ...
    return view;
}

2)在ListActivity类中实现onCreateContextMenu()和onContextItemSelected()方法。

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    String title = ((MyItem) mAdapter.getItem(info.position)).getTitle();
    menu.setHeaderTitle(title);

    menu.add(Menu.NONE, MENU_CONTEXT_DELETE_ID, Menu.NONE, DELETE_TEXT);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case MENU_CONTEXT_DELETE_ID:
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        Log.d(TAG, "removing item pos=" + info.position);
        mAdapter.remove(info.position);
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}

6
longclickable = true 设为真可以拯救生命。谢谢。 - Fer

5
问题出在 onItemLongClick() 方法上,不要用它来作为上下文菜单。相反,应该为 LISTVIEW 注册上下文菜单。这里是源代码。
对于 onCreate():
registerForContextMenu(lv);

并且在长按时访问所选项目:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    if (v.getId() == R.id.lv) {
        ListView lv = (ListView) v;
        AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
        YourObject obj = (YourObject) lv.getItemAtPosition(acmi.position);

        menu.add("One");
        menu.add("Two");
        menu.add("Three");
        menu.add(obj.name);
    }
}

2

1) 首先我们使用

 @Override
 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add("View Selected Text");
}

2) list--如果是ListView,则为ref

registerForContextMenu(list);

3)

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

    if(item.getTitle().equals("View Selected Text"))
    {
        AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
        Contact c=array.get(menuInfo.position);
        Toast.makeText(List.this, "Selected String is :-"+c.toString(), Toast.LENGTH_SHORT).show();
    }
}

1

首先使用id获取列表

Context context = getApplicationContext();
ComponentName component = new ComponentName(context.getPackageName(), TestReplaceHomeAppActivity.class.getName());

String packname = context.getPackageName();

Intent LaunchIntent = getActivity().getPackageManager().getLaunchIntentForPackage(packageName);
if(LaunchIntent != null){
    startActivity(LaunchIntent);
}
else {
    Toast.makeText(getActivity().getBaseContext(),"APPLICATION IN NOT AVAILABEL", Toast.LENGTH_SHORT).show();
}

1
这个答案非常不方便,不应该被采纳。 - Md. Asaduzzaman Noor
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase

0

以上答案非常准确并且针对所提供的情况。话虽如此,我是因为在我的listview中使用了convertView而来到这里,并且为那些也因此而来到这里的人回答。

如果您的LISTVIEW正在使用convertView并且充气一个单独的布局(比如说list_MyItem.xml),直接修改list_MyItem.xml以包含:

android:longClickable="true"

例如,如果列表视图正在使用按钮进行填充,则可以修改按钮如下:
<Button
    android:id="@+id/myButton"
    .
    .
    .
    android:longClickable="true"
/>

0
使用这些方法:onCreateContextMenu 和 onContextItemSelected。
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    if (v.getId() == R.id.listview) {
        menu.setHeaderTitle("Delete");
        menu.add(Menu.NONE, 0, 0, "Delete from list");
    }
}

/**
 * Responding to context menu selected option
 * */

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
            .getMenuInfo();
    int menuItemIndex = item.getItemId();
    // check for selected option
    if (menuItemIndex == 0) {
        // user selected delete
        // delete the listrow
        ..(in your onitemclicklistener there is a parameter called as'postition' use this position and use some method to delete the data corresponding to the position value )
        // reloading same activity again
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

    return true;
}

0

在使用的ListView中,将以下代码写入您的longPressListener中:

 ListView list = (ListView) findViewById(android.R.id.list);
 registerForContextMenu(list);

这些是方法:

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

    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    Adapter adapter = getListAdapter();
    Object item = adapter.getItem(info.position);



    menu.setHeaderTitle("Choose");
    menu.add(0, v.getId(), 0, "Delete");

}


@Override
public boolean onContextItemSelected(MenuItem item) {

    if (item.getTitle() == "Delete") {
        deleteContact(item.getItemId());
    } else if (...) {
        // code
    } else {
        return false;
    }
    return true;

}

 public void deleteContact(int id){

// your code what to do for the clicked item
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接