单击列表视图上的项目片段后如何刷新数据

时间:2019-02-26 04:35:10

标签: java android

我有两个fragments都是AFragment和BFragment。 AFragment有一个ListView。 BFragment具有TexviewButton。当用户单击putString上的项目时,Afragment会将片段和ListView更改为BFragment。 BFragment从Afragment获取了数据,并将日期显示为TextView。我该怎么办?

the sample like that

3 个答案:

答案 0 :(得分:1)

您可以使用库https://github.com/greenrobot/EventBus。非常简单!!!

EventBus分3步

定义事件:

 public static class MessageEvent { /* Additional fields if needed */ }

准备订阅者:声明和注释您的订阅方法,可以选择指定线程模式:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

注册和注销您的订户。例如,在Android上,活动和片段通常应根据其生命周期进行注册:

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

 @Override
 public void onStop() {
 super.onStop();
 EventBus.getDefault().unregister(this);
 }

发布事件:

 EventBus.getDefault().post(new MessageEvent());

答案 1 :(得分:0)

您可以同时使用InterfaceLocalBroadcastReceiver来刷新片段。 创建一个LocalBroadcastReceiver

LocalBroadcastManager.getInstance(context).registerReceiver(refreshFragment ,
            new IntentFilter("refreshFragment"));

及其在BFragment中的方法

private BroadcastReceiver refreshFragment = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // Do The Changes You Want To Refresh BFragment

    }
};

并且在LocalBroadcastReceiver的AFragment按钮事件中调用此OnClick

    Intent intent =new Intent("refreshFragment");

    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

答案 2 :(得分:0)

您可以通过以下方法来执行此操作,而无需使用外部库:

假设您有一个MainActivity,它托管两个片段FragmetA(具有ListView)和FragmentB(具有TextView)

这是完整的场景:

  1. 创建一个接口@ FragmentB,MainActivity将使用该接口知道何时选择了列表项
  2. MainActivity将通过重写onAttachFramemnt()并实现此接口来注册FragmentA的侦听器
  3. 当用户从FragmentA中选择列表项时; FragmentB将触发回调返回MainActivity
  4. MainActivity将把触发器转发到FragmentB中的公共方法,该方法用于将TextView的文本设置为当前项目。

代码如下:

1。布局

1.1 activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/fragment_b"
        android:name="com.example.android.sendingdatafromfragmenta_to_fragmentb.FragmentB"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <fragment
        android:id="@+id/fragment_a"
        android:name="com.example.android.sendingdatafromfragmenta_to_fragmentb.FragmentA"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

1.2fragment_a

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

1.3fragment_b

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvSelectedItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="No Item selected" />

</LinearLayout>

2。 Java

2.1 MainActivity

public class MainActivity extends AppCompatActivity implements FragmentA.OnListItemClickListener {

    private static final String LOG_TAG = "LOG_TAG";
    private FragmentB mFragmentB;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // inflating fragment B from xml
        mFragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.fragment_b);

    }


    @Override
    public void onAttachFragment(Fragment fragment) {
        Log.i(LOG_TAG, "onAttachFragment");
        super.onAttachFragment(fragment);
        if (fragment instanceof FragmentA) {
            ((FragmentA) fragment).setOnListItemClickListener(this);
        }

    }

    @Override
    public void onListItemClick(String selectedITem) {
        mFragmentB.setSelectedITemText(selectedITem);
    }
}

2.2 FragmentA

public class FragmentA extends Fragment {

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

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

        final String[] data = {"item 1", "item 2", "item 3", "item 4", "item 5"};

        ListView listView = view.findViewById(R.id.listView);

        ArrayAdapter adapter = new ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, data);

        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (mOnListItemClickListener != null) {
                    mOnListItemClickListener.onListItemClick(data[position]);
                }
            }
        });

        return view;
    }

    interface OnListItemClickListener {
        void onListItemClick(String selectedITem);
    }

    OnListItemClickListener mOnListItemClickListener;

    public void setOnListItemClickListener(OnListItemClickListener listener) {
        mOnListItemClickListener = listener;
    }
}

2.3 FragmentB

public class FragmentB extends Fragment {

    View view;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_b, container, false);
        return view;
    }

    public void setSelectedITemText(String text) {
        TextView selectedItemTextView = view.findViewById(R.id.tvSelectedItem);
        selectedItemTextView.setText(text);
    }
}

结果

enter image description here

enter image description here