簡體   English   中英

(mainActifity)fragment --> 使用接口從列表中傳遞 object 的新片段

[英](mainActifity)fragment --> new fragment passing object from list using an interface

我在兩件事上遇到了麻煩。

  1. 不知何故,我無法讓我的界面onClickListener工作。
  2. 在我解決了第一個問題之后,我不知道如何啟動fragmentB來顯示這本書( fragmentA有一個帶有書籍的RecycleView

我是否在堆棧/谷歌上檢查並嘗試了解決方案?

是的,我做到了,在過去的兩天里一直在努力解決這些問題。 有些代碼很舊,有些我不知道如何在我的代碼中實現它,因為我還是一個初學者。

FragmentA(mangasSearch)MainActivity的一部分(不確定是否要查看MainActivity的代碼)

FragmentB將是一個新的 Fragment,當被按下時,將被銷毀並返回到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);
    }
}

這里我做了接口,所以我在fragmentA上調用它並創建FragmentB

這是fragmentA代碼

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

import Classes.JsonHandling;
import Classes.Manga;

public class MangasSearchFragment extends Fragment {

    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, context);

        mAdapter.setOnMangaBookClickListener(new MyAdapterRecyclerView.OnMangaBookClickListener() {
            @Override
            public void onMangaBookClick(int position, View view) {
                Toast.makeText(getContext(), "WHAT?!", Toast.LENGTH_SHORT).show();
            }
        });

        recyclerView.setAdapter(mAdapter);

        return view;
    }
}

好的 onClickListener 你在你的適配器中創建一個接口並讓 Fragment 實現它並將它傳遞給適配器構造函數 fe

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);
    }
}

在你的片段中

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);
            }
        }

所以你的最終代碼應該是這樣的MyAdapterRecyclerView

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);
    }
}

對於MangasSearchFragment

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();
    }}

編輯這是第二部分,在您使用 Toast 的地方使用該代碼

在 FragmentA 在 onClickLisnter 中使用它並傳遞 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;
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();
   }}

並在 FragmentB 中使用 getArguments() 來檢索數據

int position =  getArguments().getInt("position");

將此添加到片段

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM