【问题标题】:Refresh ListView content(Database entries) on a fragment刷新片段上的 ListView 内容(数据库条目)
【发布时间】:2014-08-01 14:33:49
【问题描述】:

目前我的应用程序有两个片段,形式为两个(滑动)选项卡。 在一个片段上,用户可以将信息添加到数据库中。 在另一个片段上,ListView 显示 DB 表的内容。 如果用户添加一个新的 DB-Entry 并滑动到第二个选项卡,则 ListView 不会更新,因为我在 onCreateView() 方法中完成了所有加载。

我已经尝试使用 onResume() 方法并从我的 FragmentActivity 调用 Fragment 的“更新方法”(在 onPageSelected() 方法中)。 onResume() 永远不会被调用。 如果我从我的“更新方法”(在我的片段中)调用 getActivity(),它总是返回 null,但我需要数据库连接的活动对象。

我的片段如下所示:

public class ListFragment extends Fragment implements AdapterView.OnItemLongClickListener, OnRefreshListener{
private ListView listView;
private SpeedsArrayAdapter adapter = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View table = inflater.inflate(R.layout.fragment_list, container, false);
    listView = (ListView)table.findViewById(R.id.listViewSpeeds);

    MySQLiteHelper mSQLHelper = new MySQLiteHelper(getActivity());
    List <MichealSpeedBean> mSpeeds = mSQLHelper.getAllSpeedEntries();

    adapter = new SpeedsArrayAdapter(getActivity(),
            R.layout.list_item, mSpeeds);
    listView.setAdapter(adapter);

    listView.setOnItemLongClickListener(this);
    return table;
}

@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
    MySQLiteHelper mSQLHelper = new MySQLiteHelper(getActivity());
    MichealSpeedBean michealSpeedBean = adapter.getItem(position);
    mSQLHelper.deleteSpeedById(michealSpeedBean.getObjectId());
    adapter.remove(michealSpeedBean);

    Toast.makeText(getActivity(),
            "Entry deleted " + position, Toast.LENGTH_LONG)
            .show();
    return false;
}

@Override
public void onRefresh() {
    //getActivity Returns null here, if called form FragmentyActivity
}

我的 Fragment Activity 看起来像这样:

public class MainActivity extends FragmentActivity {
ViewPager viewPager;
TabPagerAdapter tabAdapter;
ActionBar actionBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tabAdapter = new TabPagerAdapter(getSupportFragmentManager());
    viewPager = (ViewPager)findViewById(R.id.pager);
    viewPager.setOnPageChangeListener(
            new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar = getActionBar();
                    actionBar.setSelectedNavigationItem(position);
                    if (position == 1) {
                        //Here i tried to update my list from outside of my fragment
                        ((OnRefreshListener)tabAdapter.getItem(position)).onRefresh();
                    }
                }
            }
    );
    viewPager.setAdapter(tabAdapter);
    actionBar = getActionBar();
    //Enable Tabs on Action Bar
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    ActionBar.TabListener tabListener = new ActionBar.TabListener(){
        @Override
        public void onTabReselected(android.app.ActionBar.Tab tab,
                                    FragmentTransaction ft) {
        }
        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
            viewPager.setCurrentItem(tab.getPosition());
        }
        @Override
        public void onTabUnselected(android.app.ActionBar.Tab tab,
                                    FragmentTransaction ft) {
        }};
    //Add New Tab
    actionBar.addTab(actionBar.newTab().setText("General").setTabListener(tabListener));
    actionBar.addTab(actionBar.newTab().setText("Speed entries").setTabListener(tabListener));
}

所以问题是我在哪里/如何更新我的表格内容? 提前谢谢!

【问题讨论】:

    标签: android android-fragments android-listview


    【解决方案1】:

    您可以使用以下代码:

    public class ListFragment extends Fragment
        @Override
        public void setMenuVisibility(final boolean visible) {
            super.setMenuVisibility(visible);
            if (getActivity() != null )
            {
                if (visible) {
                   // update your list, your fragment is visible now
                 }
             }
        }
    

    【讨论】:

    • 刚刚测试了一下,getActivity() 不返回null。非常感谢!
    【解决方案2】:

    你可以用这个:

    listview.invalidateViews();

    享受吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多