2016-11-21 148 views
0

我有一个片段,它在应用程序启动时不包含任何内容,但是在加载数据之后,它应该显示加载的数据。我在加载MainActivity的函数onDataLoaded中实现了DataLoadedListener。数据加载后,函数通过函数调用(initializeAdapter())将数据(ArrayList)作为参数发送。然后,函数initializeAdapter()获取它并初始化定制的适配器(适配器是一个全局对象,在initializeAdapter()中初始化并在onCreateView()中使用)。在Android中刷新片段

我想我应该在数据加载和适配器初始化后刷新片段视图,但我不知道该怎么做。我尝试了很多方法,但没有成功。在MainActivity

onDataLoaded函数调用initializeAdapter()

@Override 
    public void onDataLoaded(List<Grad> gradovi, List<Ponuda> ponude) { 

    Spinner spinnerGradovi = (Spinner) findViewById(R.id.gradovi_spinner); 
    ArrayAdapter<String> adapterGradovi; 
    List<String> listaGradova = new ArrayList<>(); 
    ArrayList<Ponuda> ponudaArrayList = new ArrayList<Ponuda>(); 

    ponudaLista = ponude; 
    gradLista = gradovi; 

    for(Grad grad : gradovi){ 
     listaGradova.add(grad.getNaziv()); 
    } 

    for(Ponuda ponuda : ponude){ 
     ponudaArrayList.add(ponuda); 
    } 


    adapterGradovi = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, listaGradova); 

    spinnerGradovi.setAdapter(adapterGradovi); 

    Fragment fragmentGet = svePonudeFragment; 

    ((SvePonudeFragment)fragmentGet).initializeAdapter(ponudaArrayList); 
} 

,这是一个片段

public class SvePonudeFragment extends Fragment { 

private RecyclerView rv; 
RVAdapter adapter; 

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

    rv = (RecyclerView) rootView.findViewById(R.id.rv); 

    LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
    rv.setLayoutManager(llm); 

    rv.setAdapter(adapter); 

    return rootView; 
} 


public void initializeAdapter(List<Ponuda> preuzetePonude){ 

    adapter = new RVAdapter(preuzetePonude); 

    //this isn't working 
    /*FragmentManager manager = getActivity().getSupportFragmentManager(); 
    android.support.v4.app.FragmentTransaction ft = manager.beginTransaction(); 
    ft.detach(this).attach(this).commit();*/ 

    //this is not working, neither 
    Fragment frg = getFragmentManager().findFragmentByTag("sve_ponude_fragment_tag"); 
    final android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.detach(frg); 
    ft.attach(frg); 
    ft.commit(); 
} 

} 

我也有兴趣在如何在数据没有被装载做它加载一个空适配器然而?并且当数据被加载以填充另一个适配器并使用它时。

回答

0

在设置之前初始化适配器。如果你有兴趣改变你的方法,我可以给你建议:为你创建一个可以传递ArrayList的构造函数。 OnCreate或OnCreateView可以初始化适配器并将其传入。在设置适配器notifyDataChanges并检查是否有数据之后,请在传递数据和传递数据之前使用一些日志。不要直接责怪适配器或片段控制你的数据。此外,我建议你学习更多使用片段+ RecyclerView。我发布了一个例子,你可以看看,但数据加载在片段中。

public class CategoryFragment extends Fragment { 

//Class Tag 
private static final String TAG = CategoryFragment.class.getSimpleName(); 
//Fragments base context 
private Context mContext; 
//RecyclerView widget 
private RecyclerView mRecyclerView; 
//RecyclerView's Layout Manager 
private RecyclerView.LayoutManager mLayourManager; 
//RecyclerView's Adapter 
private CategoryFragmentAdapter mCategoryFragmentAdapter; 
//Category Data List 
private ArrayList<Category> mCategoryList; 
//Interface object 
onCategoryItemClick mCallBackCategory; 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    //Instantiate base context 
    mContext = context; 
    //Instantiate interface 
    mCallBackCategory = (onCategoryItemClick)getActivity(); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Instantiate Category List 
    mCategoryList = new ArrayList<Category>(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    //Custom fragment view instantiating 
    View view_fragment_category = inflater.inflate(R.layout.fragment_items, container, false); 
    //Instantiating Fragment's recycler view 
    mRecyclerView = (RecyclerView) view_fragment_category.findViewById(R.id.recycle_categories); 
    //Instantiate RecycleView's Layout Manager: LinearLayoutManager is one of the default 
    mLayourManager = new LinearLayoutManager(mContext); 
    //Setting layout manager for recycler view 
    mRecyclerView.setLayoutManager(mLayourManager); 
    //Retrieve data from server, populate the category data list and set the RecyclerView's adapter 
    getCategories(); 
    //Instantiate the adapter and push the data 
    mCategoryFragmentAdapter = new CategoryFragmentAdapter(mContext, mCategoryList); 

    //RecyclerView item click listener 
    mCategoryFragmentAdapter.SetOnItemClickListener(new CategoryFragmentAdapter.OnItemClickListener() { 

     @Override 
     public void onItemClick(View v , int position) { 
      //Test display 
      //Toast.makeText(mContext, mCategoryList.get(position).getId(),Toast.LENGTH_LONG).show(); 

      //Push to Activity method with clicked item ID 
      mCallBackCategory.proceedToProducts(mCategoryList.get(position).getId()); 

     } 
    }); 

    return view_fragment_category; 
}