我将应用程序的所有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
。
答案 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的事件总线,可以生成有意义的方法,这些方法可能很容易理解。