如何从片段A刷新片段B?

时间:2017-08-30 03:06:47

标签: android android-fragments tabs

我有一个Activity包含两个显示为两个标签的片段,标签1是片段A,标签2是片段B.标签1显示所有项目的列表,标签2显示最喜欢的列表。当我在选项卡1中选择一个项目并单击"添加到收藏夹"时,此项目将插入到SQLite数据库中,选项卡2将显示此数据库中的数据。

问题是在我去参加此活动的同时会加载两个标签,在我添加到收藏夹"之后,这个项目将不会显示在标签2中,直到我回去打开这个再次活动。在我点击"添加到收藏夹"之后,有没有在选项卡2中刷新列表?在标签1中。

我不擅长英语,希望这个问题能够清楚地告诉你。谢谢。

7 个答案:

答案 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
    }

}