Android Fragments 如何使用RecyclerView适配器在两个片段之间传输数据?

9lowa7mx  于 2023-02-04  发布在  Android
关注(0)|答案(2)|浏览(141)

I tried to transfer data from View Fragment which contains RecycleView to Display Fragment... but I'm getting null Exception Error every time while using bundle
Here is my code.

Inside Adapter

public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        StringIntString ping=arrayList.get(position);
        holder.name.setText(ping.getmString());
        holder.desc.setText(ping.getnString());
        holder.num.setText(Integer.toString(ping.getmInt()));
        holder.layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Bundle bundle=new Bundle();
                bundle.putString("name", ping.getmString());
                bundle.putString("desc", ping.getnString());
                bundle.putString("num",Integer.toString(ping.getmInt()));
                DisplayFrag frag=new DisplayFrag();
                frag.setArguments(bundle);

                
                ((FragmentActivity)view.getContext()).getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.fade_in,R.anim.slide_out).replace(R.id.fragview,DisplayFrag.class,null).commit();
            }
        });

    }

Inside Display view

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        v=inflater.inflate(R.layout.fragment_viewfrag2, container, false);
        name=v.findViewById(R.id.box1);
        desc=v.findViewById(R.id.box2);
        num=v.findViewById(R.id.box3);
        Bundle bundle=this.getArguments();
      // if(bundle != null) {
           name.setText(bundle.getString("name"));
           desc.setText(bundle.getString("desc"));
           num.setText(bundle.getInt("num"));
      // }
        return v;
    }
  • Log Message*

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myapplication, PID: 31856 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference at com.example.myapplication.DisplayFrag.onCreateView(DisplayFrag.java:31) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:3104) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:524) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1899) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1817) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1760) at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:547) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
I'm expecting to transfer data from View fragment to Display fragmnet

vsaztqbk

vsaztqbk1#

出现错误"java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference"是因为bundle为空。要解决此问题,您应该在访问其值之前检查bundle是否为空,如下所示:

Bundle bundle = this.getArguments();
if (bundle != null) {
   name.setText(bundle.getString("name"));
   desc.setText(bundle.getString("desc"));
   num.setText(Integer.toString(bundle.getInt("num")));
}

在适配器中,将此行num.setText(Integer.toString(ping.getmInt()));更改为num.putString("num", Integer.toString(ping.getmInt()));

ax6ht2ek

ax6ht2ek2#

RecyclerView适配器中定义一个如下所示的新变量

MutableLiveData<String> nameMutableLiveDataString = new MutableLiveData<>();
MutableLiveData<String> descMutableLiveDataString = new MutableLiveData<>();
MutableLiveData<Integer> numMutableLiveDataString = new MutableLiveData<>();

你的onBindViewHolder看起来就像这样

public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        StringIntString ping=arrayList.get(position);
        holder.name.setText(ping.getmString());
        holder.desc.setText(ping.getnString());
        holder.num.setText(Integer.toString(ping.getmInt()));
        holder.layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                nameMutableLiveDataString.postValue(ping.getmString());
                descMutableLiveDataString.postValue(ping.getnString());
                numMutableLiveDataString.postValue(ping.getmInt());
                // Bundle bundle=new Bundle();
                // bundle.putString("name", ping.getmString());
                // bundle.putString("desc", ping.getnString());
                // bundle.putString("num",Integer.toString(ping.getmInt()));
                DisplayFrag frag=new DisplayFrag();
                // frag.setArguments(bundle);

                ((FragmentActivity)view.getContext()).getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.fade_in,R.anim.slide_out).replace(R.id.fragview,DisplayFrag.class,null).commit();
            }
        });

    }

和视图类类似于

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        v=inflater.inflate(R.layout.fragment_viewfrag2, container, false);
        name=v.findViewById(R.id.box1);
        desc=v.findViewById(R.id.box2);
        num=v.findViewById(R.id.box3);
        Bundle bundle=this.getArguments();
        // if(bundle != null) {

        recyclerviewAdapter. nameMutableLiveDataString.observe((LifecycleOwner) this, new Observer<String>()
        {
            @Override
            public void onChanged(String s)
            {
                name.setText(s);
            }
        });

        recyclerviewAdapter.descMutableLiveDataString.observe((LifecycleOwner) this, new Observer<String>()
        {
            @Override
            public void onChanged(String s)
            {
                desc.setText(s);
            }
        });

        recyclerviewAdapter.;
        numMutableLiveDataString.observe((LifecycleOwner) this, new Observer<Integer>()
        {
            @Override
            public void onChanged(Integer s)
            {
                num.setText(s.toString());
            }
        });

        // }
        return v;
    }

相关问题