我有一个Activity包含两个显示为两个标签的片段,标签1是片段A,标签2是片段B.标签1显示所有项目的列表,标签2显示最喜欢的列表。当我在选项卡1中选择一个项目并单击"添加到收藏夹"时,此项目将插入到SQLite数据库中,选项卡2将显示此数据库中的数据。
问题是在我去参加此活动的同时会加载两个标签,在我添加到收藏夹"之后,这个项目将不会显示在标签2中,直到我回去打开这个再次活动。在我点击"添加到收藏夹"之后,有没有在选项卡2中刷新列表?在标签1中。
我不擅长英语,希望这个问题能够清楚地告诉你。谢谢。
答案 0 :(得分:0)
如何从片段A刷新片段B?
您可以使用此link在两个片段之间进行通信。它使用可观察的模式,通过包含2个片段的活动进行通信(片段A和片段B)。
如果您想要更简单的东西,可以使用Event Bus,非常容易实现。
答案 1 :(得分:0)
您可以使用 BroadcastReceiver 或通过活动传达这两个片段。
通过活动传达两个片段:
在片段A中添加项目时,可以调用Host活动中的方法,该方法将调用片段B中的方法来刷新列表。
答案 2 :(得分:0)
有一些方法。
<强> 1。通过活动
你的活动中有片段A和片段B.
您还可以在片段A和片段B中进行活动。
MainActivity.java
javascript
FragmentA.java
FragmentA A;
FragmentB B;
private void updateB(){
if(B!= null){
B.refresh();
}
}
FragmentB.java
MainActivity mainActivity;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mainActivity = getActivity();
}
private void addFavorite(){
//add item to DB
//reload Fragment A
mainActivity.updateB();
}
的 2。使用广播
FragmentB.java
MainActivity mainActivity;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mainActivity = getActivity();
}
@Override
public void onDestroyView() {
mActivity.unregisterReceiver(myReceiver);
super.onDestroyView();
}
private void refresh(){
...
}
FragmentA.java
private MyReceiver myReceiver;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter(MyReceiver.ACTION);
mActivity.registerReceiver(myReceiver, filter);
}
public class MyReceiver extends BroadcastReceiver {
public static final String ACTION = "com.xxxx.test";
public static final String TYPE_REFRESH = "TYPE_REFRESH";
@Override
public void onReceive(final Context context, final Intent intent) {
String type = intent.getStringExtra("type");
if (type.equals(TYPE_REFRESH)) {
refresh();
}
}
}
public static void sendBroadcastForRefresh(Context context) {
Intent intent = new Intent();
intent.setAction(MyReceiver.ACTION);
intent.putExtra("type", TYPE_REFRESH);
context.sendBroadcast(intent);
}
第3。重新创建片段
private void addFavorite(){
....
FragmentB.sendBroadcastForRefresh(mContext);
}
答案 3 :(得分:0)
只需覆盖onResume方法并在onResume中再次显示收藏夹,这样每次打开片段B onResume方法都会启动并刷新内容。 把它放在你的片段类中:
public class Hello
{
public static void main(String[] args) {
System.out.println("Hello Windows 10");
}
}
答案 4 :(得分:0)
您可以检查片段是否对用户可见。你可以试试这个:
{{1}}
答案 5 :(得分:0)
从A。
启动片段B时,可以调用setTargetFragment()FragmentB fragmentB = FragmentB.newInstance();
fragmentB.setTargetFragment(FragmentA.this, REQUEST_REFRESH_CODE);
getFragmentManager().beginTransaction().replace(R.id.container, fragmentB).commit();
然后当你想从B刷新片段A时,可以调用以下代码:
getTargetFragment().onActivityResult(
getTargetRequestCode(),
Activity.RESULT_OK,
new Intent()
);
并从片段A:
中的onActivityResult()方法中刷新片段@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode==REQUEST_REFRESH_CODE && resultCode==Activity.RESULT_OK) {
refreshYourFragmentHere();
}
}
答案 6 :(得分:0)
解决方案1:您可以使用 RxBus 。
解决方案2:
class YourActivity extends Activity {
AFragment a;
BFragment b;
public void c() {
//init fragment
a.setOnItemClickListener(b);
}
}
class AFragment extends Fragment {
OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
public interface OnItemClickListener {
void onClick(int position);
}
}
class BFragment extends Fragment implements AFragment.OnItemClickListener {
@Override
public void onClick(int position) {
//refresh
}
}