我希望在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;
}}
答案 0 :(得分:1)
我相信正在发生的事情是,当你调用row.setOnClickListener
时,你可以使你的行可以点击(覆盖你放在XML中的任何内容)。这意味着所有点击处理(包括Android在View类中使用的长按计时器)都适用于您的行,而不是您的GridView。您需要在一个地方处理这两种类型的点击,但您有两种选择。
选项1:您可以使用setOnItemClickListener
和setOnItemLongClickListener
在片段中进行两种类型的点击。像这样:
@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);
}
});