RecyclerView作为替代Listview的最佳选择,用户可以通过修改Manager使它变成GrdiView和Listview以及实现瀑布流的效果。
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dip"
android:layout_marginRight="16dip"
android:layout_marginTop="5dip">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"> </android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
以上的xml代码将RecyclerView嵌套在了系统刷新控件中。免去了自定义刷新的烦恼。
而在Activity代码中,一定要设置它的Manager.
//设置LayoutManager
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
//GridViewManager
//RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), 3);
//瀑布流Manager
//RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(3, OrientationHelper.VERTICAL);
recycler.setLayoutManager(layoutManager);
因为RecyclerView没有实现条目点击事件,所以我们需要在Adapter适配器中定义接口实现该方法:
/**
* 数据适配器
*/
public class ClassAdapter extends RecyclerView.Adapter<ClassAdapter.ClassViewHolder> {
//数据源
private ArrayList<HashMap<String, Object>> list;
private OnRecyclerViewItemClickListener mListener = null;
//定义接口
public interface OnRecyclerViewItemClickListener {
void onItemClick(View view, int position);
}
//构造函数
public ClassAdapter(ArrayList<HashMap<String, Object>> list) {
this.list = list;
}
@Override
public ClassViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_class, null);
ClassViewHolder holder = new ClassViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ClassViewHolder holder, final int position) {
holder.tvClassName.setText(list.get(position).get("name").toString());
//条目点击监听实现方法,自己定义条目点击接口,通过在onBindViewHolder()方法中获得position,从而获得条目的item位置.
if (mListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(v, position);
}
});
}
}
@Override
public int getItemCount() {
return list.size();
}
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
this.mListener = listener;
}
class ClassViewHolder extends RecyclerView.ViewHolder {
private TextView tvClassName;
public ClassViewHolder(View itemView) {
super(itemView);
tvClassName = (TextView) itemView.findViewById(R.id.tv_class_names);
}
}
}
至此我们就可以在Activity代码中通过调用Adapter的setOnItemClickListener();实现条目点击了。
linearAdapter.setOnItemClickListener(new LinearAdapter.OnRecyclerViewItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(getActivity(), lists.get(position), Toast.LENGTH_LONG).show();
}
});