【问题标题】:adapter does not update listview after update更新后适配器不更新列表视图
【发布时间】:2014-11-14 06:07:15
【问题描述】:

AsyncTask 更新适配器内容但不更新列表视图。所有代码都工作正常,但是当我更新我的适配器时,我的列表视图没有反映来自适配器的任何更新。我也在谷歌上搜索过这个问题,但没有找到任何合适的解决方案。它显示如下异常:-

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.

这是我的代码,请看看我应该改变什么:-

public class SearchResultScreen extends Fragment {

    ListView searchResult;
    SearchResultAdapter adapter;
    TextView total_jobs,displaying_jobs;
    int currentPage=0,threshold=10;
    ProgressDialog progress;
    JobService jobService;
    TextView load_more_jobs;
    int flag = 0;

    public SearchResultScreen(){}

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


        View rootView = inflater.inflate(R.layout.search_result_screen, container, false);
        searchResult = (ListView) rootView.findViewById(R.id.search_result);

        jobService = new JobService();

        jobService.setCurrent_page(currentPage);

        load_more_jobs = new TextView(getActivity());
        load_more_jobs.setText("Load More Jobs");
        load_more_jobs.setGravity(Gravity.CENTER_HORIZONTAL);
        load_more_jobs.setPadding(5,5,5,5);
        load_more_jobs.setBackgroundColor(Color.GRAY);


        Map params = new HashMap();
        params.put("skills", getArguments().getString("skills"));
        params.put("exp_from", getArguments().getString("exp_from"));
        params.put("exp_to", getArguments().getString("exp_to"));
        params.put("location", getArguments().getString("location"));
        params.put("func_area", getArguments().getString("functional_area"));
        params.put("start", jobService.getCurrent_page());


        total_jobs = (TextView) rootView.findViewById(R.id.total_jobs_label);
        displaying_jobs = (TextView) rootView.findViewById(R.id.displaying_jobs);
        progress = new ProgressDialog(getActivity());
        progress.setTitle("Please Wait!!");
        progress.setMessage("Wait!!");
        progress.setCancelable(false);
        progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);




        new MyAsyncTask(params, progress, searchResult, getActivity(), jobService, total_jobs, displaying_jobs, load_more_jobs, flag, adapter).execute("rest/search_jobs.rest");
        currentPage++;

        load_more_jobs.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(currentPage < jobService.getTotal_page()) {
                    jobService.setCurrent_page(currentPage);

                    Map params = new HashMap();
                    params.put("skills", getArguments().getString("skills"));
                    params.put("exp_from", getArguments().getString("exp_from"));
                    params.put("exp_to", getArguments().getString("exp_to"));
                    params.put("location", getArguments().getString("location"));
                    params.put("func_area", getArguments().getString("functional_area"));
                    params.put("start", jobService.getCurrent_page());

                    flag = 1;
                    new MyAsyncTask(params, progress, searchResult, getActivity(), jobService, total_jobs, displaying_jobs, load_more_jobs, flag, adapter).execute("rest/search_jobs.rest");

                    currentPage++;
                }
            }
        });

        searchResult.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                JobSearchModel jobs = (JobSearchModel) adapterView.getItemAtPosition(i);
                FragmentManager fragmentManager = getFragmentManager();
                Fragment search_result_screen = new SearchResultScreen();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

                JobDescription jobDescription = new JobDescription();

                Bundle args = new Bundle();
                args.putSerializable("jobs", jobs);

                jobDescription.setArguments(args);

                fragmentTransaction.replace(R.id.content_frame, jobDescription);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
                //Toast.makeText(getActivity(), "Id is : " + jobs.getJob_id(), Toast.LENGTH_LONG).show();
            }
        });



        return rootView;
    }

    static class MyAsyncTask extends AsyncTask<String, Integer, String> {

        private Map params;
        private ProgressDialog progress;
        private ListView list;
        private Activity context;
        private JobService jobService;
        private TextView total_jobs;
        private TextView displaying_jobs;
        private TextView load_more_jobs;
        private int flag;
        private SearchResultAdapter adapter;

        Object[] object_response;

        public MyAsyncTask(Map params, ProgressDialog progress, ListView searchResult, Activity context, JobService jobService, TextView total_jobs, TextView displaying_jobs, TextView load_more_jobs, int flag, SearchResultAdapter adapter) {
            this.params = params;
            this.progress = progress;
            this.list = searchResult;
            this.context = context;
            this.jobService = jobService;
            this.total_jobs = total_jobs;
            this.displaying_jobs = displaying_jobs;
            this.load_more_jobs = load_more_jobs;
            this.flag = flag;
            this.adapter = adapter;
        }

        @Override
        public void onPreExecute() {
               this.progress.show();
        }

        public void onProgressUpdate(Integer filesDownloaded) {

        }

        protected String doInBackground(String... parameters) {
            postData(parameters[0]);
            return "done";
        }

        protected void onPostExecute(String result){
                  context.runOnUiThread(new Runnable() {
                      @Override
                      public void run() {

                          if(flag == 0) {
                              adapter = new SearchResultAdapter(context, jobService.getModel(object_response));
                              list.addFooterView(load_more_jobs, null, false);
                              list.setAdapter(adapter);
                          } else {
                              adapter = new SearchResultAdapter(context, jobService.getModel(object_response));
                          }

                          total_jobs.setText(""+jobService.getTotal_jobs());
                          displaying_jobs.setText(""+jobService.displayingJobs());
                      }
                  });
                  adapter.notifyDataSetChanged();
                  this.progress.dismiss();
        }
        protected void onProgressUpdate(String progress){

        }

        public void postData(final String request) {
                    RestTemplate restTemplate = new RestTemplate();
                    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
                    object_response = restTemplate.postForObject(UtilClass.baseURL+request, params, JobSearchModel[].class);
        }
    }
}

【问题讨论】:

  • 尝试在adapter.notifyDataSetChanged();之后调用listView.invalidateViews();
  • 使用:adpater.notifyDataSetChanged();
  • 感谢 MysticMagic,list.invalidateViews();为我工作。
  • 酷。我添加为答案,因此您可以接受 :) 快乐编码。

标签: android android-fragments


【解决方案1】:

您可以在添加以下行时修复您的错误

adpater.notifyDataSetChanged();

每当列表发生变化时,您必须调用上述函数。

注意:确保在 UI 线程中调用 notifyDataSetChanged()

【讨论】:

    【解决方案2】:

    例外是:

    java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.
    

    所以你需要通知listview,适配器数据发生了变化。

    打电话

    listView.invalidateViews();
    

    就在你打电话后

    adapter.notifyDataSetChanged();
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多