Контекстное меню не работает должным образом с элементами GridView
У меня есть фрагмент, который содержит gridView, внутри которого я инициализирую его элементы с помощью ImageViews, установленным моим классом ImageAdapter.java. У меня также есть другой фрагмент, который также содержит gridView, который я инициализирую с imageViews другим моим классом адаптера -> UserBoxGlbImageAdapter.java.
Теперь я пытаюсь достичь этого, когда пользователь долго нажимает на imageView из сетки первого фрагмента, я создаю контекстное меню с двумя опциями. Когда выбран первый, я хочу получить позицию этого вида и использовать ее для добавления того же изображения в imageView моего другого фрагмента сетки.
Пример: когда вы долго нажимаете на 0-й элемент [index] в первой сетке, получите этот индекс и используйте его, чтобы добавить этот же значок / изображение в сетку другого фрагмента.
Большая часть этого работает, но когда я пытаюсь добавить выбранный элемент, мое приложение добавляет всю строку (или, может быть, всю сетку?) К этому другому фрагменту. Есть идеи по этому вопросу? Вот мои занятия:
Fragment1.class: [Содержит контекстное меню]
public class MainScreenFragment extends Fragment {
// Main Grid View
GridView gridView;
public MainScreenFragment() {
// Required empty public constructor
}
// Create a Context Menu when an item in the GridView is long-pressed
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Card Options");
AdapterView.AdapterContextMenuInfo cmi = (AdapterView.AdapterContextMenuInfo) menuInfo;
menu.add(1,v.getId(),0, "Add Card to GLB");
menu.add(2,v.getId(),0,"Add Card to JP");
}
// When an item in the context menu gets selected, call a method
@Override
public boolean onContextItemSelected(MenuItem item) {
// Get some extra info about the contextMenu
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
GridView grid = getView().findViewById(R.id.gridViewLayout);
int position = info.position; // clicked view's position
Toast.makeText(getActivity(), "View: " + info.targetView, Toast.LENGTH_SHORT).show();
if(item.getTitle().equals("Add Card to GLB")) {
addCardToast(position, "added to GLB");
addSelectedCardToGlobalUserBox(position);
} else if (item.getTitle().equals("Add Card to JP")) {
addCardToast(position , "added to JP");
} else
{
return false;
}
return false;
}
private void addSelectedCardToGlobalUserBox(int position) {
ImageAdapter imageAdapter = new ImageAdapter(getContext());
UserBoxGlbImageAdapter userBoxGlbImageAdapter = new UserBoxGlbImageAdapter(getContext());
userBoxGlbImageAdapter.getGLBIconsList().add(imageAdapter.getmThumbIds(position));
int glbiconSize = userBoxGlbImageAdapter.getCount();
Toast.makeText(getActivity(), "GlbIcons size: " + glbiconSize, Toast.LENGTH_SHORT).show();
}
private void addCardToast(int id, String text) {
Toast.makeText(getActivity(), "Info: " + id + text, Toast.LENGTH_SHORT).show();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_main_screen, container, false);
gridView = view.findViewById(R.id.gridViewLayout);
gridView.setAdapter(new ImageAdapter(getContext())); // used to set the contents of the GridView-in this case images-
registerForContextMenu(gridView);
// When an item from the GridView gets clicked
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Create a new Intent...
Toast.makeText(getActivity(), "Position: " + position, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getContext(),CardViewActivity.class);
intent.putExtra("Card Index",position);
intent.putExtra("SCREEN_WIDTH",1080);
startActivity(intent);
}
});
return view;
}
}
Fragment1ImageAdapter.java:
public class ImageAdapter extends BaseAdapter {
Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
@Override
public int getCount() {
return mThumbIds.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
// If it's not recycled, initialize some attributes
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(225, 225));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
public Integer getmThumbIds(int index) {
return mThumbIds[index];
}
// References to our images
private Integer[] mThumbIds = {
R.mipmap.turvegitossj_phy,
R.mipmap.goget_ur_int,
R.mipmap.turgogetassj4_teq,
R.mipmap.turgotenksssj_uragl
};
}
Fragment2.java: [содержит сетку, в которую нужно добавить кликаемые изображения]
public class UserBoxGLBFragment extends Fragment {
GridView globalGridView;
public UserBoxGLBFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_user_box_glb, container, false);
globalGridView = view.findViewById(R.id.userBoxGlbGridView);
globalGridView.setAdapter(new ImageAdapter(getContext()));
return view;
}
}
Fragment2_ImageAdapter.java:
public class UserBoxGlbImageAdapter extends BaseAdapter {
Context mContext;
public UserBoxGlbImageAdapter(Context c) {
mContext = c;
}
@Override
public int getCount() {
return mGLBIcons.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
// References to the images via a List
private List<Integer> mGLBIcons = new ArrayList<>();
// Used to add card icons from the mainScreenFragment
public List<Integer> getGLBIconsList() {
return mGLBIcons;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
// If it's not recycled, initialize some attributes
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(225, 225));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mGLBIcons.get(position));
return imageView;
}
}
Я действительно надеюсь, что вы поможете мне понять, что я делаю здесь неправильно. Является ли регистрация gridView в целом для контекстного меню проблемой? Это что-то еще?
Заранее спасибо.