【问题标题】:android - I want to send data from recyclerview adapter from fragment to fragment opening new fragmentandroid - 我想将数据从 recyclerview 适配器从片段发送到片段以打开新片段
【发布时间】:2017-12-14 05:36:38
【问题描述】:

我想将数据从RecyclerView 适配器发送到新的Fragment。我成功了,但是为什么在之前的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();



    }

}

}

【问题讨论】:

  • 从代码中我可以看到你有一个HomeFragment、一个HomeRecyclerView (and an adapter) 和一个HomeDetailFragment。您还希望当单击回收器视图中的项目时 HomeDetailFragment 应该打开片段,对吗?
  • 是的。你是绝对正确的。但是我在为 detailfragment 打开新片段时遇到问题,结果高于 homefragment
  • 为 HomeDetailFragment 和 HomeFragment 的父布局分配背景颜色
  • 大声笑。你说得对,我应该只是改变背景颜色哈哈哈哈????

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


【解决方案1】:

解决方案一:

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

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

这是来自 android 开发者文档的简短说明,用于 Providing Proper Back Navigation

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

解决方案 2:

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

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

这有一定的优势,比如您不必处理 fragmentManager 或 Fragment backStack。在您的情况下,它很容易实现。

【讨论】:

  • 在我尝试使用 HomeDetailActivity 之前,我同意你的看法。但我正在进步,因为它覆盖了底部导航视图。感谢您的关注,使用fragment让我足够。
【解决方案2】:

你只需要在点击recycler view item时打开一个新的fragment。我说的对吗?

【讨论】:

  • 是的。我已经做到了,就像打开一个新片段一样。但为什么会有这样的结果?这是因为我实例化了底部导航视图而烦恼吗?
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多