선택한 항목 (ListView에서)이 ContextMenu (Android)를 생성했는지 감지
사용자가 항목을 길게 눌러 상황에 맞는 메뉴를 표시 할 수 있는 ListView 가 있습니다. 내가 가진 문제는 ListItem
그들이 오래 눌렀다는 것을 결정하는 것입니다. 나는 이것을 시도했다 :
myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override public void onCreateContextMenu(ContextMenu menu, final View v, ContextMenuInfo menuInfo) {
menu.add("Make Toast")
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override public boolean onMenuItemClick(MenuItem item) {
String toastText = "You clicked position " + ((ListView)v).getSelectedItemPosition();
Toast.makeText(DisplayScheduleActivity.this, toastText, Toast.LENGTH_SHORT).show();
return true;
}
});
}
});
그러나 ANR 이 나타날 때까지 중단 됩니다. 메뉴가 생성 된 후에 ListItem
는 더 이상 선택되지 않는 것 같습니다.
클릭 또는 긴 클릭을 모니터링 한 다음 클릭 한 항목을 여기에 기록 할 수있는 것 같습니다.
mArrivalsList.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
// record position/id/whatever here
return false;
}
});
그러나 그것은 나에게 주로 kludgey 느낌입니다. 누구든지 이것에 대한 더 나은 해결책이 있습니까?
나는 정확히 이것을한다. 내에서 onCreateContextMenu(...)
방법, 나는 캐스팅 ContextMenu.ContextMenuInfo
합니다 AdapterView.AdapterContextMenuInfo
. 거기에서 위젯으로 다시 캐스트하는 targetView를 얻을 수 있습니다. 전체 코드는 HomeActivity.java 에서 사용할 수 있습니다 onCreateContextMenu(...)
. 메소드를 찾으십시오 .
@Override
public void onCreateContextMenu(ContextMenu contextMenu,
View v,
ContextMenu.ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) menuInfo;
selectedWord = ((TextView) info.targetView).getText().toString();
selectedWordId = info.id;
contextMenu.setHeaderTitle(selectedWord);
contextMenu.add(0, CONTEXT_MENU_EDIT_ITEM, 0, R.string.edit);
contextMenu.add(0, CONTEXT_MENU_DELETE_ITEM, 1, R.string.delete);
}
선택한 텍스트와 선택 ID를 개인 필드에 저장합니다. UI가 스레드로 제한되어 있으므로 selectedWord 및 selectedWordId 필드가 이후 작업에 적합하다는 것을 알고 있습니다.
우선 .NET을 사용하여 일을 지나치게 복잡하게 만들고 있는지 궁금합니다 View.setOnCreateContextMenuListener()
. 를 사용 Activity.registerForContextMenu()
하면 모든 메뉴 이벤트를 사용 Activity.onCreateContextMenu()
하고 Activity.onContextItemSelected()
처리 할 수 있기 때문에 일이 훨씬 쉬워집니다 . 기본적으로 모든 이벤트를 처리하기 위해 이러한 모든 익명 내부 클래스를 정의 할 필요가 없음을 의미합니다. 이러한 컨텍스트 메뉴 이벤트를 처리하려면 몇 가지 Activity 메서드를 재정의하면됩니다.
둘째, 현재 선택된 항목을 검색하는 더 쉬운 방법이 있습니다. 당신이해야 할 일은 그것을 채우는 데 사용되는 ListView
또는에 대한 참조를 유지하는 Adapter
것입니다. ContextMenuInfo를 AdapterContextMenuInfo로 사용하여 항목의 위치를 가져올 수 있습니다. 다음 중 하나를 사용할 수 있습니다 ListView.getItemAtPosition()
또는 Adapter.getItem()
가 검색 Object
특별히 클릭 있었는지에 연결. 예를 들어를 사용한다고 가정하면 다음 Activity.onCreateContextMenu()
과 같이 할 수 있습니다.
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// Get the info on which item was selected
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
// Get the Adapter behind your ListView (this assumes you're using
// a ListActivity; if you're not, you'll have to store the Adapter yourself
// in some way that can be accessed here.)
Adapter adapter = getListAdapter();
// Retrieve the item that was clicked on
Object item = adapter.getItem(info.position);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// Here's how you can get the correct item in onContextItemSelected()
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Object item = getListAdapter().getItem(info.position);
}
이것은 상황에 맞는 메뉴를 만드는 방법에 대한 또 다른 방법입니다. 여기에서 선택한 항목을 삭제하는 방법은 전체 코드입니다.
public class SimpleJokeList extends Activity {
public static final int Upload = Menu.FIRST + 1;
public static final int Delete = Menu.FIRST + 2;
int position;
ListView lv;
EditText jokeBox;
Button addJoke;
MyAdapter adapter;
private ArrayAdapter<String> mAdapter;
private ArrayList<String> mStrings = new ArrayList<String>();
String jokesToBeAdded;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simplejokeui);
lv=(ListView)findViewById(R.id.jokelist);
addJoke=(Button)findViewById(R.id.addjoke);
jokeBox=(EditText)findViewById(R.id.jokebox);
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings);
registerForContextMenu(lv);
listItemClicked();
addJokes();
private void addJokes() {
// TODO Auto-generated method stub
addJoke.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
jokesToBeAdded=jokeBox.getText().toString();
if(jokesToBeAdded.equals("")){
Toast.makeText(getApplicationContext(), "please enter some joke", Toast.LENGTH_LONG).show();
}
else{
lv.setAdapter(mAdapter);
mAdapter.add(jokesToBeAdded);
jokeBox.setText(null);
}
}
});
}
private void listItemClicked() {
// TODO Auto-generated method stub
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
position=arg2;
return false;
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
populateMenu(menu);
menu.setHeaderTitle("Select what you wanna do");
}
private void populateMenu(ContextMenu menu) {
// TODO Auto-generated method stub
menu.add(Menu.NONE, Upload, Menu.NONE, "UPLOAD");
menu.add(Menu.NONE, Delete, Menu.NONE, "DELETE");
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
return (applyMenuChoice(item) || super.onContextItemSelected(item));
}
private boolean applyMenuChoice(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId())
{
case Delete:
String s=mAdapter.getItem(position);
mAdapter.remove(s);
// position--;
Toast.makeText(getApplicationContext(),"Congrats u HAve Deleted IT", Toast.LENGTH_LONG).show();
return (true);
}
return false;
}
그리고 이것을 넣는 것을 잊지 마십시오
registerForContextMenu(listview);
당신의 onCreate
방법 당신의 상황에 맞는 메뉴를 볼 수 있습니다.
우리는 성공적으로 사용했습니다.
@Override
public boolean onContextItemSelected
(
MenuItem item
)
{
if (!AdapterView.AdapterContextMenuInfo.class.isInstance (item.getMenuInfo ()))
return false;
AdapterView.AdapterContextMenuInfo cmi =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo ();
Object o = getListView ().getItemAtPosition (cmi.position);
return true;
}
보기 인수가 실제 선택된 행의보기가 아니거나 여기에서 질문이 누락 되었습니까?
ListView lv;
private OnItemLongClickListener onLongClick = new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
lv.showContextMenuForChild(arg1);
lv.showContextMenu();
return false;
}
};
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
View TargetV=(View) info.targetView;
text1 = (String) ((TextView) TargetV.findViewById(R.id.textView1)).getText();
text2 = (String) ((TextView) TargetV.findViewById(R.id.textView2)).getText();
if(List3Ok){
text3 = (String) ((TextView) TargetV.findViewById(R.id.textView3)).getText();
}
selectedWord = text1 + "\n" + text2 + "\n" + text3;
selectedWordId = info.id;
menu.setHeaderTitle(selectedWord);
MenuInflater inflater = this.getActivity().getMenuInflater();
inflater.inflate(R.menu.list_menu, menu);
}
I case you are using SimpleCursorAdapder
you may do it like this
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
getActivity().getMenuInflater().inflate(R.menu.project_list_item_context, menu);
// Getting long-pressed item position
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
int position = info.position;
// Get all records from adapter
Cursor c = ((SimpleCursorAdapter)getListAdapter()).getCursor();
// Go to required position
c.moveToPosition(position);
// Read database fields values associated with our long-pressed item
Log.d(TAG, "Long-pressed-item with position: " + c.getPosition());
Log.d(TAG, "Long-pressed-item _id: " + c.getString(0));
Log.d(TAG, "Long-pressed-item Name: " + c.getString(1));
Log.d(TAG, "Long-pressed-item Date: " + c.getString(2));
Log.d(TAG, "Long-pressed-item Path: " + c.getString(3));
// Do whatever you need here with received values
}
ReferenceURL : https://stackoverflow.com/questions/2321332/detecting-which-selected-item-in-a-listview-spawned-the-contextmenu-android
'IT story' 카테고리의 다른 글
장고 모델 : ID 목록 가져 오기 (0) | 2020.12.28 |
---|---|
생성 된 목록의 각 항목에 대한 RxJava 지연 (0) | 2020.12.28 |
Yarn에서 글로벌 패키지를 업데이트하려면 어떻게해야합니까? (0) | 2020.12.25 |
RESTful 서비스를 디버깅하는 방법은 무엇입니까? (0) | 2020.12.25 |
목록을 노출하는 것이 나쁜 것으로 간주되는 이유 (0) | 2020.12.25 |