2011-12-08 38 views
4

你好计算器社区,BaseAdapter和文本菜单

基本上,我有画廊显示使用一个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" 
      /> 
一些图像

我想用setOnLongClick由显示的每个ImageView的适配器。 这个效果很好,但是,当单击imageView上的很长时间时,我想用一些项目显示一个ContextMenu(即,您只需长按一下imageView,contextMenu就会显示一些项目:图像信息,发送此图像.. )。 不幸的是,我无法弄清楚如何在充气适配器菜单。(可能不是好办法做到这一点)

我在我的主要活动如下行

_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中,但是,如何为每个imageView创建菜单?

显然,我只能在我的主要活动中覆盖onCreateContextMenu。我想我可以将每个ImageView传递给onCreateContextMenu(ContextMenu菜单,View v,ContextMenuInfo menuInfo),但是如何?

如果你能帮助我解决这个问题,我将非常感激。

非常感谢您

弗洛朗Valdelievre

回答

2

代替setOnLongClickListenerImageView,叫registerForContextMenuGridView。然后,执行onCreateContextMenuonContextItemSelected

下面是一个简单的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; 
    } 
} 
+0

基本上,这是我试图做的第一件事,但没有成功
' final GridView imagegrid =(GridView)findViewById(R.id.PhoneImageGrid); _adapter = new ImageAdapter(activity,getAlbums()); imagegrid.setAdapter(_adapter); imagegrid。setClickable(真); registerForContextMenu(imagegrid); ' 然后,我已经实现
' @Override 公共无效onCreateContextMenu(文本菜单的菜单,视图V,ContextMenuInfo menuInfo){ super.onCreateContextMenu(菜单,V,menuInfo); Log.v(“上下文菜单”,“上下文菜单”); \t} ' 您是否有任何线索为什么onCreateContextMenu不被调用?
谢谢 –

+0

你的意思是'onCreateContextMenu'在你长时间按下时不会被调用?确保从个别列表项中删除了'setOnLongClickListener'。 – chiuki

1

谢谢你这么多@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 =真

干杯

弗洛朗