问题描述
Android的支持库22.1 昨日公布。许多新的特性被加入到V4支持库和V7,其中 android.support.v7.util.SortedList< T>
吸引我的注意。
Android Support Library 22.1 was released yesterday. Many new features were added into the v4 support library and v7, among which android.support.v7.util.SortedList<T>
draws my attention.
它说,排序列表
是一个新的数据结构,用 RecyclerView.Adapter
工作,保持了产品加入/删除/移动/更改为 RecyclerView
提供的动画。这听起来像一个名单,其中,T&GT;
在的ListView
,但似乎更先进,功能强大。
It's said that, SortedList
is a new data structure, works with RecyclerView.Adapter
, maintains the item added/deleted/moved/changed animations provided by RecyclerView
. It sounds like a List<T>
in a ListView
but seems more advanced and powerful.
那么,是什么的区别排序列表&LT; T&GT;
和名单,其中,T&GT;
?我怎么能有效地使用它?什么是强制执行排序列表&LT; T&GT;
在名单,其中,T&GT;
如果是这样吗?可能有人张贴了它的一些样品?
So, what is the difference between SortedList<T>
and List<T>
? How could I use it efficiently? What's the enforcement of SortedList<T>
over List<T>
if it is so? Could somebody post some samples of it?
任何提示或codeS将AP preciated。先谢谢了。
Any tips or codes will be appreciated. Thanks in advance.
推荐答案
排序列表
是 V7支持库
。
A 排序列表
的实施,可以保持项目的顺序,也 通知为使得它可以被绑定到一个变化列表 RecyclerView.Adapter
。
它使项目使用比较(对象,对象)
的方法排序, 使用二进制搜索来检索项目。如果排序条件您 项目可能会改变,请确保您调用适当的方法,而编辑 他们避免数据不一致。
It keeps items ordered using the compare(Object, Object)
method and uses binary search to retrieve items. If the sorting criteria of your items may change, make sure you call appropriate methods while editing them to avoid data inconsistencies.
您可以控制项目的顺序,并通过更改通知 SortedList.Callback
参数。
You can control the order of items and change notifications via the SortedList.Callback
parameter.
下面下面是使用排序列表
的样本,我认为这是你想要的,看看它和享受!
Here below is a sample of use of SortedList
, I think it is what you want, take a look at it and enjoy!
public class SortedListActivity extends ActionBarActivity {
private RecyclerView mRecyclerView;
private LinearLayoutManager mLinearLayoutManager;
private SortedListAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sorted_list_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mLinearLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLinearLayoutManager);
mAdapter = new SortedListAdapter(getLayoutInflater(),
new Item("buy milk"), new Item("wash the car"),
new Item("wash the dishes"));
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setHasFixedSize(true);
final EditText newItemTextView = (EditText) findViewById(R.id.new_item_text_view);
newItemTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == EditorInfo.IME_ACTION_DONE &&
(keyEvent == null || keyEvent.getAction() == KeyEvent.ACTION_DOWN)) {
final String text = textView.getText().toString().trim();
if (text.length() > 0) {
mAdapter.addItem(new Item(text));
}
textView.setText("");
return true;
}
return false;
}
});
}
private static class SortedListAdapter extends RecyclerView.Adapter<TodoViewHolder> {
SortedList<Item> mData;
final LayoutInflater mLayoutInflater;
public SortedListAdapter(LayoutInflater layoutInflater, Item... items) {
mLayoutInflater = layoutInflater;
mData = new SortedList<Item>(Item.class, new SortedListAdapterCallback<Item>(this) {
@Override
public int compare(Item t0, Item t1) {
if (t0.mIsDone != t1.mIsDone) {
return t0.mIsDone ? 1 : -1;
}
int txtComp = t0.mText.compareTo(t1.mText);
if (txtComp != 0) {
return txtComp;
}
if (t0.id < t1.id) {
return -1;
} else if (t0.id > t1.id) {
return 1;
}
return 0;
}
@Override
public boolean areContentsTheSame(Item oldItem,
Item newItem) {
return oldItem.mText.equals(newItem.mText);
}
@Override
public boolean areItemsTheSame(Item item1, Item item2) {
return item1.id == item2.id;
}
});
for (Item item : items) {
mData.add(item);
}
}
public void addItem(Item item) {
mData.add(item);
}
@Override
public TodoViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
return new TodoViewHolder (
mLayoutInflater.inflate(R.layout.sorted_list_item_view, parent, false)) {
@Override
void onDoneChanged(boolean isDone) {
int adapterPosition = getAdapterPosition();
if (adapterPosition == RecyclerView.NO_POSITION) {
return;
}
mBoundItem.mIsDone = isDone;
mData.recalculatePositionOfItemAt(adapterPosition);
}
};
}
@Override
public void onBindViewHolder(TodoViewHolder holder, int position) {
holder.bindTo(mData.get(position));
}
@Override
public int getItemCount() {
return mData.size();
}
}
abstract private static class TodoViewHolder extends RecyclerView.ViewHolder {
final CheckBox mCheckBox;
Item mBoundItem;
public TodoViewHolder(View itemView) {
super(itemView);
mCheckBox = (CheckBox) itemView;
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mBoundItem != null && isChecked != mBoundItem.mIsDone) {
onDoneChanged(isChecked);
}
}
});
}
public void bindTo(Item item) {
mBoundItem = item;
mCheckBox.setText(item.mText);
mCheckBox.setChecked(item.mIsDone);
}
abstract void onDoneChanged(boolean isChecked);
}
private static class Item {
String mText;
boolean mIsDone = false;
final public int id;
private static int idCounter = 0;
public Item(String text) {
id = idCounter ++;
this.mText = text;
}
}
}
这篇关于什么是排序列表&LT; T&GT;与RecyclerView.Adapter工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!