Android listview加载数据后没有立即刷新的解决办法

在Android开发中,当ListView加载完从服务器获取的JSON数据后,调用Adapter.notifyDataSetChanged()未达到即时刷新效果。本文探讨了这一Android常见bug,并提出解决方案,即在数据加载完毕后立即调用notifyDataSetChanged(),而非在onPostExecute()中,以确保ListView正确更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近用到listview显示从服务器拉取回来的json数据,主要是图片和文字资源。

     Listview在加载完数据后,当我们需要ListView进行刷新的时候,我们需要调用Adapter.notifyDataSetChanged()来让界面刷新。

 在程序中我也使用了这个方法,但是依然没有加载后立即得到想要的效果。核心代码如下:

    

  <span style="font-family:Microsoft YaHei;"> HotTopicBean hotTopicBean;
   for (int i = 0; i < jsonArray.size(); i++) {
        hotTopicBean = new HotTopicBean();
        jsonObject = jsonArray.getJSONObject(i);
        hotTopicBean.setPostId(jsonObject.getLong("postId"));  //帖子ID
        hotTopicBean.setUserimgUrl(jsonObject.getString("userPic"));
        hotTopicBean.setName(jsonObject.getString("username")); //icon地址
        String date = NetworkUtils.timeStamp2Date(jsonObject.getLong("updateTime").toString(), "yyyy-MM-dd HH:mm:ss");
        Log.i("date:", date);
        hotTopicBean.setTime(date);
        hotTopicBean.setHottitle(jsonObject.getString("postTitle"));
        hotTopicBean.setContent(jsonObject.getString("postContent"));
        hotTopicBean.setFabulousnum(jsonObject.getInteger("likeCount"));
        hotTopicBean.setCommentnum(jsonObject.getInteger("commentCount"));
        Log.i("hottopicData:", hotTopicBean.getContent() + hotTopicBean.getUserimgUrl() + " 点赞数:" + hotTopicBean.getFabulousnum() + "更新时间" + hotTopicBean.getTime());
        hotTopicBeansList.add(hotTopicBean);
    }</span>
这段代码在 getHotTopicDataByVolley()方法中

       

  <span style="font-family:Microsoft YaHei;font-size:14px;"> class SocketAsyncTask extends AsyncTask<String, Void, List<HotTopicBean>> {

        @Override
        protected List<HotTopicBean> doInBackground(String... params) {
//            return getJsonData(params[0]);  原版本- 使用的伟哥的数据
            return getHotTopicDataByVolley(params[0], hotTopicBeansList); //现版本,使用伟槟的数据
        }

        @Override
        protected void onPostExecute(List<HotTopicBean> result) {
            super.onPostExecute(result);
            // onPostExecute()里面仅仅只负责通知数据改变,不要这里加入setAdapter
//            hAdapter.notifyDataSetChanged();
        }

    }</span>

之前Adapter.notifyDataSetChanged()我是卸载onPostExcute()里面。

后来我把它提到在数据加载完就立刻通知系统数据已经更新

<span style="font-family:Microsoft YaHei;font-size:14px;">for (int i = 0; i < jsonArray.size(); i++) {
        hotTopicBean = new HotTopicBean();
        jsonObject = jsonArray.getJSONObject(i);
        hotTopicBean.setPostId(jsonObject.getLong("postId"));  //帖子ID
        hotTopicBean.setUserimgUrl(jsonObject.getString("userPic"));
        hotTopicBean.setName(jsonObject.getString("username")); //icon地址
        String date = NetworkUtils.timeStamp2Date(jsonObject.getLong("updateTime").toString(), "yyyy-MM-dd HH:mm:ss");
        Log.i("date:", date);
        hotTopicBean.setTime(date);
        hotTopicBean.setHottitle(jsonObject.getString("postTitle"));
        hotTopicBean.setContent(jsonObject.getString("postContent"));
        hotTopicBean.setFabulousnum(jsonObject.getInteger("likeCount"));
        hotTopicBean.setCommentnum(jsonObject.getInteger("commentCount"));
        Log.i("hottopicData:", hotTopicBean.getContent() + hotTopicBean.getUserimgUrl() + " 点赞数:" + hotTopicBean.getFabulousnum() + "更新时间" + hotTopicBean.getTime());
        hotTopicBeansList.add(hotTopicBean);
    }</span>
<pre name="code" class="java"><span style="font-family:Microsoft YaHei;font-size:14px;">hAdapter.notifyDataSetChanged(); </span><pre name="code" class="java"><span style="font-family:Microsoft YaHei;font-size:14px;">即在getHotTopicDataByVolley()方法内部通知系统数据已经更新了,问题得到解决。</span>

 
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值