Android 在一个片段中更新RecyclerView,在另一个片段中单击按钮

Android 在一个片段中更新RecyclerView,在另一个片段中单击按钮,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,有两个片段,PointCoordinates和PointslistFragment。PointCoodrinates将输入作为用户提供的点名称和x、y坐标。当用户单击PointCoordinates中的save按钮时,PointsListFragment中的recyclerview应该更新 我已经创建了一个界面,其中包含了点列表的addpoint和点的getcount方法。此接口在PointslistFragment中实现。并为pointsList创建了和适配器。我被从一个片段到另一个片段的连接

有两个片段,PointCoordinates和PointslistFragment。PointCoodrinates将输入作为用户提供的点名称和x、y坐标。当用户单击PointCoordinates中的save按钮时,PointsListFragment中的recyclerview应该更新

我已经创建了一个界面,其中包含了点列表的addpoint和点的getcount方法。此接口在PointslistFragment中实现。并为pointsList创建了和适配器。我被从一个片段到另一个片段的连接传输是如何发生的,以及何时应该调用notifyDataChanged()

接口:

public interface IPointOperations {
    public void addPoint(Point point);
    public int getPointCount();
}
PointsListFragment:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        pointListAdapter = new PointListAdapter(pointList);
        View view = inflater.inflate(R.layout.fragment_points_list, container, false);
        RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        setListener(this);
        recyclerView.setAdapter(pointListAdapter);
        return view;
    }

    @Override
    public void addPoint(Point point) {
        pointsList.add(point);
        pointListAdapter.notifyDataSetChanged();
    }

    @Override
    public int getPointCount() {
        return pointList.size();
    }
package com.example.myapplication;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

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

import java.util.ArrayList;
import java.util.List;

public class PointslistFragment extends Fragment {

    private RecyclerView recyclerView;
    private RecyclerView.Adapter pointListAdapter;
    private RecyclerView.LayoutManager layoutManager;
    private List<Point> pointList = new ArrayList<>();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.points_list_fragment, container, false);

        recyclerView = view.findViewById(R.id.recycler_view);

        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

        pointListAdapter = new PointListAdapter(pointList);
        recyclerView.setAdapter(pointListAdapter);

        return view;
    }

    @Override
    public void onResume() {
        super.onResume();

        Bundle bundle = this.getArguments();
        if (bundle != null) {
            Log.d("sss", "a " + bundle.toString());

            if (bundle.getSerializable("point") != null){
                Point newPoint = (Point) bundle.getSerializable("point");
                pointList.add(newPoint);
                pointListAdapter.notifyDataSetChanged();
            }

            this.getArguments().remove("point");
        }

    }

    @Override
    public void onStop() {
        super.onStop();
    }
}
点坐标:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_point_coordinates, container, false);
        e1 = view.findViewById(R.id.xValue);
        e2 = view.findViewById(R.id.yValue);
        e3 = view.findViewById(R.id.name);
        button = view.findViewById(R.id.enterButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                double x = Double.parseDouble(e1.getText().toString());
                double y = Double.parseDouble(e2.getText().toString());
                String name = e3.getText().toString();
                point = new Point(x, y, name);
                iPointOperations.addPoint(point);
            }
        });
        return view;
    }

    public void setListener(IPointOperations iPointOperations){
        this.iPointOperations = iPointOperations;
    }
package com.example.myapplication;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class PointCoordinates extends Fragment {

    private EditText e1, e2, e3;
    private Button button;
    private Point point;
    private CallbackPointCoordinates callbackPointCoordinates;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.point_coordinates, container, false);

        e1 = view.findViewById(R.id.xValue);
        e2 = view.findViewById(R.id.yValue);
        e3 = view.findViewById(R.id.name);
        button = view.findViewById(R.id.enterButton);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                double x = Double.parseDouble(e1.getText().toString());
                double y = Double.parseDouble(e2.getText().toString());
                String name = e3.getText().toString();
                point = new Point(x, y, name);
                callbackPointCoordinates.getPoint(point);
            }
        });
    }

    public interface CallbackPointCoordinates{

        void getPoint(Point point);

    }

    public void setListener(CallbackPointCoordinates callbackPointCoordinates){
        this.callbackPointCoordinates = callbackPointCoordinates;
    }
}
您可以为此使用,只需创建一个如下所示的类

