在Fragment外部执行adapter.notifyDataSetChanged()

时间:2013-01-18 06:56:34

标签: android listview adapter

我有一个片段是数据库值列表。我正在使用ListView将值显示在屏幕上。

我有另一个片段,其中包含用于向数据库添加条目的按钮。所以我的问题是,当我通过点击第一个片段上的按钮向数据库添加条目时,我需要第二个片段(或应用程序中的第二个页面)来更新屏幕上显示的数据库值列表

这是数据库列表片段:

public class FragManage extends Fragment {

private PunchesDataSource datasource;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

    datasource = new PunchesDataSource(getActivity());
    datasource.open();

    List<Punch> values = datasource.getAllPunches();

    // Use the SimpleCursorAdapter to show the elements in a ListView
    ArrayAdapter<Punch> adapter = new ArrayAdapter<Punch>(getActivity(),
        android.R.layout.simple_list_item_1, values);

    View myFragmentView = inflater.inflate(R.layout.fragment_manage, container, false);

    ListView list = (ListView) myFragmentView.findViewById(R.id.list);
    list.setAdapter(adapter);

    return myFragmentView;
    }
}

所以我只想在包含按钮的其他片段中执行adapter.notifyDataSetChanged()(类似这样):

    // Punch OUT button.
    Button out_button = (Button) myFragmentView.findViewById(R.id.out_button);
    out_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            datasource.createPunch("out-" + getTime());

            FragManage.adapter.notifyDataSetChanged();
        }
      });

2 个答案:

答案 0 :(得分:2)

您可以使用具有更新片段的主要活动的侦听器

在带按钮的frag中添加这些

private void onDBChanged(){
    OnDBListener.DBChanged(true);
}

public void setOnDBListener(OnDBListener listener){
    this.OnDBListener = listener;
}

public interface OnDBListener{
    public void DBChanged(boolean DB_Bool);
}

然后在DB frag

public void update(){
    adapter.notifyDataSetChanged();
}

然后将侦听器附加到创建frags

的Main活动中
ButtonsFragment.setOnDBListener(new OnDBListener() {
    @Override
    public void DBChanged(boolean DB_Bool) {

        DatabaseViewFrag.update();
    }
});

在按钮片段调用

中更新数据库时
onDBChanged() 

告诉它已更新的所有内容

答案 1 :(得分:1)

为了从FragA进行通信 - &gt; MainActivity - &gt; FragB 直接到一个方法(在FragB内)不能是静态的,这个解决方案应该适合你。

它如何运作:http://android-er.blogspot.com/2012/06/communication-between-fragments-in.html

我在MainActivity.java中添加的代码:

String FragManage;

public void setTabFragManage(String t){
    FragManage = t;
}

public String getTabFragManage(){
 return FragManage;
}

我在FragPunch.java中添加的代码

public void onClick(View v) {

...

String TabOfFragManage = ((MainActivity)getActivity()).getTabFragManage();

FragManage fm = (FragManage)getActivity()
    .getSupportFragmentManager()
    .findFragmentByTag(TabOfFragManage);

fm.update(); //This is what is NOT possible before, but now is.
}

我在FragManage.java中添加的代码

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    ...
    String myTag = getTag();

        ((MainActivity)getActivity()).setTabFragManage(myTag);
    ...
    }