Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java (主要活动)片段-->;使用接口从列表中传递对象的新片段_Java_Android_Fragment - Fatal编程技术网

Java (主要活动)片段-->;使用接口从列表中传递对象的新片段

Java (主要活动)片段-->;使用接口从列表中传递对象的新片段,java,android,fragment,Java,Android,Fragment,我在两件事上有困难 不知何故,我无法使我的界面onClickListener正常工作 第一个问题解决后,我不知道如何启动fragmentB来显示书籍(fragmentA有一个RecycleView) 我是否在stack/google上检查并尝试了解决方案 是的,在过去的两天里,我一直在努力解决这些问题。 有些代码很旧,有些我不知道如何在我的代码中实现它,因为我还是一个初学者 FragmentA(mangasearch)是main活动的一部分(不确定是否要查看main活动的代码) Fragment

我在两件事上有困难

  • 不知何故,我无法使我的界面
    onClickListener
    正常工作
  • 第一个问题解决后,我不知道如何启动
    fragmentB
    来显示书籍(
    fragmentA
    有一个
    RecycleView
  • 我是否在stack/google上检查并尝试了解决方案

    是的,在过去的两天里,我一直在努力解决这些问题。 有些代码很旧,有些我不知道如何在我的代码中实现它,因为我还是一个初学者

    FragmentA(mangasearch)
    main活动的一部分
    (不确定是否要查看
    main活动的代码

    FragmentB
    将是一个新的片段,按下后将被销毁并返回到
    fragmentA

    这是我的
    RecycleView

    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    
    import com.squareup.picasso.Picasso;
    
    import java.util.ArrayList;
    
    import Classes.Manga;
    
    public class MyAdapterRecyclerView extends RecyclerView.Adapter<MyAdapterRecyclerView.MyViewHolder> {
        private ArrayList<Manga> mDataSet;
        private Context context;
    
        public MyAdapterRecyclerView(ArrayList<Manga> dataSet, Context context) {
            mDataSet = dataSet;
            this.context = context;
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_item, parent, false);
            //  final RecyclerView.ViewHolder holder = new MyViewHolder(view);
    
            return new MyViewHolder(view);//, communicator);
        }
    
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            Picasso.get().load(mDataSet.get(position).getPosterPicture()).into(holder.imageviewBookCover);
            holder.tvBookTitle.setText("This is book nr: " + position + " and title " + mDataSet.get(position).getTitle());
        }
    
        @Override
        public int getItemCount() {
            return mDataSet.size();
        }
    
    
        private static OnMangaBookClickListener onMangaBookClickListener;
    
        public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            public ImageView imageviewBookCover;
            public TextView tvBookTitle;
            OnMangaBookClickListener onMangaBookClickListener;
    
            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                imageviewBookCover = itemView.findViewById(R.id.imageView_bookcover);
                tvBookTitle = itemView.findViewById(R.id.textView_booktitle);
    
                itemView.setOnClickListener((View.OnClickListener) onMangaBookClickListener);
            }
    
            @Override
            public void onClick(View view) {
                onMangaBookClickListener.onMangaBookClick(getAdapterPosition(), view);
            }
        }
    
        public void setOnMangaBookClickListener(OnMangaBookClickListener onMangaBookClickListener) {
            MyAdapterRecyclerView.onMangaBookClickListener = onMangaBookClickListener;
        }
    
        public interface OnMangaBookClickListener {
            void onMangaBookClick(int position, View view);
        }
    }
    

    对于onClickListener,您可以在适配器中创建一个接口,让片段实现它,并将其传递给适配器构造函数f.e

    public class MyAdapterRecyclerView extends RecyclerView.Adapter<MyAdapterRecyclerView.MyViewHolder> {
    ......
        OnItemInteractListener mListner;
        public MyAdapterRecyclerView(ArrayList<Manga> dataSet, OnItemInteractListener listener){
        this.mListner = listener;
        ......
        // your adapter code
        public interface OnItemInteractListener{
            void onItemInteract(int position);
        }
    }
    
    这基本上就是适配器和片段之间的通信方式 每当用户单击某个项目时,您都会在适配器中使用该mListener变量 听用户点击的简单方法是在onBindViewHolder方法中 使用

    所以你的最终代码应该是这样的 MyAdapterRecyclView

    public class MyAdapterRecyclerView extends RecyclerView.Adapter<MyAdapterRecyclerView.MyViewHolder> {
    private ArrayList<Manga> mDataSet;
    private Context context;
    OnMangaBookClickListener mListener;
    public MyAdapterRecyclerView(ArrayList<Manga> dataSet, OnMangaBookClickListener listener) {
        mDataSet = dataSet;
        this.mListener = listener;
    }
    
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_item, parent, false);
        //  final RecyclerView.ViewHolder holder = new MyViewHolder(view);
        this.context = parent.getContext();
        return new MyViewHolder(view);//, communicator);
    }
    
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
        Picasso.get().load(mDataSet.get(position).getPosterPicture()).into(holder.imageviewBookCover);
        holder.tvBookTitle.setText("This is book nr: " + position + " and title " + mDataSet.get(position).getTitle());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onMangaBookClick(position);
            }
        });
    }
    
    @Override
    public int getItemCount() {
        return mDataSet.size();
    }
    
    
    private static OnMangaBookClickListener onMangaBookClickListener;
    
    public static class MyViewHolder extends RecyclerView.ViewHolder  {
        public ImageView imageviewBookCover;
        public TextView tvBookTitle;
        
        public View itemView;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            this.itemView = itemView;
            imageviewBookCover = itemView.findViewById(R.id.imageView_bookcover);
            tvBookTitle = itemView.findViewById(R.id.textView_booktitle);
    
        }
    
    }
    
    public interface OnMangaBookClickListener {
        void onMangaBookClick(int position);
        }
    }
    


    将此添加到片段

    中,但onClick从未被调用,toast中的What消息从未显示……我以为你说过你解决了问题,正如你所写的那样(在我解决了第一个问题之后):DD好的,我会更改我的答案,并标记为答案,如果它对你有帮助;)这意味着当我解决这个问题时,我会遇到问题2:我找到你了:DD你正在使用一种奇怪的方法来实现onClickListener如果我修复你的方法或给你演示更简单的方法,应该比idk容易得多:D请演示/教我简单的方法,因为我完全迷路了:D
    public class MangasSearchFragment extends Fragment implements MyAdapterRecyclerView.OnItemInteractListener{
    // this will automatically ask you to override the onItemIteract method where you'll display your toast or open your fragment 
    ....
    // your fragment code 
    mAdapter = new MyAdapterRecyclerView(mangaTempList, this); // pass the listener to adapter using this 
    
    viewHolder.YourView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mListener.onItemInteract(position);
                }
            }
    
    public class MyAdapterRecyclerView extends RecyclerView.Adapter<MyAdapterRecyclerView.MyViewHolder> {
    private ArrayList<Manga> mDataSet;
    private Context context;
    OnMangaBookClickListener mListener;
    public MyAdapterRecyclerView(ArrayList<Manga> dataSet, OnMangaBookClickListener listener) {
        mDataSet = dataSet;
        this.mListener = listener;
    }
    
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycleview_item, parent, false);
        //  final RecyclerView.ViewHolder holder = new MyViewHolder(view);
        this.context = parent.getContext();
        return new MyViewHolder(view);//, communicator);
    }
    
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
        Picasso.get().load(mDataSet.get(position).getPosterPicture()).into(holder.imageviewBookCover);
        holder.tvBookTitle.setText("This is book nr: " + position + " and title " + mDataSet.get(position).getTitle());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onMangaBookClick(position);
            }
        });
    }
    
    @Override
    public int getItemCount() {
        return mDataSet.size();
    }
    
    
    private static OnMangaBookClickListener onMangaBookClickListener;
    
    public static class MyViewHolder extends RecyclerView.ViewHolder  {
        public ImageView imageviewBookCover;
        public TextView tvBookTitle;
        
        public View itemView;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            this.itemView = itemView;
            imageviewBookCover = itemView.findViewById(R.id.imageView_bookcover);
            tvBookTitle = itemView.findViewById(R.id.textView_booktitle);
    
        }
    
    }
    
    public interface OnMangaBookClickListener {
        void onMangaBookClick(int position);
        }
    }
    
    public class MangasSearchFragment extends Fragment implements  MyAdapterRecyclerView.OnMangaBookClickListener{
    
    private RecyclerView recyclerView;
    private MyAdapterRecyclerView mAdapter;
    private RecyclerView.LayoutManager layoutManager;
    private Bundle results;
    private ArrayList<Manga> mangaTempList;
    
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_mangas_to_search, container, false);
        Context context = getActivity();
        recyclerView = view.findViewById(R.id.recyclerview_manga_book);
        mangaTempList = new JsonHandling(context).getMangaBookJson();
    
        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        recyclerView.setHasFixedSize(true);
    
        // use a linear layout manager
        layoutManager = new LinearLayoutManager(context);
        recyclerView.setLayoutManager(new GridLayoutManager(context, 3));
    
        // specify an adapter (see also next example)
        mAdapter = new MyAdapterRecyclerView(mangaTempList, this);
        recyclerView.setAdapter(mAdapter);
    
        return view;
    }
    
    @Override
    public void onMangaBookClick(int position) {
        Toast.makeText(getContext(), "item "+position, 
    
    Toast.LENGTH_SHORT).show();
        }}
    
    public class MangasSearchFragment extends Fragment implements  MyAdapterRecyclerView.OnMangaBookClickListener{
    
    private RecyclerView recyclerView;
    private MyAdapterRecyclerView mAdapter;
    private RecyclerView.LayoutManager layoutManager;
    private Bundle results;
    private ArrayList<Manga> mangaTempList;
    int containerID = 0;
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       containerID = container.getId();
       ... // your code 
     }
    @Override
    public void onMangaBookClick(int position) {
    
       Bundle bundle = new Bundle();
       bundle.putInt("position", position);
       FragmentB fragmentB = new FragmentB();
       fragmentB.setArguments(bundle);
       getActivity().getSupportFragmentManager().beginTransaction()
                 .replace(containerID, fragmentB, "FragmentB")
                 .addToBackStack(null)
                 .commit();
       }}
    
    int position =  getArguments().getInt("position");