android - BaseAdapter 和 ContextMenu

标签 android gridview imageview adapter onlongclicklistener

你好 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"
            />

我想为适配器显示的每个 imageView 使用 setOnLongClick。 这很好用,但是,当在 imageView 上长按时,我想显示一个带有一些项目的 ContextMenu(即,你长按一个 imageView,一个 contextMenu 显示一些项目:图像信息,发送这个图像...... ). 不幸的是,我不知道如何在适配器中扩充此菜单。(可能不是这样做的好方法)

我的主要 Activity 中有以下几行

_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 创建一个菜单?

显然,我只能在我的主要 Activity 中覆盖 onCreateContextMenu。我想我可以将每个 ImageView 传递给 onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) 但是怎么做呢?

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

非常感谢

佛罗伦特·瓦尔德利耶夫

最佳答案

不是 ImageView 上的 setOnLongClickListener,而是使用 GridView 调用 registerForContextMenu。然后,实现 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;
  }
}

关于android - BaseAdapter 和 ContextMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8436250/

相关文章:

php - Yii CGridView BELONGS_TO 关系搜索 : Numeric comparison operator fails

javafx 替换 BorderPane 的背景图像

android - 钛 android 中的 tableview 子项中的标签文本未更新。但在 IOS 中有效

php - Android HttpPost 从 PHP 脚本而不是 JSONArray 获取 NULL

android - 如何在android中可扩展 ListView 的每个部分添加不同的子项?

javascript - GridView ImageButton 确认和删除记录

android - myActivity 扩展 GridView 实现 OnClickListener

java - 在 ListView 中在 TextView 旁边显示 ImageView

java - Android V7 ShareActionProvider 分享按钮不工作

android - 通过 NFC 标签共享 Wifi 凭据,无需特殊应用程序