【问题标题】:data is not added in arraylist while using asynctask使用 asynctask 时未将数据添加到数组列表中
【发布时间】:2018-06-23 20:09:54
【问题描述】:

我是 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();
}

【问题讨论】:

  • 我只想从 mssql 数据库中获取数据。请告诉我该怎么做。谢谢
  • 您正在为 doInBg 中的列表添加值,因此在 PostExecute() 上,只需调用此 ,adapter.notifyDataSetChanged() ,
  • 感谢@notTdar 它的工作,但进度对话框没有关闭
  • if(pDialog!= null &&pDialog.isShowing()){ pDialog.dismiss(); },并从 onCreate 中删除 notifyDataSetChanged() 因为没有添加任何内容,仅在有新数据/或一些更改时使用
  • 好的兄弟谢谢..我会这样做

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


【解决方案1】:

setDialogCancelable(true);

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

【讨论】:

    【解决方案2】:

    删除onCreateView()中的notifyDataSetChanged()

    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 执行完成后通知适配器数据发生了变化。只需为此在onPostExecute() 中调用notifyDataSetChanged() 即可

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2020-10-01
      • 2021-12-03
      • 1970-01-01
      • 2023-04-02
      • 2016-08-16
      • 2012-11-05
      相关资源
      最近更新 更多