解决方案 »

  1.   

    补充,举例说明一下,例如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。。
      

  2.   

    附代码。。帮忙看一下,,谢谢。。//对于历史消息的抽取是从后往前抽取的,所以每次取的消息都需要放到堆栈的底部,而不能直接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);
    }});
      

  3.   

    再附上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;
    }}
      

  4.   

    1 利用adapter  getViewType方法 实现你要的布局。(看源代码或者相关demo)
    2 listView smoothScrollToPosition   这个方法 应该能比较流畅点的显示你要的效果。
      

  5.   

    多谢解答,
    1、你说的是使用adapter时应该用if (convertView == null) {...convertView.setTag(viewHolder);}  //else {convertView.getTag();}这种方法对吗?改为这种方式之后也不行。
    2、方法2还没有使用,但实际不是刷新是否流畅的问题,我这个是类QQ聊天的界面,手指从上往下拉时需要从服务器把之前聊天记录加载进来,加载进来之后使用mAdapter.notifyDataSetChanged();更新listview,就在更新时会先跳到listview的底部,然后再回到上面了(我使用lv1.setSelection(4);方法加到顶部第5条记录)。如果不更新,数据就会错乱。。
    有什么办法吗?谢谢。
      

  6.   

    也就是说,如果我不使用lv1.setSelection(4);,那么刷新之后listview就直接跳到底部了,而不是停留在上面。
    这个怎么办?
      

  7.   


    而你说的这个方法smoothScrollToPosition,我看是滚动的一个功能,不管这个滚动是否流畅,前一步会先跳到底部就不对了。。
    谢谢。。
      

  8.   

    mDataArrays.add(0,entityck);
    irefresh++;
    System.out.println("位置 :"+lv1.getFirstVisiblePosition());
    mAdapter.notifyDataSetChanged();你的代码中 是加一条就notify下data?getViewType 是针对有复杂Item的listView的适配扩展。基本上可以满足聊天列表的需求。