【问题标题】:i can't add objects to an arrayList我无法将对象添加到 arrayList
【发布时间】:2017-08-12 09:18:28
【问题描述】:

我正在尝试从服务器下载一个案例列表,然后填充一个数组列表以在我的 RecyclerView 适配器中使用它,但是每次我尝试从 asynctask 填充数组列表时,我都可以在每一步中打印数据填充的 bu 不是来自我正在使用的 Arraylist(我试图存储在一个 arrayList 中,其中包含我创建的 Case 类型的对象)

这是有问题的代码部分 这是我的异步任务... `

 public class downloadingNewCases extends AsyncTask<Void,Void ,Boolean>{
        private String userid ;
        private String state ;
        public downloadingNewCases(String userid ,String state ){
            this.userid = userid ;
            this.state = state ;
        }

@Override
protected void onPreExecute() {
    super.onPreExecute();
    Log.d(AppController.DEBUG, "download New Cases Started");
}
@Override
protected Boolean doInBackground(Void... params){
    Log.d(AppController.DEBUG , "user id in the get cases link.." + userid);
    String url = AppController.ApiUrl + "GetCases?UserName="+ userid +"&stat="+state;
    Log.d(AppController.DEBUG_LINK,url);
try {
JsonArrayRequest request = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
    @Override
    public void onResponse(JSONArray response) {
        Log.d("TEST", String.valueOf(response.length()));
        for (int i = 0; i < response.length(); i++) {
            try {
                Log.d("TEST","downloading data" );
                JSONObject object = response.getJSONObject(i);
                JSONArray specs = object.getJSONArray("Spe");
                ArrayList<Specialities> spe = new ArrayList<>();
                for (int j = 0; j < specs.length(); j++) {
                    Log.d("TEST",specs.getJSONObject(j).getString("SName") );
                    spe.add(new Specialities(null, specs.getJSONObject(j).getString("SName")));
                }
                Case ca = new Case(object.getString("ID")
                        , object.getString("Serial")
                        , object.getString("Name")
                        , object.getString("gender")
                        , object.getString("Age")
                        , object.getString("NatioanlityID")
                        , object.getString("HealthProblem")
                        , object.getString("CityID")
                        , object.getString("Problem")
                        , object.getString("Date")
                        , object.getString("Status")
                        , spe);

                Log.d("TEST",ca.toString());

                cases.add(ca);
                spe.clear();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError volleyError) {
        Log.d(AppController.DEBUG , volleyError.toString());

    }
});
request.setRetryPolicy(new DefaultRetryPolicy(
        0,
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
MySingleton.getmInstance(getActivity()).addToRequestQueue(request);

}catch (Exception e){
Log.d(AppController.DEBUG,"error in the asynctask in the  new cases freagment... ");
Log.d(AppController.DEBUG ,e.toString());
}
    Log.d(AppController.DEBUG, "Cases size ::" + cases.size());
    return true;
}
@Override
protected void onPostExecute(Boolean bool) {
    super.onPostExecute(bool);

/*    if(listener != null){
        listener.getCases(cases);
    }*/
    adapter.notifyDataSetChanged();
 //   Log.d(AppController.DEBUG, "new Cases Downloaded...");


}

} ` (我确信适配器和回收器视图代码是正确的,因为我现在可以使用相同的代码,但是当我再次测试它时它不再工作了,我不记得我是否更改了其中的某些内容- 我认为不是)..

这是我的 onViewCreate 方法。

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.doctor_new_cases_fragment,container,false);
    Log.d(AppController.DEBUG_SHARED,"userID in the new case activity ..." + userID);
    SharedPreferences prefs = getActivity().getSharedPreferences(AppController.PREFERENCES_NAME , Context.MODE_PRIVATE);
    userID = prefs.getString(DoctorProfileSubmitActivity.Shared_userid,null) ;
    downloadingNewCases tast  = new downloadingNewCases(userID ,"");
    tast.execute();

    recyclerView = (RecyclerView)view.findViewById(R.id.recyclervew_new_cases);
    adapter = new CasesAdapter(view.getContext(), cases);
    recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);

    ViewGroup parent = (ViewGroup) view.getParent();
    if (parent != null){
        parent.removeView(view);
    }
    return view;
}

最后,Array 列表被声明为类的实例变量(该类扩展了 Fragment + 它是我在视图寻呼机中用作选项卡式 Activity 的选项卡布局的片段。) 这是 ArrayList 声明

private final ArrayList<Case> cases = new ArrayList<>();

【问题讨论】:

  • 你是说 case 为 null 而你的适配器什么也没显示?
  • 你为什么要把 volley 放在 Asynctask 中?
  • @cricket_007 有问题吗?我认为最好在 AsyncTask 中实现它,这样我就不必在 UI 线程上执行那种东西 + 我也可以稍后添加我的进度条如果有更好的方法请告诉我 + 告诉我这有什么问题实施
  • Volley 不在 UI 线程上执行。您可以使用 Volley 放置一个进度对话框

标签: java android android-fragments arraylist android-asynctask


【解决方案1】:

既然你说你可以在每一步都打印数据,那么问题可能与你的数据无关。问题可能是您的案例 Arraylist 和您的 CaseAdapter。

让我们尝试一个简单的测试,而不是用案例对象填充适配器,而是创建一个新的字符串 ArrayList 并在响应中用 object.getString("name") 填充它。然后更改您的 oncreateview 以使用普通字符串数组适配器显示此名称列表。

如果您可以成功显示名称,则表示您的案例和案例适配器存在错误,您必须显示更多代码以供我们帮助。

【讨论】:

    【解决方案2】:

    对不起,立即在网站上添加问题是不值得的 我解决了这个问题。 (看来我的问题出在这里)

    Case ca = new Case(object.getString("ID")
                            , object.getString("Serial")
                            , object.getString("Name")
                            , object.getString("gender")
                            , object.getString("Age")
                            , object.getString("NatioanlityID")
                            , object.getString("HealthProblem")
                            , object.getString("CityID")
                            , object.getString("Problem")
                            , object.getString("Date")
                            , object.getString("Status")
                            , spe);
    

    我不小心把 object.getString("Gender") 改成了 object.getString("gender") 这导致了我一个 JSONException 。

    我解决了这个问题,一切都恢复正常了。

    感谢您的帮助,如果我没有先进行适当的调试会话就匆忙提出问题,我很抱歉。

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2012-04-14
      • 2011-12-24
      • 2016-09-26
      • 1970-01-01
      相关资源
      最近更新 更多