Android BaseAdapter和ContextMenu

Android BaseAdapter和ContextMenu,android,gridview,imageview,adapter,onlongclicklistener,Android,Gridview,Imageview,Adapter,Onlongclicklistener,大家好,我的社区 基本上,我的图库使用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

大家好,我的社区

基本上,我的图库使用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"
            />
我的适配器(删除了一些无用的线路)

  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;
    }
问题:

  • setOnLongClickListener工作正常,当我单击图像时,我的日志显示在logcat中,但是,如何为每个imageView创建菜单
  • 显然,我只能在我的主要活动中覆盖onCreateContextMenu。我想我可以将每个ImageView传递给onCreateContextMenu(ContextMenu,View v,ContextMenuInfo menuInfo),但是如何传递呢

    如果你能帮我解决这个问题,我将不胜感激

    多谢各位


    Florent Valdelievre

    使用
    GridView
    调用
    RegisterForContext菜单,而不是
    ImageView
    上的
    setOnLongClickListener
    。然后,实现
    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;
      }
    }
    
    公共类问候活动扩展了ListActivity{
    私有静态最终字符串[]mGreetings={“你好”,“再见”};
    私有静态最终字符串[]mPeople={“Alice”、“Bob”、“Charlie”};
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    ArrayAdapter=新的ArrayAdapter(此,
    android.R.layout.simple_list_item_1,mPeople);
    setListAdapter(适配器);
    ListView ListView=getListView();
    registerForContextMenu(列表视图);
    }
    @凌驾
    public void onCreateContextMenu(ContextMenu,视图v,
    ContextMenu.ContextMenuInfo menuInfo){
    对于(int i=0;i
    非常感谢@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;
    }   
    
    在适配器中,确保没有任何设置Clickable=true

    干杯


    Florent

    基本上,这是我尝试做的第一件事,但没有成功
    `final GridView imagegrid=(GridView)findViewById(R.id.PhoneImageGrid)_adapter=newimageadapter(活动,getAlbums());设置适配器(_适配器);imagegrid.setClickable(真);registerForContextMenu(imagegrid);`然后,我实现了
    `@Override public void onCreateContextMenu(ContextMenu,View v,ContextMenuInfo menuInfo){super.onCreateContextMenu(menu,v,menuInfo);Log.v(“context menu”,“context menu”);}`你知道为什么不调用onCreateContextMenu吗
    谢谢您的意思是当您长按时,
    onCreateContextMenu
    不会被调用?确保从单个列表项中删除
    设置LongClickListener
    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;
    }