【问题标题】:Refreshing fragment in AndroidAndroid中的刷新片段
【发布时间】:2016-11-21 21:52:58
【问题描述】:

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

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

MainActivity中调用initializeAdapter()的onDataLoaded函数

    @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();
}

}

我也对如何制作一个空的适配器感兴趣,如果数据还没有加载,它会加载?并且在加载数据时填写另一个适配器并使用它。

【问题讨论】:

    标签: java android android-fragments fragment adapter


    【解决方案1】:

    在设置之前初始化适配器。如果你有兴趣改变你的方法,我可以给出建议:为你的片段创建一个构造函数,你可以传递 ArrayList。 OnCreate 或 OnCreateView 您可以初始化适配器并将列表传递到其中。在设置适配器 notifyDataChanges 并检查是否有数据后,请在传递数据时和传递数据之前使用一些 Logs。不要直接责怪适配器或片段控制你的数据。此外,我建议您使用 Fragments + 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;
    }
    

    【讨论】:

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