Android - 在片段更新中将项目添加到listview

时间:2015-04-16 09:45:50

标签: android list listview android-fragments

已经坚持了一段时间。

我目前有3个片段,每个片段包含列表 - A | B | C(收藏)

A和B从在线检索数据,C是离线收藏列表。

当用户在A中收藏某些内容时,它会立即显示在收藏夹列表中,因为ViewPageAdapter会在屏幕上加载1个额外页面。所以A | B已经加载了,这意味着当我去收藏夹(C)时它必须重新加载。

我的问题是 - 当我在B中喜欢某些内容时,应用程序拒绝重新加载收藏夹(C),因为当我点击B时已经加载了C,并且查看我添加的内容的唯一方法是刷新应用程序。

我试过了:

  • 更改setOffscreenPageLimit();到0所以它必须每次重新加载每个片段 - 即使笨拙只是为了看它工作,它仍然拒绝。

  • NotifyDataSetChanged也没有用,或者我听不懂。

  • ViewPageAdapter中的InstatiateItem,但无法正常工作,无法找到理解它的好例子

  • 在收藏代码中创建一个新的listadapter,试图让它加载新数据 - 我可以在日志中看到它添加到收藏夹列表但是它没有被ViewPageAdapter重新加载

  • 很多谷歌搜索

无论我做什么,当用户从B转到C时,没有新的代码运行,因为当我点击B并且它直接进入C列表时C的代码全部运行,会发生什么。

我正在使用Google的SlidingTabLayout和SlidingTabStrip来处理所有正常工作的片段,其中没有任何变化。在这里找到 - https://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabLayout.html

代码:

 public void favourite()
{
    //if the user wants to favourite
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Favourite");
    //queries the id from the local data store in-case they have already favourited
    query.whereEqualTo("id",id);
    query.fromLocalDatastore();
    query.getFirstInBackground(new GetCallback<ParseObject>() {
        public void done(ParseObject object, ParseException e)
        {
            if(object!=null)
            {
                Toast.makeText(getApplicationContext(),"You have already pinned this",Toast.LENGTH_SHORT).show();
            }
            else
            {
                //otherwise create a new ParseObject and save the id,title and backdrop to
                //the local datastore
                final ParseObject favouriteShow = new ParseObject("FavouriteShow");
                favouriteShow.put("id", id);
                favouriteShow.put("title", title);
                favouriteShow.put("backdrop", backdropPath);
                favouriteShow.pinInBackground();
                Toast.makeText(getApplicationContext(),"Pinned - "+ title,Toast.LENGTH_SHORT).show();
                //need to set favourite as null for it to redraw with the favourited icon
                mFavourite.setImageDrawable(null);
                mFavourite.setImageResource(R.drawable.favourited_already);
            }
        }
    });
}

ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

CharSequence Titles[];
int tabNumber;

public ViewPagerAdapter(FragmentManager fm, CharSequence[] mTitles, int mTabNumber) {
    super(fm);
    this.Titles = mTitles;
    this.tabNumber = mTabNumber;
}

@Override
public Fragment getItem(final int position) {
    Fragment fragment = null;
    switch (position) {
        case 0:
            fragment = new FragmentA();
            break;
        case 1:
            fragment = new FragmentB();
            break;
        case 2:
            fragment = new FavouritesFragmentC();
            break;
    }
    return fragment;
}

@Override
public CharSequence getPageTitle(int position) {
    return Titles[position];
}

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

}

非常感谢你的帮助。

亚当

2 个答案:

答案 0 :(得分:1)

使用ViewPager.OnPageChangeListener并更新相应的 使用回调模式在onPageSelected(position)方法中进行片段化。

答案 1 :(得分:0)

我个人也遇到过类似的问题。

此问题的解决方案取决于每个选项卡中显示的数据是否与上下文相关。

如果不是,解决此问题的最佳方法实际上是更改应用程序的导航结构。因此,您应该使用导航抽屉而不是标签。因此,每次用户通过抽屉进入屏幕时,都会重新创建片段。通过这样做,它将解决您的问题并改善用户体验。

如果是这样,您可能需要创建所有要继承的选项卡的基本片段,使用名为refresh的函数,然后您可以要求适配器刷新所有选项卡。这种方法非常黑客,主要是因为收藏夹部分不属于标签。