IT story

선택한 항목 (ListView에서)이 ContextMenu (Android)를 생성했는지 감지

hot-time 2020. 12. 28. 21:59
반응형

선택한 항목 (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

반응형