android listview 刷新不流畅 androidlistview刷新 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 补充,举例说明一下,例如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。。 附代码。。帮忙看一下,,谢谢。。//对于历史消息的抽取是从后往前抽取的,所以每次取的消息都需要放到堆栈的底部,而不能直接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); }}); 再附上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; }} 1 利用adapter getViewType方法 实现你要的布局。(看源代码或者相关demo)2 listView smoothScrollToPosition 这个方法 应该能比较流畅点的显示你要的效果。 多谢解答,1、你说的是使用adapter时应该用if (convertView == null) {...convertView.setTag(viewHolder);} //else {convertView.getTag();}这种方法对吗?改为这种方式之后也不行。2、方法2还没有使用,但实际不是刷新是否流畅的问题,我这个是类QQ聊天的界面,手指从上往下拉时需要从服务器把之前聊天记录加载进来,加载进来之后使用mAdapter.notifyDataSetChanged();更新listview,就在更新时会先跳到listview的底部,然后再回到上面了(我使用lv1.setSelection(4);方法加到顶部第5条记录)。如果不更新,数据就会错乱。。有什么办法吗?谢谢。 也就是说,如果我不使用lv1.setSelection(4);,那么刷新之后listview就直接跳到底部了,而不是停留在上面。这个怎么办? 而你说的这个方法smoothScrollToPosition,我看是滚动的一个功能,不管这个滚动是否流畅,前一步会先跳到底部就不对了。。谢谢。。 mDataArrays.add(0,entityck);irefresh++;System.out.println("位置 :"+lv1.getFirstVisiblePosition());mAdapter.notifyDataSetChanged();你的代码中 是加一条就notify下data?getViewType 是针对有复杂Item的listView的适配扩展。基本上可以满足聊天列表的需求。 接收短信遇到中文乱码的问题? android引用javamail发送Email一些问题 android 更新和恢复出厂设置的api 是什么? 如何给android系统的平板电脑开发软件,如何搭建开发平台? 如何保护apk里的图文资源(assets)? 求助,请问这个页面怎么实现的? 问题很深奥,以致不知道如何起这个标题。求大牛们来看看。 IntelliJ IDEA 13.1.1 配置好后运行无法运行模拟器 哥哥姐姐们求解惑。。。。 怎么办 SurfaceView问题 如何获取ListView的Item的高度
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);
}});
* 消息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;
}}
2 listView smoothScrollToPosition 这个方法 应该能比较流畅点的显示你要的效果。
1、你说的是使用adapter时应该用if (convertView == null) {...convertView.setTag(viewHolder);} //else {convertView.getTag();}这种方法对吗?改为这种方式之后也不行。
2、方法2还没有使用,但实际不是刷新是否流畅的问题,我这个是类QQ聊天的界面,手指从上往下拉时需要从服务器把之前聊天记录加载进来,加载进来之后使用mAdapter.notifyDataSetChanged();更新listview,就在更新时会先跳到listview的底部,然后再回到上面了(我使用lv1.setSelection(4);方法加到顶部第5条记录)。如果不更新,数据就会错乱。。
有什么办法吗?谢谢。
这个怎么办?
而你说的这个方法smoothScrollToPosition,我看是滚动的一个功能,不管这个滚动是否流畅,前一步会先跳到底部就不对了。。
谢谢。。
irefresh++;
System.out.println("位置 :"+lv1.getFirstVisiblePosition());
mAdapter.notifyDataSetChanged();你的代码中 是加一条就notify下data?getViewType 是针对有复杂Item的listView的适配扩展。基本上可以满足聊天列表的需求。