android listview 刷新不流畅

xiaocao83 2014-09-11 10:33:18
想请教一下android的问题,listview控件加载了数据,用代码实际向下拉刷新,刷新后会在listview控件顶部添加一些新的数据,然后位置再定位到顶部,但有一个问题,数据刷新后会先显示到底部,然后再定位顶部,这样就一点也不流畅了,大家知道怎么解决吗?谢谢。
...全文
228 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
老科达 2014-09-15
  • 打赏
  • 举报
回复
mDataArrays.add(0,entityck); irefresh++; System.out.println("位置 :"+lv1.getFirstVisiblePosition()); mAdapter.notifyDataSetChanged(); 你的代码中 是加一条就notify下data? getViewType 是针对有复杂Item的listView的适配扩展。基本上可以满足聊天列表的需求。
xiaocao83 2014-09-13
  • 打赏
  • 举报
回复
引用 5 楼 davidleen29 的回复:
1 利用adapter getViewType方法 实现你要的布局。(看源代码或者相关demo) 2 listView smoothScrollToPosition 这个方法 应该能比较流畅点的显示你要的效果。
而你说的这个方法smoothScrollToPosition,我看是滚动的一个功能,不管这个滚动是否流畅,前一步会先跳到底部就不对了。。 谢谢。。
xiaocao83 2014-09-13
  • 打赏
  • 举报
回复
也就是说,如果我不使用lv1.setSelection(4);,那么刷新之后listview就直接跳到底部了,而不是停留在上面。 这个怎么办?
xiaocao83 2014-09-13
  • 打赏
  • 举报
回复
多谢解答, 1、你说的是使用adapter时应该用if (convertView == null) {...convertView.setTag(viewHolder);} //else {convertView.getTag();}这种方法对吗?改为这种方式之后也不行。 2、方法2还没有使用,但实际不是刷新是否流畅的问题,我这个是类QQ聊天的界面,手指从上往下拉时需要从服务器把之前聊天记录加载进来,加载进来之后使用mAdapter.notifyDataSetChanged();更新listview,就在更新时会先跳到listview的底部,然后再回到上面了(我使用lv1.setSelection(4);方法加到顶部第5条记录)。如果不更新,数据就会错乱。。 有什么办法吗?谢谢。
老科达 2014-09-12
  • 打赏
  • 举报
回复
1 利用adapter getViewType方法 实现你要的布局。(看源代码或者相关demo) 2 listView smoothScrollToPosition 这个方法 应该能比较流畅点的显示你要的效果。
哎,真难 2014-09-12
  • 打赏
  • 举报
回复
控件有点多,操作起来是会有点不流畅
xiaocao83 2014-09-11
  • 打赏
  • 举报
回复
再附上adapter的代码。 /** * 消息ListView的Adapter * * @author way */ public class ChatMsgViewAdapter extends BaseAdapter { private List<ChatMsgEntity> coll;// 消息对象数组 private LayoutInflater mInflater; public ChatMsgViewAdapter(Context context, List<ChatMsgEntity> coll) { this.coll = coll; mInflater = LayoutInflater.from(context); } public int getCount() { return coll.size(); } public Object getItem(int position) { return coll.get(position); } public long getItemId(int position) { return position; } //这种实现方法效率不高,实际应该用if (convertView == null) {...convertView.setTag(viewHolder);} //else {convertView.getTag();}这种方法,但这种方法我暂时实现不了聊天对话框的左右切换。 public View getView(int position, View convertView, ViewGroup parent) { System.out.println("hec:getView " + position + " " + convertView); ChatMsgEntity entity = coll.get(position); boolean isComMsg = entity.getMsgType(); if (true==isComMsg) System.out.print("isComMsg is true --> 左 "); else System.out.print("isComMsg is false --> 右 "); ViewHolder viewHolder = null; viewHolder = new ViewHolder(); if (isComMsg) convertView = mInflater.inflate(R.layout.chatting_item_msg_text_left, null); else convertView = mInflater.inflate(R.layout.chatting_item_msg_text_right, null); viewHolder.tvUserName = (TextView) convertView.findViewById(R.id.tv_username); viewHolder.tvUserName.setText(entity.getName()); viewHolder.tvContent = (TextView) convertView .findViewById(R.id.tv_chatcontent); viewHolder.tvSendTime = (TextView) convertView .findViewById(R.id.tv_sendtime); viewHolder.tvContent.setText(entity.getMessage()); viewHolder.tvSendTime.setText(entity.getDate()); //如果传入的时间为空,则把时间控件隐藏 if (null==entity.getDate()) viewHolder.tvSendTime.setVisibility(View.GONE); System.out.println("hec:text " + entity.getMessage()); return convertView; } static class ViewHolder { public TextView tvSendTime; public TextView tvUserName; public TextView tvContent; public ImageView icon; public boolean isComMsg = true; } }
xiaocao83 2014-09-11
  • 打赏
  • 举报
回复
附代码。。帮忙看一下,,谢谢。。 //对于历史消息的抽取是从后往前抽取的,所以每次取的消息都需要放到堆栈的底部,而不能直接add(entityck). mDataArrays.add(0,entityck); irefresh++; System.out.println("位置 :"+lv1.getFirstVisiblePosition()); mAdapter.notifyDataSetChanged(); lv1.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub lv1.setSelection(4); }});
xiaocao83 2014-09-11
  • 打赏
  • 举报
回复
补充,举例说明一下,例如listview上现在从上往下分别是6、7、8、9、10五个数字,用手指往下拉一下,把1、2、3、4、5加载到列表数据项里,然后刷新,刷新之后我想要的效果是界面上显示5、6、7、8、9就可以了,但实际变为两次刷新,第一次显示了6、7、8、9、10,然后再变更为5、6、7、8、9。。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