【问题标题】:How to update listview adapter after changing fragment更改片段后如何更新列表视图适配器
【发布时间】:2015-01-07 23:23:55
【问题描述】:

我有两个片段 FragmentA 和 FragmentB。当我点击 FragmentB 中的一个项目时,它会在 fragmentTransaction 中携带一些数据。

FragmentA 有一个自定义列表视图适配器,当有来自 FragmentB 的一些数据时需要更改。

问题是它没有改变。

这是片段A中的代码

public class CardsFragment extends ListFragment {

   
    protected List<CardModel> list = new ArrayList<CardModel>();
    protected ArrayAdapter<CardModel> adapter;


    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       View rootView = inflater.inflate(R.layout.fragment_cards, container,
                false);
        return rootView;
    }



    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

       
        adapter = new CardAdapter(getListView().getContext(),
                list);


      

        Bundle args = getArguments();
        if (args != null) {
          
           LoadCards(args.getString("key"), args.getString("keyId"));

        }
        else{

            LoadAllCards();
        }

    }

    private void LoadAllCards() {
      
                        /**
                        
                        query the database code
                        
                        **/

                    list.add(...);

                    if (getListView().getAdapter() == null) {

                        setListAdapter(adapter);

                    } else {
                       adapter.refill(list);

                    } 
    }


    private void LoadCards(String key, String keyId) {
      
                        /**
                        
                        query the database code
                        
                        **/

                    list.add(...);

                    if (getListView().getAdapter() != null) {

                        
                       adapter.refill(list);

                    } 
    }


/**

Refill function from adapter class

 public void refill(List<CardModel> cards){

        list.clear();
        list.addAll(cards);
        notifyDataSetChanged();

    }



**/


}

【问题讨论】:

  • 你已经注释掉了 refill(),但是,这是我推荐的代码。
  • 补充代码存在于另一个类 CardAdapter.java 中!我评论它是为了演示!

标签: android listview android-fragments android-listview android-adapter


【解决方案1】:

嗯,这是我面临的一个非常棘手的问题。关于同一问题,stackoverflow 上有很多帖子。我找到了这个问题的一个工作示例here.

添加一个hash map来保存所有已经实例化的Fragment的标签。这样,在我的 FragmentActivity 中,我可以检查 Fragment 何时是当前 Fragment,在这种情况下,我会在 Fragment 中调用 onResume() 方法来刷新我要刷新的内容。

FragmentPagerAdapter 内部

我定义了一个哈希映射来存储片段的标签

mFragmentTags = new HashMap<Integer,String>();  

然后我重写了 instantiateItem 方法,将 Fragment 的标签连同位置一起保存在 hashmap 中。

@Override  
public Object instantiateItem(ViewGroup container, int position) {  
Object obj = super.instantiateItem(container, position);  
if (obj instanceof Fragment) {  
    // record the fragment tag here.  
    Fragment f = (Fragment) obj;  
    String tag = f.getTag();  
    mFragmentTags.put(position, tag);  
}  
return obj;  
}  

另外,我创建了一个方法,它将根据位置返回先前创建的片段的标签

public Fragment getFragment(int position) {  
    String tag = mFragmentTags.get(position);  
    if (tag == null)  
        return null;  
    return mFragmentManager.findFragmentByTag(tag);  
}  

FragmentActivity 内部,onPageSelected 内部方法

Fragment fragment = ((FragmentPageAdapter)viewpager.getAdapter()).getFragment(arg0);  

if (arg0 ==1 && fragment != null)  
{  
    fragment.onResume();  
}  

在片段的 onResume 中,刷新 listView。这应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多