Android - 防止在 notifyDataSetChanged() 上滚动到底部

标签 android

我正在构建一个聊天应用程序,我需要向上滚动到加载更多数据。 但是当我调用 notifyDataSetChanged() 时,我的 ListView 会滚​​动到底部。

我的 ListView:

    <ListView
        android:id="@+id/list_messages"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:transcriptMode="alwaysScroll"
        android:stackFromBottom="true">
    </ListView>

我的BaseAdapter是这样的:

public class CompleteListAdapter extends BaseAdapter {  
      private Activity mContext;  
      private List<String> mList;  
      private LayoutInflater mLayoutInflater = null;  
      public CompleteListAdapter(Activity context, List<String> list) {  
           mContext = context;  
           mList = list;  
           mLayoutInflater = (LayoutInflater) mContext  
                     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
      }  
      @Override  
      public int getCount() {  
           return mList.size();  
      }  
      @Override  
      public Object getItem(int pos) {  
           return mList.get(pos);  
      }  
      @Override  
      public long getItemId(int position) {  
           return position;  
      }  
      @Override  
      public View getView(int position, View convertView, ViewGroup parent) {  
           View v = convertView;  
           CompleteListViewHolder viewHolder;  
           if (convertView == null) {  
                LayoutInflater li = (LayoutInflater) mContext  
                          .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
                v = li.inflate(R.layout.list_layout, null);  
                viewHolder = new CompleteListViewHolder(v);  
                v.setTag(viewHolder);  
           } else {  
                viewHolder = (CompleteListViewHolder) v.getTag();  
           }  
           viewHolder.mTVItem.setText(mList.get(position));  
           return v;  
      }    }    class CompleteListViewHolder {  
      public TextView mTVItem;  
      public CompleteListViewHolder(View base) {  
           mTVItem = (TextView) base.findViewById(R.id.listTV);  
      }    
}

如何防止列表滚动到底部?

最佳答案

这很简单!只需将 ListView 上的 transcriptMode 更改为 normal

<ListView
    android:id="@+id/list_messages"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:transcriptMode="normal"
    android:stackFromBottom="true">
</ListView>

并按住 List 的第一项以获取它在 notifyDataSetChanged() 之后的位置

// Get last item object
Item itemPlaceHolder = itemsList.get(0);

//  {  Retrieve new items here  }

adapter.notifyDataSetChanged(); // <-- Update the adapter

// Get position of the item
int index = itemsList.indexOf(itemPlaceHolder);

list_view.clearFocus(); 
list_view.setFocusable(true);

// Set position of the scroll
list_view.setSelection(index + 1);

瞧!

关于Android - 防止在 notifyDataSetChanged() 上滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824983/

相关文章:

java - 将复选框添加到 ListView 中

java - 应用程序似乎在闪屏后以横向模式启动不止一次?

android - 从 Delphi 调用 JNI_OnLoad

android - 我如何克服这个问题 : ANDROID_SUPPORT_V4_VERSION in phonegap build

android - 如何停止卡住listView

android - 从 RecyclerView 中删除行

android - 尝试调用虚拟方法'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData

android - RecycleView 回收无法正常工作

android - Kotlin:如何使用 Anko DSL 制作工具栏菜单?

android - 如何在Android gradle中使用嵌套依赖?