web-dev-qa-db-fra.com

Utiliser contextmenu avec listview dans Android

Je développe une application Android. J'aurai un listview et j'ai défini un menu contextuel pour apparaître lorsqu'un élément listview est pressé depuis longtemps. Comment puis-je obtenir l'élément de l'élément listview sélectionné (par exemple, le texte d'un listview)? une action du contextmenu est choisie pour que je puisse la traiter? Voici du code:

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

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

}

Et le 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);
    }
}

Je veux obtenir du texte à partir d'un textview dans un élément de liste. Comment puis-je y parvenir?

32
mungaih pk

vous devriez enregistrer la LISTVIEW pour le menu contextuel.

Voici la source.

pour onCreate():

 registerForContextMenu(lv);

Et pour accéder à l'élément sélectionné pendant un clic long:

@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);
   }
}
68
Piyush

Pour obtenir l'élément de l'élément ListView sélectionné reportez-vous à l'objet ContextMenuInfo (voir la dernière méthode implémentée ci-dessous). Solution complète comme suit:

1) inscrire ListView pour le menu contextuel dans la classe ListActivity

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

1a) si vous avez une vue complexe sur votre liste, vous devrez peut-être activer un clic long sur chaque vue de liste dans la classe Adapter.

@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) implémenter onCreateContextMenu () et onContextItemSelected () dans la classe 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);
    }
}
32
Kamil Seweryn

1) Nous utilisons d'abord 

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

2) List - est réf si 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();
    }
}
2
ashish

d'abord obtenir la liste en utilisant l'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
murala

utiliser ces méthodes, onCreateContextMenu et 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
Maulik Sheth

Ecrivez ceci dans votre longPressListener avec le listview que vous utilisez:

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

Et ce sont les méthodes:

  @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
  }
0
silvia_aut

Les réponses ci-dessus sont très précises et au point pour le cas fourni. Cela étant dit, j’ai été amené ici avec une convertView pour ma listview et je réponds pour ceux qui sont également amenés ici avec cette affaire.

Si votre LISTVIEW utilise convertView et gonfle une présentation séparée (disons list_MyItem.xml), modifiez directement le list_MyItem.xml pour avoir:

Android:longClickable="true"

Par exemple, si la liste est remplie de boutons, modifiez le bouton en tant que tel:

<Button
    Android:id="@+id/myButton"
    .
    .
    .
    Android:longClickable="true"
/>
0
T.Woody