Skip to content Skip to sidebar Skip to footer

How To Refresh The Data After Click The Item On Listview For Fragment

I have two fragments both AFragment and BFragment. The AFragment has a ListView. The BFragment has a Texview and a Button. The Afragment will change the fragment and putString to B

Solution 1:

You can use libs https://github.com/greenrobot/EventBus . very easy!!!

EventBus in 3 steps

Define events:

publicstaticclassMessageEvent { /* Additional fields if needed */ }

Prepare subscribers: Declare and annotate your subscribing method, optionally specify a thread mode:

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

Register and unregister your subscriber. For example on Android, activities and fragments should usually register according to their life cycle:

@OverridepublicvoidonStart() {
 super.onStart();
 EventBus.getDefault().register(this);
 }

 @OverridepublicvoidonStop() {
 super.onStop();
 EventBus.getDefault().unregister(this);
 }

Post events:

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

Solution 2:

You can use Interface and LocalBroadcastReceiver both for refreshing the Fragment. Create one LocalBroadcastReceiver

LocalBroadcastManager.getInstance(context).registerReceiver(refreshFragment ,
            newIntentFilter("refreshFragment"));

and its Method in BFragment

privateBroadcastReceiverrefreshFragment=newBroadcastReceiver() {
    @OverridepublicvoidonReceive(Context context, Intent intent) {

        // Do The Changes You Want To Refresh BFragment

    }
};

And Than Call This LocalBroadcastReceiver in OnClick Event of the Button in AFragment.

Intentintent=newIntent("refreshFragment");

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

Solution 3:

You can do this by below approach without using external libraries:

Assume you've a MainActivity which hosts the two fragments FragmetA (which has a ListView) and FragmentB (which has the TextView)

Here's the full scenario:

  1. Create an interface @ FragmentB which will be used by MainActivity to know when a list item is selected
  2. MainActivity will register a listener to FragmentA by overriding onAttachFramemnt() and implementing this interface
  3. When the user selects a list item from FragmentA; FragmentB will trigger the callback back to MainActivity
  4. MainActivity will forward the trigger to a public method in FragmentB which is used to set the text of the TextView to the current item.

Here is the code:

1. Layout

1.1 activity_main

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns: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"><fragmentandroid:id="@+id/fragment_b"android:name="com.example.android.sendingdatafromfragmenta_to_fragmentb.FragmentB"android:layout_width="match_parent"android:layout_height="wrap_content" /><fragmentandroid: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.2 fragment_a

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

1.3 fragment_b

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/tvSelectedItem"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="No Item selected" /></LinearLayout>

2. Java

2.1 MainActivity

publicclassMainActivityextendsAppCompatActivityimplementsFragmentA.OnListItemClickListener {

    privatestatic final StringLOG_TAG = "LOG_TAG";
    privateFragmentB mFragmentB;


    @OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

    }


    @OverridepublicvoidonAttachFragment(Fragment fragment) {
        Log.i(LOG_TAG, "onAttachFragment");
        super.onAttachFragment(fragment);
        if (fragment instanceofFragmentA) {
            ((FragmentA) fragment).setOnListItemClickListener(this);
        }

    }

    @OverridepublicvoidonListItemClick(String selectedITem) {
        mFragmentB.setSelectedITemText(selectedITem);
    }
}

2.2 FragmentA

publicclassFragmentAextendsFragment {

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

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

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

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

        ArrayAdapteradapter=newArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, data);

        listView.setAdapter(adapter);

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

        return view;
    }

    interfaceOnListItemClickListener {
        voidonListItemClick(String selectedITem);
    }

    OnListItemClickListener mOnListItemClickListener;

    publicvoidsetOnListItemClickListener(OnListItemClickListener listener) {
        mOnListItemClickListener = listener;
    }
}

2.3 FragmentB

publicclassFragmentBextendsFragment {

    View view;

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

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

Results

enter image description here

enter image description here

Post a Comment for "How To Refresh The Data After Click The Item On Listview For Fragment"