使用GridViewAdapter进行Gridview如何在Gridview中设置onclick侦听器而不是GridViewAdapter

时间:2014-11-28 02:01:53

标签: android gridview android-fragments

我希望在gridview元素上有一个onlongclicklistener,它会打开一个弹出菜单。 但我不能这样做,除非我把那个onclicklistener放在gridviewadapter中。我将使用popupmenu上的项目列表将新的片段请求浮动到活动,并在活动中更改arraylist中的值。

所以我想保留这个“片段的内部”而不是GridViewAdapter。使用gridviewadapter时,是不是可以直接在gridview上设置onclicklistener?

PT_Activity;

public class PT_Activity extends Activity implements Serializable{

ArrayList<PictureItem> pictureArray;
FragmentTransaction ft;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_single_fragment);

    if(savedInstanceState == null){
        GetData();

        Bundle extra = new Bundle();
        extra.putSerializable("pictureArray", pictureArray);
        ft = getFragmentManager().beginTransaction();
        PT_Fragment pt_fragment = new PT_Fragment();
        pt_fragment.setArguments(extra);
        ft.add(R.id.singleFragmentContainer, pt_fragment, "pt_fragment");
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();
    }
}

public ArrayList<PictureItem> GetData(){
    if(pictureArray == null){
        FileInteraction fileInteraction = new FileInteraction();
        pictureArray = (fileInteraction.getArrayOfPictureItemFromFolder(Environment.getExternalStorageDirectory().toString() + "/PictureTalk/PictureTalk/"));
    }
    return pictureArray;
}}

PT_Fragment

public class PT_Fragment extends Fragment implements Serializable {

private PT_Activity pt_activity;
private View view;
private GridView gridView;
private PictureGridViewAdapter pictureGridViewAdapter;
private ArrayList<PictureItem> pt_Array;
private Bundle extra;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    pt_activity = (PT_Activity) getActivity();
    extra = getArguments();
    pt_Array = (ArrayList<PictureItem>) extra.getSerializable("pictureArray");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.picturetalk_main_category, container, false);
    gridView = (GridView) view.findViewById(R.id.PictureGrid1);
    pictureGridViewAdapter = new PictureGridViewAdapter(getActivity(), 
    R.layout.picturetalk_picture_grid, pt_Array);
    gridView.setAdapter(pictureGridViewAdapter);
    gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            SelectionMenu();
            return true;
        }
    });
    return view;
}

private void SelectionMenu() {
    PopupMenu popMenu = new PopupMenu(getActivity(), gridView);
    popMenu.getMenuInflater().inflate(R.menu.picturetalk_popup_menu, popMenu.getMenu());
    popMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            switch (menuItem.getItemId()) {

                case R.id.edit:


                 //  PT_EditPictureFragment pt_editPictureFragment = new   
                 PT_EditPictureFragment();

                   //  Intent intent = new Intent(getContext(), EditPicture.class);
                   //  intent.putExtra("itemUUID", item.getId());
                    String s = new String("");
                    // context.startActivity(intent);
                   // break;

                case R.id.remove:
                    FileInteraction fileInteraction = new FileInteraction();
                    //fileInteraction.deleteFilesAndFolder(item.getImagePath());
                    //item.setTitle("");
                    //notifyDataSetChanged();
                    break;

                default:
                    //

            }
            return true;
        }
    });
    popMenu.show();

}}

PictureGridViewAdapter

public class PictureGridViewAdapter extends ArrayAdapter {

private Context context;
private int layoutResourceId;
private ArrayList<PictureItem> data;


public PictureGridViewAdapter(Context context, int layoutResourceId,
                       ArrayList data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ViewHolder holder = null;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.imageTitle = (TextView) row.findViewById(R.id.text);
        holder.image = (ImageView) row.findViewById(R.id.image);
        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

    final PictureItem item = (PictureItem) data.get(position);
    holder.imageTitle.setText(item.getTitle());
    holder.image.setImageBitmap(BitmapFactory.decodeFile(item.getImagePath()));
    row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                if (item.getSoundPath() != null) {
                    MediaPlayer mp = MediaPlayer.create(getContext(), Uri.parse(item.getSoundPath()));
                    mp.start();

                }
            } catch (Exception e) {
                {
                    e.printStackTrace();
                }
            }
        }
    });
/*
    row.setOnLongClickListener(new View.OnLongClickListener()

    {
        @Override
        public boolean onLongClick(View v) {
            PopupMenu popMenu = new PopupMenu(v.getContext(), v);
            popMenu.getMenuInflater().inflate(R.menu.picturetalk_popup_menu, popMenu.getMenu());
            popMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    switch (menuItem.getItemId()) {

                        case R.id.edit:


                            Intent intent = new Intent(getContext(), EditPicture.class);
                            intent.putExtra("itemUUID", item.getId());
                            String s = new String("");
                            context.startActivity(intent);
                            break;

                        case R.id.remove:
                            FileInteraction fileInteraction = new FileInteraction();
                            fileInteraction.deleteFilesAndFolder(item.getImagePath());
                            item.setTitle("");
                            notifyDataSetChanged();
                            break;

                        default:
                            //

                    }
                    return true;
                }
            });
            popMenu.show();
            return true;
        }
    });
    */
    return row;

}

static class ViewHolder {
    TextView imageTitle;
    ImageView image;
}}

1 个答案:

答案 0 :(得分:1)

我相信正在发生的事情是,当你调用row.setOnClickListener时,你可以使你的行可以点击(覆盖你放在XML中的任何内容)。这意味着所有点击处理(包括Android在View类中使用的长按计时器)都适用于您的行,而不是您的GridView。您需要在一个地方处理这两种类型的点击,但您有两种选择。

选项1:您可以使用setOnItemClickListenersetOnItemLongClickListener在片段中进行两种类型的点击。像这样:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.picturetalk_main_category, container, false);
    gridView = (GridView) view.findViewById(R.id.PictureGrid1);
    pictureGridViewAdapter = new PictureGridViewAdapter(getActivity(), 
        R.layout.picturetalk_picture_grid, pt_Array);
    gridView.setAdapter(pictureGridViewAdapter);
    gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            SelectionMenu();
            return true;
        }
    });
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public boolean onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // start-media code could go in fragment or adapter
            pictureGridViewAdapter.startMediaPlayer(position);
            return true;
        }
    });
    return view;
}

选项2:您可以在适配器中同时进行两种类型的点击。由于您希望将弹出菜单保留在片段中,您可以为适配器提供指向适配器构造函数中片段的后向指针,然后调用片段中的方法来显示它。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.picturetalk_main_category, container, false);
    gridView = (GridView) view.findViewById(R.id.PictureGrid1);
    pictureGridViewAdapter = new PictureGridViewAdapter(getActivity(), 
        R.layout.picturetalk_picture_grid, pt_Array);
    pictureGridViewAdapter.setFragment(this); // or add a constructor parameter
    gridView.setAdapter(pictureGridViewAdapter);
    ...
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ...
    row.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            fragment.showPopupMenu(position);
        }
    });