2015-10-29 26 views
0

我试图从另一个类更新适配器的数据集,但没有任何帮助。当我从RecyclerView类中调用该方法时,它可以工作,但不能从外部调用。更新另一个类的RecyclerView数据集

private Filters dataFilters = new Filters(); 
private HomeSpinnerHandler homeSpinnerHandler = new HomeSpinnerHandler(this); 
private RecyclerView mRecyclerView; 
private RecyclerView.Adapter mHomeAdapter; 
private RecyclerView.LayoutManager mLayoutManager; 
private static Context context; 
private SwipeRefreshLayout mSwipeRefreshLayout; 
private View rootView; 
private String homeCompanySelection = null; 
private static final String objectTypeProductString = "Product"; 
private static MaterialDialog dialogHome; 
private FloatingActionButton fabHome; 
private View viewHome; 
private MaterialSpinner spinnerHomeCompany; 
private static boolean filterIsCalled = false; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    rootView = inflater.inflate(R.layout.home_layout, null); 
    mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.home_refresh); 
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.home_recycler_view); 
    spinnerHomeCompany = (MaterialSpinner) rootView.findViewById(R.id.spinnerHomeCompany); 
    viewHome = rootView.findViewById(R.id.sheetHome); 
    context = container.getContext(); 
    fabHome = (FloatingActionButton) rootView.findViewById(R.id.fabhome); 
    dialogHome = new MaterialDialog(context); 
    mRecyclerView.setHasFixedSize(false); 
    mLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    mHomeAdapter = new RecyclerViewHomeAdapter(dataFilters.getAllHomeDataSet()); 

    PreCachingLayoutManager layoutManager = new PreCachingLayoutManager(getActivity()); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    layoutManager.setSmoothScrollbarEnabled(true); 

    mRecyclerView.setLayoutManager(layoutManager); 
    mRecyclerView.setAdapter(mHomeAdapter); 
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      updateView(); 
      mSwipeRefreshLayout.setRefreshing(false); 
     } 
    }); 
    homeSpinnerHandler.addItemsOnCompanySpinner(); 
    spinnerHomeCompany.setOnItemSelectedListener(homeSpinnerHandler); 

    fabHome.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      viewHome.setVisibility(View.VISIBLE); 
      if (viewHome != null) { 
       ViewGroup parent = (ViewGroup) viewHome.getParent(); 
       if (parent != null) { 
        parent.removeView(viewHome); 
       } 
      } 
      dialogHome.setView(viewHome).setPositiveButton("ΑΝΑΖΗΤΗΣΗ", new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        companyFilter(); 
        dialogHome.dismiss(); 
        viewHome.setVisibility(View.GONE); 
       } 
      }).setNegativeButton("ΑΚΥΡΩΣΗ", new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        dialogHome.dismiss(); 
        viewHome.setVisibility(View.GONE); 
       } 
      }); 
      dialogHome.show(); 
     } 
    }); 

    return rootView; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    ((RecyclerViewHomeAdapter) mHomeAdapter).setOnItemClickListener(new RecyclerViewHomeAdapter.MyClickListener() { 
     @Override 
     public void onItemClick(int position, View v, int id, String objectType) { 

      if (objectType.contains(objectTypeProductString)) { 
       ((MainActivity) getActivity()).onProductItemClick(id); 
      } else { 
       ((MainActivity) getActivity()).onPostItemClick(id); 
      } 
     } 
    }); 
} 

public boolean onBackPressed() 
{ 
    if (filterIsCalled){ 
     Toast.makeText(context,"dsdsd",Toast.LENGTH_SHORT).show(); 
     updateView(); 
     filterIsCalled = false; 
    } else 
     return true; 
    return false; 
} 

public void companyFilter() { 
    homeSpinnerHandler.addItemsOnCompanySpinner(); 
    mHomeAdapter = new RecyclerViewHomeAdapter(dataFilters.getFilteredHomeDataSet(homeCompanySelection)); 
    mRecyclerView.setAdapter(mHomeAdapter); 
    filterIsCalled = true; 
} 

public void updateView() { 
    mHomeAdapter = new RecyclerViewHomeAdapter(dataFilters.getAllHomeDataSet()); 
    mRecyclerView.setAdapter(mHomeAdapter); 
} 


public Context getContext() { 
    return context; 
} 

public void setHomeCompanySelection(String homeCompanySelection) { 
    this.homeCompanySelection = homeCompanySelection; 
} 

public MaterialSpinner getSpinnerHomeCompany() { 
    return spinnerHomeCompany; 
} 

从其他类我创建一个实例

HomeFragment homeFragment = new HomeFragment(); 

,并调用类的方法。

homeFragment.updateView(); 

我也试过使用静态变量,但没有再次成功。

回答

0

请勿将其设为静态或创建homeFragment的新实例。

尝试将mHomeAdapter传递给新类并在那里更新它。你也不应该做一个新的适配器。在你的适配器中创建一个像这样的方法:

public void changeData(Data data) { 
     mData = data; 
     notifyDataSetChanged(); 
    } 

然后调用它来更改数据。

更好的是你可以startActivityForResult()并且不传递你的适配器,或者你可以在HomeFragment中创建一个广播接收器来更新适配器。

+0

确定传递mHomeAdapter很简单,但我如何通知适配器数据已更改或更新。目前,我正在使用带有抽屉的MainActivity调用的选项卡片段。抽屉的一个选择是从服务器更新数据,但是它是从MainActivity调用的。如何在不创建适配器的新实例的情况下调用dataFilters.getAllHomeDataSet()。每次我尝试使用notifyDataSetChanged时,它都没有用处。 一个好的解决方案是创建一个广播接收器,这样我就可以用一次调用更新所有标签片段的适配器。 – larrougOs