我正在构建聊天应用程序,我需要向上滚动到加载更多数据。
但是当我呼叫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);
}
}
如何防止列表滚动到底?
答案 0 :(得分:9)
这很容易!只需将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);
瞧!