How To Refresh The Data After Click The Item On Listview For Fragment
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:
- Create an interface @
FragmentB
which will be used byMainActivity
to know when a list item is selected MainActivity
will register a listener toFragmentA
by overridingonAttachFramemnt()
and implementing this interface- When the user selects a list item from
FragmentA
;FragmentB
will trigger the callback back toMainActivity
MainActivity
will forward the trigger to a public method inFragmentB
which is used to set the text of theTextView
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
Post a Comment for "How To Refresh The Data After Click The Item On Listview For Fragment"