2013-09-05 33 views
30

Tôi đang phát triển một ứng dụng android.I sẽ có một listview và tôi đã thiết lập một menu ngữ cảnh xuất hiện khi một mục listview là long-pressed.Làm thế nào để tôi nhận được các mục từ mục listview được chọn (nói văn bản từ một textview listview) sau khi một hành động từ contextmenu được chọn để tôi có thể xử lý nó? Dưới đây là một số mã:Sử dụng contextmenu với listview trong android

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

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

} 

Và 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); 
    } 
} 

Tôi muốn nhận được văn bản từ một TextView trong một danh sách item.How để tôi đạt được điều đó?

+0

Vì vậy, có 2 lần xem danh sách, 1 là danh sách chính và danh sách còn lại là 3 mục hiển thị khi bạn bấm lâu. Tôi không thấy vị trí nhấp chuột dài đang được gọi. – Zypps987

Trả lời

63

bạn nên đăng ký LISTVIEW cho menu ngữ cảnh.

Đây là nguồn.

cho onCreate():

registerForContextMenu(lv); 

Và để truy cập mục đã chọn trong bấm dài:

@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); 
    } 
} 
+14

Piyush Gupta Tôi thực sự biết ơn sự giúp đỡ của bạn. Bạn không biết bạn đã giúp tôi bao nhiêu tiền. Tôi nợ bạn rất nhiều. Tôi đã gặp rắc rối thực sự trong vụ này, đã đưa tôi một tuần trước khi đăng nó ở đây. Tôi đánh giá cao rất nhiều .Cảm ơn. –

+0

Bạn có thể cho tôi biết 'YourObject' ở đây là gì không? –

+0

@MohammadAreebSiddiqui điều này sẽ được thực hiện của riêng bạn của một đối tượng lớp để giữ dữ liệu của bạn. –

0

sử dụng phương pháp này, onCreateContextMenu và 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

Viết này trong longPressListener của bạn với listview bạn sử dụng:

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

Và đây là các phương pháp:

@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 
    } 
1

đầu danh sách get sử dụng 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(); 
} 
2

1) Đầu tiên chúng tôi sử dụng

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

2) danh sách - là ref nếu ListView

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(); 
    } 
} 
31

Để lấy mục từ mục ListView được chọn hãy tham khảo đối tượng ContextMenuInfo (xem phương pháp triển khai cuối cùng bên dưới).Full giải pháp như sau:

1) đăng ký ListView cho menu ngữ cảnh trong lớp ListActivity

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

1a) nếu bạn có Xem phức tạp trên danh sách của bạn, bạn có thể cần phải kích hoạt bấm dài trên từng xem danh sách trong lớp Adaptor

@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) thực hiện onCreateContextMenu() và onContextItemSelected() trong lớp ListActivity

@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); 
    } 
} 
+2

này làm ** longclickable = true ** là phao cứu sinh. Thanx. – Fer

Các vấn đề liên quan