Базовый адаптер и контекстное меню

Привет, сообщество stackoverflow,

По сути, у меня есть галерея, отображающая некоторые изображения с использованием gridView + imageView.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">

    <GridView android:id="@+id/PhoneImageGrid"
            android:layout_width="fill_parent" android:layout_height="fill_parent"
            android:numColumns="auto_fit" android:verticalSpacing="12dp"
            android:horizontalSpacing="12dp" android:columnWidth="90dp"
            android:stretchMode="columnWidth" android:gravity="center" />

        <ImageView android:id="@+id/thumbImage" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_centerInParent="true" 

            android:scaleType="centerCrop"
            />

I would like to use setOnLongClick for each imageView displayed by the adapter. This works well, however, when clicking long on the imageView, i would like to display a ContextMenu with some items ( i.e, you long click on an imageView, a contextMenu is displayed with some items : Image information, send this image ...). Unfortunatly, i can't figure out how to inflate this menu in the adapter.(Probably not the good way to do it )

У меня есть следующие строки в моем основном действии

_adapter = new ImageAdapter(activity,storedObjects.getAlbums());
imagegrid.setAdapter(_adapter);

Мой адаптер (удалены некоторые ненужные строки)

  public class ImageAdapter extends BaseAdapter {

    private Albums albums;
    private Context context;
    private LayoutInflater inflater;     



    public ImageAdapter(Context context, Albums albums) {

        this.albums = albums;
        this.context = context;
        inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
        if(albums.getAlbumsListSize() == 0) {
            Toast.makeText(context, "There is no album to display", Toast.LENGTH_LONG).show();
        }
    }




    public View getView(final int position, View view, ViewGroup parent) {

        ViewHolder holder;

        if (view == null) {       
            holder = new ViewHolder();       
            view = inflater.inflate(R.layout.galleryitem, null);       
            holder.imageview = (ImageView) view.findViewById(R.id.thumbImage);        
            holder.checkbox = (CheckBox) view.findViewById(R.id.itemCheckBox); 
            holder.textview = (TextView) view.findViewById(R.id.album_name); 
            holder.checkbox.setChecked(true);
            //Bitmap loadingBM = BitmapFactory.decodeResource(context.getResources(),R.drawable.loading_image);
            //holder.imageview.setImageBitmap(loadingBM);
            view.setTag(holder);
        }

        else {
            holder = (ViewHolder) view.getTag();
        }

        holder.imageview.setClickable(true);


        holder.imageview.setOnLongClickListener(new OnLongClickListener() {


            public boolean onLongClick(View v) {

                Log.v(TAG,"onLongClick ok !");
                return false;
            }

        });


        imageDownloader.download(this.context, albums.getAllAlbums().get(position).getThumbnailUri(), holder.imageview);            


        return view;
    }

Вопросы :

  1. setOnLongClickListener работает правильно, когда я нажимаю на изображение, мой журнал отображается в logcat, однако как создать меню для каждого изображения?

По-видимому, я могу переопределить только onCreateContextMenu в своей основной деятельности. Я думаю, я мог бы передать каждый ImageView в onCreateContextMenu (меню ContextMenu, View v, ContextMenuInfo menuInfo), но как?

Я был бы очень признателен, если бы вы могли помочь мне с этим.

Большое Вам спасибо

Флоран Вальделевр


person Florent Valdelievre    schedule 08.12.2011    source источник


Ответы (2)


Вместо setOnLongClickListener на ImageView позвоните registerForContextMenu со своего GridView. Затем реализуйте onCreateContextMenu и onContextItemSelected.

Вот простой ListActivity, чтобы показать вам, как это работает.

public class GreetingActivity extends ListActivity {
  private static final String[] mGreetings = { "Hello", "Goodbye" };
  private static final String[] mPeople = { "Alice", "Bob", "Charlie" };

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, mPeople);
    setListAdapter(adapter);
    ListView listView = getListView();
    registerForContextMenu(listView);
  }

  @Override
  public void onCreateContextMenu(ContextMenu menu, View v,
      ContextMenu.ContextMenuInfo menuInfo) {
    for (int i = 0; i < mGreetings.length; ++i) {
      String greeting = mGreetings[i];
      menu.add(v.getId(), i, ContextMenu.NONE, "Say " + greeting);
    }
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo menuInfo
        = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    int adapterPosition = menuInfo.position;
    String person = mPeople[adapterPosition];

    int menuItemId = item.getItemId();
    String greeting = mGreetings[menuItemId];

    String msg = String.format("%s, %s!", greeting, person);
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();

    return true;
  }
}
person chiuki    schedule 08.12.2011
comment
По сути, это было первое, что я попытался сделать, но безуспешно ‹br/› ` final GridView imagegrid = (GridView) findViewById(R.id.PhoneImageGrid); _adapter = новый ImageAdapter (активность, getAlbums ()); imagegrid.setAdapter(_adapter); imagegrid.setClickable (истина); зарегистрироватьсяForContextMenu (изображение сетки); ` затем я реализовал ‹br/› ` @Override public void onCreateContextMenu (меню ContextMenu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu (menu, v, menuInfo); Log.v(контекстное меню,контекстное меню); } ` Вы хоть понимаете, почему onCreateContextMenu не вызывается? ‹br/› Спасибо. - person Florent Valdelievre; 09.12.2011
comment
Вы имеете в виду, что onCreateContextMenu не вызывается при долгом нажатии? Убедитесь, что вы удалили setOnLongClickListener из своего отдельного элемента списка. - person chiuki; 09.12.2011

Большое спасибо @chiuki, все работает, как и ожидалось.

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    ...
final GridView imagegrid = (GridView) findViewById(R.id.PhoneImageGrid);                                        
registerForContextMenu(imagegrid);  
storedObjects.storeThumbnailsURI();     
_adapter = new ImageAdapter(activity,storedObjects.getAlbums());
imagegrid.setAdapter(_adapter); 
}


@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {  
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    Log.v("context menu","context menu");
    menu.setHeaderTitle("Context Menu");  
    menu.add(0, START_SLIDESHOW_ON_THIS_ALBUM, 0, "Start SlideShow for this Album");  
    menu.add(0, DOWNLOAD_WHOLE_ALBUM, 0, "Download this Album");  

}   

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {

    case START_SLIDESHOW_ON_THIS_ALBUM:
        selectThisAlbumOnly(info);
        startSlideShow();   
    break;
    case DOWNLOAD_WHOLE_ALBUM:

    break;        
    }
    return true;
}   

В адаптере убедитесь, что у вас нет setClickable = true

Ваше здоровье

Флоран

person Florent Valdelievre    schedule 11.12.2011