使用asynctask时,数据不会添加到arraylist中

时间:2018-01-15 07:52:53

标签: android database android-fragments arraylist android-recyclerview

我是android开发的新手。我正在开发一个从服务器获取数据的应用程序。它工作正常但滞后于设备屏幕,因为它在UI线程中工作。所以我使用asynctask获取数据并在recyclerview中显示它但不显示数据。请帮助我谢谢:)

代码:-in oncreateView()

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_frag_news, container, false);
        list=new ArrayList<>();
        dlist=new ArrayList<>();
        new DataLoader().execute();
        recyclerView=view.findViewById(R.id.newsrecycler);
        recyclerView.setHasFixedSize(true);
        recyclerAdapter=new DisplayRecyclerAdapter(list,dlist,getContext());
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(recyclerAdapter );
        recyclerAdapter.notifyDataSetChanged();

    return view;
}

和我的异步任务类

  public class DataLoader extends AsyncTask{
   @Override
   protected void onPreExecute() {
       super.onPreExecute();
       pDialog = new ProgressDialog(getActivity());
       pDialog.setMessage("Please wait...");
       pDialog.setIndeterminate(false);
       pDialog.setCancelable(false);
       pDialog.show();
   }

   @Override
   protected Object doInBackground(Object[] objects) {
       myConnection=new MyConnection();
       connection=myConnection.DatabaseConncetion1();
       list.clear();
       dlist.clear();
       try {
           statement = connection.createStatement();
           resultSet = statement.executeQuery("select title,[desc] from events order by E_ID  desc;");
           while (resultSet.next()) {
               list.add(resultSet.getString("title"));
               dlist.add(resultSet.getString("desc"));
           }

       } catch (SQLException e) {
           e.printStackTrace();
       }
       return null;
   }
       @Override
   protected void onPostExecute(Object o) {
       super.onPostExecute(o);
       pDialog.dismiss();
            }

}

  @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    new DataLoader().execute();
}

2 个答案:

答案 0 :(得分:1)

setDialogCancelable(真);

不要使用adapter.notifidatasetchanged();在第一个时间

答案 1 :(得分:0)

删除notifyDataSetChanged()

中的onCreateView()
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_frag_news, container, false);
        list=new ArrayList<>();
        dlist=new ArrayList<>();
        new DataLoader().execute();
        recyclerView=view.findViewById(R.id.newsrecycler);
        recyclerView.setHasFixedSize(true);
        recyclerAdapter=new DisplayRecyclerAdapter(list,dlist,getContext());
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(recyclerAdapter );
        //recyclerAdapter.notifyDataSetChanged(); not required

    return view;
}

AsyncTask完成执行后,通知适配器数据已更改。只需在notifyDataSetChanged()中为此{

}致电onPostExecute()

 @Override
   protected void onPostExecute(Object o) {
       super.onPostExecute(o);
       pDialog.dismiss();
       recyclerAdapter.notifyDataSetChanged();
   }