public class ExampleEvent {
Object object

public ExampleEvent (Object object) { // object is whatever data you want to pass
       this.object=object;
   }

public Object getData(){
      return object;
    }
}
@Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }
注册和取消注册事件,如下所示

public class ExampleEvent {
Object object

public ExampleEvent (Object object) { // object is whatever data you want to pass
       this.object=object;
   }

public Object getData(){
      return object;
    }
}
@Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }
在按钮上发布事件,如下所示:

EventBus.getDefault().post(new ExampleEvent());
获取数据:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(ExampleEvent event) {
    Object object = event.getData();
    // here you can update adapter and notify
};

我建议在片段之间共享ViewModel。最初,视图模型实例将从作为片段容器的活动创建。然后,使用活动上下文,其他片段将观察相同的视图模型可变数据。 请参阅下面的链接


我认为您的代码不起作用,主要思想是在不知道片段的实际状态的情况下尝试将数据从一个片段传输到另一个片段。它可能导致多个NullPointerException视图无法找到。为了避免这种情况,我建议您将数据传输到您的活动中,在该活动中显示您的pointcodrinates,显示您的片段PointslistFragment。然后将点转移到它。我应该这样做:

主要内容:

点坐标:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_point_coordinates, container, false);
        e1 = view.findViewById(R.id.xValue);
        e2 = view.findViewById(R.id.yValue);
        e3 = view.findViewById(R.id.name);
        button = view.findViewById(R.id.enterButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                double x = Double.parseDouble(e1.getText().toString());
                double y = Double.parseDouble(e2.getText().toString());
                String name = e3.getText().toString();
                point = new Point(x, y, name);
                iPointOperations.addPoint(point);
            }
        });
        return view;
    }

    public void setListener(IPointOperations iPointOperations){
        this.iPointOperations = iPointOperations;
    }
package com.example.myapplication;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class PointCoordinates extends Fragment {

    private EditText e1, e2, e3;
    private Button button;
    private Point point;
    private CallbackPointCoordinates callbackPointCoordinates;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.point_coordinates, container, false);

        e1 = view.findViewById(R.id.xValue);
        e2 = view.findViewById(R.id.yValue);
        e3 = view.findViewById(R.id.name);
        button = view.findViewById(R.id.enterButton);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                double x = Double.parseDouble(e1.getText().toString());
                double y = Double.parseDouble(e2.getText().toString());
                String name = e3.getText().toString();
                point = new Point(x, y, name);
                callbackPointCoordinates.getPoint(point);
            }
        });
    }

    public interface CallbackPointCoordinates{

        void getPoint(Point point);

    }

    public void setListener(CallbackPointCoordinates callbackPointCoordinates){
        this.callbackPointCoordinates = callbackPointCoordinates;
    }
}
点列表适配器:

