簡體   English   中英

單擊recyclerView項目時,將對象從一個片段傳遞到另一個片段

[英]Pass Object from one fragment to another fragment when recyclerView item is clicked

我的MainActivity包含4個片段。 所有片段都是回收者視圖,但3包含詳細信息片段。 我在下面的類中實現了回收站視圖單擊偵聽器。

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;

    public interface OnItemClickListener {
        public void onItemClick(View view, int position);    
        public void onLongItemClick(View view, int position);
    }

    GestureDetector mGestureDetector;

    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && mListener != null) {
                    mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
            return true;
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {}

    @Override
    public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
}

在我的系列片段中,我像這樣實現

recyclerView.addOnItemTouchListener(
    new RecyclerItemClickListener(getContext(), recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            mListener.onSeriesSelected(series, position);
            Series series = seriesList.get(position);
            Toast.makeText(getContext(), series.getTitle() + " " + series.getId() + " is selected!", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onLongItemClick(View view, int position) {}
}));

現在,我想在單擊recyclerView時打開SeriesDetail片段,然后將該回收器視圖的Series對象傳遞給SeriesDetail片段。

我讀到Series模型必須實現在IntelliJ插件的幫助下實現的Parcelable,並且我需要在Series片段中實現接口。

public interface onSeriesSelectedListener {
    void onSeriesSelected(Series series, int position);
}

並在我喜歡的片段中覆蓋onAttach方法

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    // This makes sure that the container activity has implemented
    // the listener interface. If not, it throws an exception
    if (context instanceof onSeriesSelectedListener) {
        mListener = (onSeriesSelectedListener) context;
    } else {
        throw new ClassCastException(context.toString()
 + " must implement onSeriesSelectedListener");
    }
}

最后,重寫我這樣做的MainActivity中的接口

@Override
public void onSeriesSelected(Series series, int position) {
    Fragment fragment = new SeriesDetailFragment();
    Bundle bundle = new Bundle();
    fragment.setArguments(bundle);
    bundle.putParcelable("seriesDetail", series);
    fragment.setArguments(bundle);
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.fragment_container, fragment)
        .addToBackStack(null)
        .commit();
}

現在,在SeriesDetail片段的onCreate方法中,我應該像這樣訪問Parcelable對象

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = this.getArguments();
    if (bundle != null) {
        Series series = bundle.getParcelable("seriesDetail");
        if (series != null) {
            Toast.makeText(getContext(), series.getTitle() + " is selected!", Toast.LENGTH_LONG).show();
            Log.e("Series", "Title:" + series.getTitle());
        }
    }
}

但是,目前我還沒有得到目標。 我做錯了什么? 請幫我!!! 我已經在這里待了幾個小時了。 謝謝

    recyclerView.addOnItemTouchListener (new RecyclerItemClickListener(getContext(), 
     recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        Series series = seriesList.get(position);  
        mListener.onSeriesSelected(series, position);                      
    }

    @Override
    public void onLongItemClick(View view, int position) {}
    }));

偵聽器在無法獲得系列位置之前觸發,從而使MainActivity中的Series為空。 謝謝您的幫助。

暫無
暫無

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

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