BaseAdapter и ContextMenu - PullRequest
       50

BaseAdapter и ContextMenu

4 голосов
/ 08 декабря 2011

Привет сообщество 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"
            />

Я хотел бы использовать 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, менюInfo ContextMenuInfo), но как?

Буду очень признателен, если вы поможете мне с этим.

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

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

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Вместо 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;
  }
}
1 голос
/ 11 декабря 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

Cheers

Флоран

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...