从 mainactivity 刷新一个片段

Refresh a Fragment from mainactivity

我有一个 Activity,其中包含三个选项卡和三个 Fragments。第一个 Fragment 显示歌曲标题列表,第二个选项卡显示所选歌曲。歌曲的详细信息来自数据库。 我正在实现 SearchView 功能,这样无论用户输入什么搜索文本,索引中都应该只显示那些歌曲。

这与 phone 图书在我们设备中的工作方式完全相同。

我无法理解如何在搜索查询更改时刷新第一个 Fragment。 我基本上是在寻找可以调用以刷新第一个 Fragment.

的方法

下面是一种方法,您可以轻松做到。您只需要保存片段实例。就这些了。

    private class ViewPagerAdapter extends FragmentStatePagerAdapter {

    private SparseArray<Fragment> array = new SparseArray<>();

    ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {

        array.setValueAt(position, myFragment);
        return myFragment;
    }

    @Override
    public int getCount() {
        return 3;
    }

    public SparseArray<Fragment> getFragmentArray() {
        return array;
    }
}

然后从您的 activity,您可以轻松地从适配器实例中获取所有 viewpager 片段。

MyFragment fragment = (MyFragment) adapter.getFragmentArray().get(0); // get first fragment and casting it to your origin fragment

然后在该片段上创建一个方法。调用如下:

fragment.myFragmentMethod(String myData){}

祝你有愉快的一天!

根据@Prem 的建议,Android refresh a fragment list from its parent activity 在这里得到了我的答案。非常适合我。

可以通过接口实现

MainActivity.java

public class MainActivity extends Activity {

public FragmentRefreshListener getFragmentRefreshListener() {
    return fragmentRefreshListener;
}

public void setFragmentRefreshListener(FragmentRefreshListener fragmentRefreshListener) {
    this.fragmentRefreshListener = fragmentRefreshListener;
}

private FragmentRefreshListener fragmentRefreshListener;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    Button b = (Button)findViewById(R.id.btnRefreshFragment);

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(getFragmentRefreshListener()!=null){
                getFragmentRefreshListener().onRefresh();
            }
        }
    });


}


public interface FragmentRefreshListener{
    void onRefresh();
}}

MyFragment.java

public class MyFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = null; // some view

    /// Your Code


    ((MainActivity)getActivity()).setFragmentRefreshListener(new MainActivity.FragmentRefreshListener() {
        @Override
        public void onRefresh() {

            // Refresh Your Fragment
        }
    });


    return v;
}}