android - 我想从recyclerview适配器发送数据从片段到片段打开新片段

时间:2017-12-14 05:36:38

标签: android android-fragments android-recyclerview fragment fragmenttransaction

我想将RecyclerView适配器的数据发送到新的Fragment。我成功地这样做了,但为什么是前一个片段中碰撞的结果?

至少你的注意力对我来说是非常重要和有意义的:)

如下图所示:

this is the replace result of the new fragment

我希望片段能够打开WhatsAppInstagram等新片段。

RecyclerViewAdapter.java

package com.mimdudin.carekkerje.Adapter;

import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.mimdudin.carekkerje.Activities.HomeFragment;
import com.mimdudin.carekkerje.Activities.HomeFragmentDetail;
import com.mimdudin.carekkerje.Model.Job;
import com.mimdudin.carekkerje.R;

import java.util.List;


public class HomeRecyclerViewAdapter extends RecyclerView.Adapter<HomeRecyclerViewAdapter.ViewHolder> {

    private Context context;
    private List<Job> jobList;

    public HomeRecyclerViewAdapter(Context context, List<Job> jobs){
        this.context = context;
        jobList = jobs;
    }

    @Override
    public HomeRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.home_row, parent, false);

        return new ViewHolder(view, context);
    }

    @Override
    public void onBindViewHolder(HomeRecyclerViewAdapter.ViewHolder holder, int position) {
    Job job = jobList.get(position);

    holder.title.setText(job.getTitle());
    holder.namaPerusahaan.setText(job.getNamaPerusahaan());
    holder.kriteria_1.setText(job.getKriteria_1());
    holder.kriteria_2.setText(job.getKriteria_2());
    holder.kriteria_3.setText(job.getKriteria_3());
    holder.gaji.setText(job.getGaji());
    holder.lokasi.setText(job.getLokasi());
    holder.tanggal.setText(job.getTanggal());

    String img_logoLink = job.getImg_logo();
        Glide.with(context)
                .load(img_logoLink) // URL
                .apply(new RequestOptions().placeholder(android.R.drawable.ic_dialog_info)
                                .error(android.R.drawable.ic_dialog_alert).centerCrop().dontAnimate()
//                         .centerCrop(), .crossFade(), .thumbnail(), .dontAnimate(), .dontTransform() BitmapTransformation(.circleCrop())
                )
                .into(holder.img_logo); //TARGET GAMBAR YANG NAK DIUBAH

    }

    @Override
    public int getItemCount() {
        return jobList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

         TextView title;
         TextView namaPerusahaan;
         TextView lokasi;
         TextView kriteria_1;
         TextView kriteria_2;
         TextView kriteria_3;
         TextView gaji;
         ImageView img_logo;
         TextView tanggal;


        public ViewHolder(final View itemView, final Context ctx) {
            super(itemView);
            context = ctx;
            title = itemView.findViewById(R.id.titleID);
            namaPerusahaan = itemView.findViewById(R.id.namaPerusahaanID);
            kriteria_1 = itemView.findViewById(R.id.satuTv);
            kriteria_2 = itemView.findViewById(R.id.duaTv);
            kriteria_3 = itemView.findViewById(R.id.tigaTv);
            gaji = itemView.findViewById(R.id.gajiID);
            lokasi = itemView.findViewById(R.id.lokasiID);
            img_logo = itemView.findViewById(R.id.img_logoID);
            tanggal = itemView.findViewById(R.id.tanggalID);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    HomeFragmentDetail fragmentDetail = new HomeFragmentDetail();
                    Bundle bundle = new Bundle();
                    Job job = jobList.get(getAdapterPosition());
                    bundle.putSerializable("job", job);
                    fragmentDetail.setArguments(bundle);

                    AppCompatActivity activity = (AppCompatActivity) itemView.getContext();
                    android.support.v4.app.FragmentManager fragmentManager = activity.getFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//          fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                    fragmentTransaction.replace(R.id.frame_fragmenthome, fragmentDetail);
                    fragmentTransaction.commit();

////                    Intent intent = new Intent(context, HomeDetailActivity.class);
////                    intent.putExtra("job", job);
////                    ctx.startActivity(intent);

                }
            });
        }
    }

HomeFragmentDetail.java

package com.mimdudin.carekkerje.Activities;

import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.mimdudin.carekkerje.Model.Job;
import com.mimdudin.carekkerje.R;

/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * to handle interaction events.
 */
public class HomeFragmentDetail extends Fragment {

    private TextView tvDeskripsi;
    private TextView tvIndustri;

    public HomeFragmentDetail() {
        // Required empty public constructor
    }

    public static HomeFragmentDetail newInstance(){
        HomeFragmentDetail homeFragmentDetail = new HomeFragmentDetail();
        return homeFragmentDetail;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_home_fragment_detail, container, false);
        tvDeskripsi = view.findViewById(R.id.tvDeskripsi);
        tvIndustri = view.findViewById(R.id.tvIndustri);

        Bundle bundle = getArguments();
        Job job = (Job) bundle.getSerializable("job");

        String PostID = job.getId_post();
        String titleID = job.getTitle();

        tvDeskripsi.setText(PostID);
        tvIndustri.setText(titleID);

        return view;


//    DataHolder dataholder=new DataHolder("1","TestName");
//    Bundle bundle=new Bundle();
//    bundle.putSerializable("obj",dataholder);

//    Fragment fragment=new FragmentB();
//    fragment.setArguments(bundle);
//    fragmentManager = getActivity(). getSupportFragmentManager();
//    fragmentTransaction = fragmentManager .beginTransaction();
//    fragmentTransaction.add(R.id.container, fragment);
//    fragmentTransaction.commit();

        //Job job = (Job) getIntent.getSerializableExtra("job");

//        Bundle bundle = getArguments();
//        Job job = (Job) bundle.getSerializable("job");
//        String jobID = job.getId_post();
//        String titleID = job.getTitle();



    }

}

}

2 个答案:

答案 0 :(得分:0)

您只需要在回收站视图项目上打开一个新片段。我是对的吗?

答案 1 :(得分:0)

解决方案1:

在替换HomeDetailFragment的代码中,像这样调用addToBackStack()

fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_fragmenthome, fragmentDetail);
fragmentTransaction.addToBackStack(null);    // add this line to your code
fragmentTransaction.commit();

以下是来自{+ 3}}的Android开发人员文档的简短说明。

  

当后台堆栈上有FragmentTransaction对象时   用户按下后退按钮,FragmentManager弹出最新的   从后栈交易并执行反向操作(例如   如果事务添加了片段,则删除片段。)

解决方案2:

如果没有严格要求使用片段,那么我建议使用HomeDetailActivity而不是HomeDetailFragment。

除了您将调用Activity(通过intent)而不是Fragment之外,上面的大部分代码都将保持不变。

这有一些优点,比如你不必处理fragmentManager或片段backStack。在您的情况下,它很容易实现。