首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BaseAdapter和ContextMenu

BaseAdapter和ContextMenu
EN

Stack Overflow用户
提问于 2011-12-08 19:06:26
回答 2查看 3.6K关注 0票数 4

你好,堆栈溢出社区,

基本上,我有一个图库,用gridView + imageView显示一些图像

代码语言:javascript
复制
<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"
            />

我想对适配器显示的每个imageView使用setOnLongClick。但是,当单击imageView上的long时,我希望显示一个带有某些项的ContextMenu (例如,长时间单击imageView,显示带有一些项的contextMenu :图像信息,发送此图像.)。不幸的是,我不知道如何在适配器中充气这个菜单(可能不是一个好方法)。

在我的主要活动中有以下几行

代码语言:javascript
复制
_adapter = new ImageAdapter(activity,storedObjects.getAlbums());
imagegrid.setAdapter(_adapter);

我的适配器(删除了一些无用的行)

代码语言:javascript
复制
  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,ContextMenuInfo menuInfo),但是如何传递呢?

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

非常感谢

弗洛伦特·瓦尔德列夫

EN

回答 2

Stack Overflow用户

发布于 2011-12-08 20:30:15

与其在setOnLongClickListener上使用ImageView,不如用GridView调用registerForContextMenu。然后,实现onCreateContextMenuonContextItemSelected

下面是一个简单的ListActivity,向您展示它是如何工作的。

代码语言:javascript
复制
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;
  }
}
票数 2
EN

Stack Overflow用户

发布于 2011-12-11 10:03:25

非常感谢@chiuki,它的工作原理与预期一样

代码语言:javascript
复制
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

干杯

弗洛伦特

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8436250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档