java将数据从一个recycleView传递到另一个的问题
我是一个Android开发的初学者,我试图用CardView制作一个简单的应用程序,在一个片段中有一个recycleView,当你点击列表中任何一个项目的like按钮时,然后,应用程序应该将该项目发送到另一个名为FavoriteFragment(也包含recycleView)的片段,并在此处显示
我试图使用一个界面来实现这一点,但每当我单击其中一个类似的按钮时,我的活动都不会收到信息(我试图在方法中记录一条消息,但没有显示)
以下是每一项的代码:
我的界面,我试图使用它来传递来自国家的数据片段->;适配器->;视窗支架->;活动->;最喜欢的片段
public interface InterfaceListItemClickListener {
void listItemClickAction(ArrayList properties);
}
my Countries fragment,这是保存第一个回收视图的片段:
public class CountriesFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
ArrayList<RecycleViewItem> listCountries = new ArrayList<>();
String names[] = {"Thailand", "Venezuela", "Sweden"};
int images[] = {R.drawable.thailand, R.drawable.venezuela, R.drawable.sweden};
RecyclerView myRecyclerView;
InterfaceListItemClickListener sender;
public CountriesFragment() {
// Required empty public constructor
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
sender = (InterfaceListItemClickListener) getActivity();
}
public static CountriesFragment newInstance(String param1, String param2) {
CountriesFragment fragment = new CountriesFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
initializeList();
}
public void initializeList(){
listCountries.clear();
for(int i = 0; i < names.length; i++){
RecycleViewItem item = new RecycleViewItem();
item.setCardName(names[i]);
item.setImageResourceID(images[i]);
item.setIsFav(0);
item.setIsTurned(0);
listCountries.add(item);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_countries, container, false);
myRecyclerView = (RecyclerView) view.findViewById(R.id.recycleView);
myRecyclerView.setHasFixedSize(true);
LinearLayoutManager myLayoutManager = new LinearLayoutManager(getActivity());
myLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
ListsForFragments.populateCountriesList();
if (ListsForFragments.countriesList.size() > 0 & myRecyclerView != null) {
myRecyclerView.setAdapter(new MyAdapter(ListsForFragments.countriesList, sender));
}
myRecyclerView.setLayoutManager(myLayoutManager);
return view;
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
}
我的适配器类:
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{
private ArrayList<RecycleViewItem> list = new ArrayList<RecycleViewItem>();
InterfaceListItemClickListener sender = null;
public MyAdapter(ArrayList<RecycleViewItem> list, InterfaceListItemClickListener sender) {
this.list = list;
this.sender = sender;
}
public MyAdapter(ArrayList<RecycleViewItem> list) {
this.list = list;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_items, parent, false);
MyViewHolder holder = new MyViewHolder(view, sender);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.titleTextView.setText(list.get(position).getCardName());
holder.coverImageView.setImageResource(list.get(position).getImageResourceID());
holder.coverImageView.setTag(list.get(position).getImageResourceID());
}
@Override
public int getItemCount() {
return list.size();
}
}
我的viewHolder类:
public class MyViewHolder extends RecyclerView.ViewHolder{
public TextView titleTextView;
public ImageView coverImageView;
public ImageView likeImageView;
public ImageView shareImageView;
public ImageView favoriteImageView;
public TextView favoriteTextView;
private ArrayList goesToFavourites = new ArrayList();
public MyViewHolder(View itemView, final InterfaceListItemClickListener sender) {
super(itemView);
titleTextView = (TextView) itemView.findViewById(R.id.titleTextView);
coverImageView = (ImageView) itemView.findViewById(R.id.coverImageView);
likeImageView = (ImageView) itemView.findViewById(R.id.likeImageView);
shareImageView = (ImageView) itemView.findViewById(R.id.shareImageView);
favoriteImageView = (ImageView) itemView.findViewById(R.id.imageView_favorite);
favoriteTextView = (TextView) itemView.findViewById(R.id.textView_name_favorite);
if (likeImageView != null) {
likeImageView.setTag(R.drawable.ic_like);
likeImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int id = (int) likeImageView.getTag();
if (id == R.drawable.ic_like) {
likeImageView.setTag(R.drawable.ic_liked);
likeImageView.setImageResource(R.drawable.ic_liked);
if(sender != null) {
getGoesToFavourites().add(coverImageView);
getGoesToFavourites().add(likeImageView);
sender.listItemClickAction(getGoesToFavourites());
}
} else {
likeImageView.setTag(R.drawable.ic_like);
likeImageView.setImageResource(R.drawable.ic_like);
}
}
});
}
}
public ArrayList getGoesToFavourites() {
return goesToFavourites;
}
public void setGoesToFavourites(ArrayList goesToFavourites) {
this.goesToFavourites = goesToFavourites;
}
}
我的favoriteFragment类,接收信息的类:
public class FavoriteFragment extends Fragment {
private OnFragmentInteractionListener mListener;
RecyclerView myRecyclerView;
ArrayList receiver = new ArrayList();
public FavoriteFragment() {
}
public void receiveData(ArrayList receiver){
this.receiver = receiver;
}
public static FavoriteFragment newInstance() {
FavoriteFragment fragment = new FavoriteFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_favorite, container, false);
myRecyclerView = (RecyclerView) view.findViewById(R.id.recycleView);
myRecyclerView.setHasFixedSize(true);
LinearLayoutManager myLayoutManager = new LinearLayoutManager(getActivity());
myLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
if (receiver != null & myRecyclerView != null) {
myRecyclerView.setAdapter(new MyAdapter(receiver));
}
myRecyclerView.setLayoutManager(myLayoutManager);
return view; }
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
}
最后,我的主要活动,桥梁:
public class MainActivity extends AppCompatActivity implements
HostFragment.OnFragmentInteractionListener,
CountriesFragment.OnFragmentInteractionListener,
CitiesFragment.OnFragmentInteractionListener,
PlacesFragment.OnFragmentInteractionListener,
FavoriteFragment.OnFragmentInteractionListener,
ViewPagerFragment.OnFragmentInteractionListener,
InterfaceListItemClickListener{
FragmentManager fm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fm = getSupportFragmentManager();
//if this is the first time we are running the app
if(savedInstanceState == null){
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.content, new ViewPagerFragment());
transaction.commit();
}
}
@Override
public void onFragmentInteraction(Uri uri) {
}
@Override
public void listItemClickAction(ArrayList list) {
FavoriteFragment favorite = (FavoriteFragment)
fm.findFragmentById(R.id.favorite);
favorite.receiveData(list);
Log.d("INTERFACE", "Data received!" + list);
}
}
如果需要任何额外的信息,请告诉我,我会提供
编辑:所以在调试时,我发现InterfaceListemClickListener显示MyViewHolder为空,但不确定为什么
编辑2:所以我改变了一些事情,在我的国家片段中:
我删除了OnActivityCreated方法,并在onCreate中初始化了接口,如下所示:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initializeList(); sender = (InterfaceListItemClickListener) getActivity(); }
现在通过这个更改,我可以知道我的MainActivity中的findFragmentById正在返回null。现在,我显示这个片段的方式是使用一个包含两个片段的ViewPager片段。这看起来像这样:
public class ViewPagerFragment extends Fragment {
private OnFragmentInteractionListener mListener;
public static ViewPager viewPager;
public ViewPagerFragment() {
// Required empty public constructor
}
public static ViewPagerFragment newInstance() {
ViewPagerFragment fragment = new ViewPagerFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setTitle(null);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_pager, container, false);
CustomAdapter adapter = new CustomAdapter(getChildFragmentManager()); //getChildFragmentManager
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
return view;
}
public class CustomAdapter extends FragmentPagerAdapter {
public CustomAdapter(FragmentManager fm){
super(fm);
}
//position tells the program what fragment we are currently on/displaying
public Fragment getItem(int position){
switch (position){ //notice we don't use breaks on each case, due to the return statement on each.
case 0:return CountriesFragment.newInstance();
case 1: return FavoriteFragment.newInstance();
default: return FavoriteFragment.newInstance();
}
}
public int getCount(){
return 2;
}
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
在这种情况下,我将如何完成信息传递
# 1 楼答案
OnCreateView()
在OnActivityCreate()
之前被调用,这就是为什么你的发送者是空的。此外,必须避免在OnCreateView()中设置或创建任何对象。你的碎片应该是这样的