如何从另一个类通知RecyclerView的DataSetChanged?

时间:2018-06-20 07:24:14

标签: java android json android-recyclerview

我将应用程序的所有API调用方法组织在一个单独的类中。因此,当我从服务器获得响应时,将其插入到Model类中。但是问题是,我无法notifyDataSetChanged()(解析所有JSON之后,解析JSON的类)。因此,我的适配器的getItemCount()值始终为0。最后recyclerView永远都没有数据。

这是我的Fragment.class

RecyclerView recyclerView;
LatestAdapter latestAdapter;
List<PostItem> latestItems;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

     // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.fragment_latest, container, false);

    // Initilize the RecyclerView and Adapter  
    recyclerView =(RecyclerView)view.findViewById(R.id.recycler_view);
    latestAdapter = new LatestAdapter(getContext(),latestItems);
    final LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(latestAdapter);

    fetchIntialPost();
} 

private void fetchIntialPost() {
    //here I make API call in another class,which is all API calling method in that class 
    ApiHelper apiHelper = new ApiHelper();
    apiHelper.fetchIntialPost();
}

这是我的ApiHelper (此类包含使用Volley的所有API调用方法)

public class ApiHelper {
   public void fetchIntialPost(){
        JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET, MY_URL ,null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d("Volley response 123",response.toString()); 

                //here I parse the response in another class
                //this class only doing JSON parsing operation 

                ItemHelper itemHelper = new ItemHelper();
                itemHelper.parseItemJsonFeed(response);
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                //  VolleyLog.d(AppController.TAG, "Error: " + error.getMessage());
            }
        }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {

                Map<String,String> headers = new HashMap<>();
                Context applicationContext = MainActivity.getContextOfApplication();

                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext);
                String apiKey = preferences.getString("apiKey","");
                headers.put("Content-Type", "application/json");
                headers.put("authorization",apiKey);
                return  headers;
            }
        };

        // Adding request to volley request queue
        AppController.getInstance().addToRequestQueue(jsonReq);
}


}

这是我的ItemHelper类(该类仅用于JSON解析)

public class ItemHelper {
private List<Item> items = new ArrayList<>();

public List<tItem> getList() {
    return items;
}

public void parseItemJsonFeed (JSONObject response){

    try {

        JSONObject jObj = response.getJSONObject("return_data");

        //here parsing all the data from the response 
        ******      

        //After all the parsing,I save it to the model 
        //here set all the data to the model
        setItemToFeedArrayList(id);

        //****** here is the problem,I can `notifyDataSetChanged()` 
        //*****For the adapter in Fragment Class
        //I cant access from this class here 

        Fragment fragment = new Fragment();
        fragment.getLatestAdapter().notifyDataSetChanged();


    } catch (JSONException e) {
        e.printStackTrace();
    }

}

private void setItemToFeedArrayList(int id ) {
    Item item = new Item();
    item.setId(id);

    //add item to the list
    items.add(item);
}

问题:

现在的问题是,我无法访问Fragment.class中的LatestAdapter对象。因此,在解析响应Json之后,我无法调用notifyDataSetChanged()

我尝试过的事情

我试图在ItemHelper类中创建如下所示的方法:

public List<tItem> getList() {
    return items;
}

在LatestAdapter中,我还创建了这样的方法:

public void setItem(List<Item> item) {
  this.latestItems = item;
  notifyDataSetChanged();
}

然后在Fragment.class中,我这样访问

ItemHelper itemHelper = new ItemHelper();
latestItems = itemHelper.getList();
latestAdapter.setPosts(latestItems);

通过上面的尝试,API调用后getItemCount()的{​​{1}}仍然为0。

所以有人请给我一个解决这个问题的提示

,或者是一种更好的解决方案,可以将所有类的API调用方法组织成一个类,所有JSON解析操作都可以归类于一个类。同时,适配器也可以LatestAdapter

3 个答案:

答案 0 :(得分:1)

您应该使用这样的回调。我会给你看一个例子:

首先,您需要一个像这样的回调接口:

df1['key'] = range(1, len(df1) + 1)
common_df = pd.merge(df1, df2, how='inner', on=['C1','C2'])
df_filter = df1[~df1['key'].isin(common_df['key'])].drop('key', axis=1)

现在在您要调用api的Api类中,像这样使用它并将此接口作为参数传递,您可以像这样调用接口方法:

public interface CallBackPresenter {
  public void success(DataModel model);

  public void showError(String error);

  public void showLoader();

  public void hideLoader();

}

现在,当您调用此方法时,它将如下所示:

public void apiCall(Parameter parameter,CallBackPresenter callBackPresenter){
  //success method
  callBackPresenter.success(datamodelObject);
  //error
  callBackPresenter.success(error);
}

希望这会有所帮助。

答案 1 :(得分:0)

更改您的体系结构是不正确的。否则,如果您不想更改。可以尝试这种方式:

public void setDataList(List<RealmSave_Data> dataList) {
        this.dataList = dataList;
    }

此适配器中的方法并从要调用的位置调用该方法,还将此列表传递给构造函数,因为它将在getCount()中初始化,它将返回该值。

答案 2 :(得分:0)

每个人都可以使用回调。 您还可以使用RxAndroid通过矿石控制来完成这项工作。

如果您发现Rx异常或难以理解,则可以使用事件总线(实际上,事件总线在某种程度上被称为反模式,但仍然可以使用它们)。

事件总线的一个很好的实现是RxBus,您也可以使用SimpleEventBus,它是另一种基于Rx的事件总线,可以生成有意义的方法,这些方法可能很容易理解。