更改片段后如何更新listview适配器

时间:2015-01-07 23:23:55

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

我有两个片段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();

    }



**/


}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

嗯,这是我遇到的一个非常棘手的问题。 stackoverflow上有相当多的帖子在同一个问题上。我找到了这个问题的一个有效例子here.

添加哈希映射以保留已实例化的所有片段的标记。这样,从我的FragmentActivity,我可以检查片段何时是当前片段,在这种情况下,我调用片段中的onResume()方法来刷新我想要刷新的内容。

Inside FragmentPagerAdapter

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

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

然后我覆盖了instantiateItem方法,将片段的标签与位置一起保存在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。这应该可以解决问题。