现在,安卓开发者用RecyclerView替代了以前的ListView或GridView。RecyclerView控件是更高级和灵活的ListView版本。这个控件是显示大数据集的容器,只维持有限数量的view就可以高效地滚动。
遗憾的是,不像之前ListView那样,Google并没有给我们提供一个默认的Recycler View Adapter类来继承。我首先将讨论Recycer View Adapter,它可以轻松的将对象列表绑定到你的RecyclerView上。
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public abstract class RecyclerViewArrayAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH>
{
private final List<T> items;
public void bindData(final List<T> items)
{
this.items = items;
this.notifyDataSetChanged();
}
public final T getItem(final int position)
{
return this.items.get(position);
}
public List<T> getItems()
{
return items;
}
@Override
public int getItemCount()
{
return this.items != null
? this.items.size()
: 0;
}
@Override
public final void onBindViewHolder(final VH holder, final int position)
{
final T item = this.getItem(position);
this.onBindViewHolder(holder, item);
}
public abstract void onBindViewHolder(final VH holder, final T item);
}
这个类不难理解,也不包含大量的逻辑,而且它可以避免重复实现包含一个简单列表的Adapter类。
下面代码中你可以找到一个简单的Adapter,这个Adapter用来向一个RecyclerView中显示搜索结果。
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
public class SearchResultsAdapter extends RecyclerViewArrayAdapter<SearchResult, SearchResultsAdapter.SearchResultViewHolder>
implements View.OnClickListener
{
private final LayoutInflater layoutInflater;
private OnItemClickListener onItemClickListener;
public SearchResultsAdapter(final Context context)
{
super();
this.layoutInflater = LayoutInflater.from(context);
}
public void setOnItemClickListener(final OnItemClickListener onItemClickListener)
{
this.onItemClickListener = onItemClickListener;
}
@Override
public SearchResultViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType)
{
final View view = this.layoutInflater.inflate(R.layout.listitem_search, parent, false);
view.setOnClickListener(this);
return new SearchResultViewHolder(view);
}
@Override
public void onBindViewHolder(final SearchResultViewHolder holder, final SearchResult item)
{
holder.bindData(item);
}
/*
* View.OnClickListener
*/
@Override
public void onClick(final View view)
{
if (this.onItemClickListener != null)
{
final RecyclerView recyclerView = (RecyclerView) view.getParent();
final int position = recyclerView.getChildLayoutPosition(view);
if (position != RecyclerView.NO_POSITION)
{
final SearchResult item = this.getItem(position);
this.onItemClickListener.onItemClicked(item);
}
}
}
public static class SearchResultViewHolder extends RecyclerView.ViewHolder
{
@Bind(R.id.textview_name)
TextView textViewName;
public SearchResultViewHolder(final View itemView)
{
super(itemView);
ButterKnife.bind(this, itemView);
}
public void bindData(final SearchResult item)
{
this.textViewName.setText(item.getName());
}
}
public interface OnItemClickListener
{
void onItemClicked(SearchResult item);
}
}