package com.example.myapplication;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class PointListAdapter extends RecyclerView.Adapter<PointListAdapter.PointViewHolder> {

    private List<Point> pointList;

    PointListAdapter(List<Point> pointList){
        this.pointList = pointList;
    }

    @NonNull
    @Override
    public PointViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.element_rec_view,
                parent, false);

        return new PointViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull PointViewHolder holder, int position) {

        holder.textViewE1.setText(String.valueOf(pointList.get(position).getX()));
        holder.textViewE2.setText(String.valueOf(pointList.get(position).getY()));
        holder.textViewE3.setText(String.valueOf(pointList.get(position).getName()));

    }

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

    public class PointViewHolder extends RecyclerView.ViewHolder {

        TextView textViewE1;
        TextView textViewE2;
        TextView textViewE3;

        public PointViewHolder(@NonNull View itemView) {
            super(itemView);

            textViewE1 = itemView.findViewById(R.id.el_e1);
            textViewE2 = itemView.findViewById(R.id.el_e2);
            textViewE3 = itemView.findViewById(R.id.el_e3);

        }
    }
}
package com.example.myapplication;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.recyclerview.widget.recyclerview;
导入java.util.List;
公共类PointListAdapter扩展了RecyclerView.Adapter{
私有列表点列表;
点列表适配器(列表点列表){
this.pointList=点列表;
}
@非空
@凌驾
public PointViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View View=LayoutInflater.from(parent.getContext())。充气(R.layout.element\u rec\u视图,
父母,假);
返回新的PointViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull PointViewHolder,int位置){
holder.textViewE1.setText(String.valueOf(pointList.get(position.getX());
holder.textViewE2.setText(String.valueOf(pointList.get(position.getY());
holder.textViewE3.setText(String.valueOf(pointList.get(position.getName());
}
@凌驾
public int getItemCount(){
返回pointList.size();
}
公共类PointViewHolder扩展了RecyclerView.ViewHolder{
文本视图文本视图1;
文本视图文本视图2;
文本视图文本视图3;
公共PointViewHolder(@NonNull View itemView){
超级(项目视图);
textViewE1=itemView.findViewById(R.id.el_e1);
textViewE2=itemView.findViewById(R.id.el_e2);
textViewE3=itemView.findViewById(R.id.el_e3);
}
}
}
PointslistFragment:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        pointListAdapter = new PointListAdapter(pointList);
        View view = inflater.inflate(R.layout.fragment_points_list, container, false);
        RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        setListener(this);
        recyclerView.setAdapter(pointListAdapter);
        return view;
    }

    @Override
    public void addPoint(Point point) {
        pointsList.add(point);
        pointListAdapter.notifyDataSetChanged();
    }

    @Override
    public int getPointCount() {
        return pointList.size();
    }
package com.example.myapplication;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

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

import java.util.ArrayList;
import java.util.List;

public class PointslistFragment extends Fragment {

    private RecyclerView recyclerView;
    private RecyclerView.Adapter pointListAdapter;
    private RecyclerView.LayoutManager layoutManager;
    private List<Point> pointList = new ArrayList<>();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.points_list_fragment, container, false);

        recyclerView = view.findViewById(R.id.recycler_view);

        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

        pointListAdapter = new PointListAdapter(pointList);
        recyclerView.setAdapter(pointListAdapter);

        return view;
    }

    @Override
    public void onResume() {
        super.onResume();

        Bundle bundle = this.getArguments();
        if (bundle != null) {
            Log.d("sss", "a " + bundle.toString());

            if (bundle.getSerializable("point") != null){
                Point newPoint = (Point) bundle.getSerializable("point");
                pointList.add(newPoint);
                pointListAdapter.notifyDataSetChanged();
            }

            this.getArguments().remove("point");
        }

    }

    @Override
    public void onStop() {
        super.onStop();
    }
}
package com.example.myapplication;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.recyclerview.widget.LinearLayoutManager;
导入androidx.recyclerview.widget.recyclerview;
导入java.util.ArrayList;
导入java.util.List;
公共类PointslistFragment扩展了片段{
私人回收站;
private RecyclerView.Adapter pointListAdapter;
private RecyclerView.LayoutManager LayoutManager;
private List pointList=new ArrayList();
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.points\u list\u碎片,容器,错误);
recyclerView=view.findViewById(R.id.recycler\u视图);
layoutManager=新的LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
pointListAdapter=新的pointListAdapter(pointList);
setAdapter(pointListAdapter);
返回视图;
}
@凌驾
恢复时公开作废(){
super.onResume();
Bundle=this.getArguments();
if(bundle!=null){
Log.d(“sss”,“a”+bundle.toString());
if(bundle.getSerializable(“点”)!=null){
Point newPoint=(点)bundle.getSerializable(“点”);
pointList.add(newPoint);
pointListAdapter.notifyDataSetChanged();
}
this.getArguments().remove(“点”);
}
}
@凌驾
公共void onStop(){
super.onStop();
}
}

如果你通过了代码,你就会明白一切。我尝试使用尽可能多的方法来传输数据,在这里您可以找到活动生命周期、捆绑包、接口、适配器和侦听器的用法。希望它能帮助你。如果您有问题,我会在这里回答,但请尝试自己解决。

addpoint是否打过电话?谢谢您的帮助。我已经更新了这个问题,我忘了提到PointsListFragment和PointCoordination都不共享直接父活动。嗨!如果您有不同的活动,那么您可以将数据传递给非子片段。请看这里:我从来没有见过在没有活动的情况下在两个片段之间传输数据是可能的,我对此无能为力