Android网格布局实现--recyclerview
2018-01-16 15:14
746 查看
接上一篇内容,使用RecyclerView实现;
<android.support.v7.widget.RecyclerView
android:id="@+id/rvGrid"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_marginRight="30px"
android:layout_marginTop="20px"
android:layout_weight="1"
android:splitMotionEvents="false" />
java代码:
mPhotoWallRecyclerView.setLayoutManager(mSGLM);
mPhotoWallRecyclerView.setHasFixedSize(true);
mPhotoWallRecyclerView.addOnScrollListener(mOnScrollListener);
mPhotoWallAdapter = new PhotoWallAdapter2(mCtx, null);
mPhotoWallAdapter.setAddrCardListener(mAddrCardListener);
// Set the RecyclerView's Adapter
mPhotoWallRecyclerView.setAdapter(mPhotoWallAdapter);
适配器代码
public class PhotoWallAdapter2 extends RecyclerView.Adapter<PhotoWallAdapter2.MyViewHolder> {
private ArrayList<CardAddrItem> mDataset;
private List<Integer> mHeights;
private AddrCardListener mListener;
private DisplayImageOptions options;
public PhotoWallAdapter2(Context context, ArrayList<CardAddrItem> myDataset) {
if (myDataset == null)
this.mDataset = new ArrayList<CardAddrItem>();
else
this.mDataset = myDataset;
options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
}
public void getRandomHeight() {
mHeights = new ArrayList<Integer>();
int min = 252;
for (int i = 0; i < mDataset.size(); i++) {
//随机的获取一个范围为200-600直接的高度
String name = mDataset.get(i).getName();
int w = (name.length() + 1) * 24 + 36;
int ww = Math.max(min, w);
mHeights.add(ww);
}
}
public void setAddrCardListener(AddrCardListener listener) {
mListener = listener;
}
private void setAdapterListener(MyViewHolder holder) {
if (mListener == null) return;
if (holder.tvTitle.getVisibility() == View.GONE) {
return;
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyViewHolder holder = (MyViewHolder) v.getTag();
final int position = holder.getLayoutPosition();
notifyItemChanged(position);
mListener.onAddrItemClick(position);
}
});
holder.itemView.setTag(holder);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new view by inflating the row item xml.
final View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.photo_card_cell2, parent, false);
MyViewHolder holder = new MyViewHolder(v);
setAdapterListener(holder);
return holder;
}
public void addData(List<CardAddrItem> datalist) {
if ((datalist != null) && (datalist.size() > 0)) {
mDataset.clear();
notifyDataSetChanged();
mDataset.addAll(getItemCount(), datalist);
getRandomHeight();
notifyItemChanged(0);
notifyDataSetChanged();
}
}
public ArrayList<CardAddrItem> getData() {
return mDataset;
}
public CardAddrItem getItem(int position) {
return (mDataset != null && position >= 0 && position < mDataset.size()) ?
mDataset.get(position) : null;
}
@Override
public int getItemCount() {
return (mDataset == null) ? 0 : mDataset.size();
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
CardAddrItem map = mDataset.get(position);
holder.tvTitle.setText(map.getName().trim());
holder.tvTitle.setVisibility(View.VISIBLE);
holder.tvAddress.setText(map.getAddress().trim());
holder.tvAddress.setVisibility(View.VISIBLE);
String url = map.getUrl();
holder.ivPhoto.setTag(holder.spinner);
holder.ivPhoto.setScaleType(ImageView.ScaleType.CENTER_CROP);
ImageLoader.getInstance().displayImage(url, holder.ivPhoto, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
holder.spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
Toast.makeText(view.getContext(), message, Toast.LENGTH_SHORT).show();
holder.spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
holder.spinner.setVisibility(View.GONE);
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
holder.spinner.setProgress(Math.round(100.0f * current / total));
}
});
}
/**
* Create a ViewHolder to represent your cell layout
* and data element structure
*/
public static class MyViewHolder extends RecyclerView.ViewHolder {
ImageView ivPhoto;
TextView tvTitle;
TextView tvAddress;
View llCardBack;
ProgressBar spinner;
public MyViewHolder(View itemView) {
super(itemView);
ivPhoto = (ImageView) itemView.findViewById(R.id.photo);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvAddress = (TextView) itemView.findViewById(R.id.tvAddress);
llCardBack = itemView.findViewById(R.id.llCardBack);
spinner = (ProgressBar) itemView.findViewById(R.id.loading);
}
}
public interface AddrCardListener {
void onAddrItemClick(int position);
void onAddrNaviClick(int position);
void onAddrCollClick(int position);
}
<android.support.v7.widget.RecyclerView
android:id="@+id/rvGrid"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_marginRight="30px"
android:layout_marginTop="20px"
android:layout_weight="1"
android:splitMotionEvents="false" />
java代码:
mPhotoWallRecyclerView.setLayoutManager(mSGLM);
mPhotoWallRecyclerView.setHasFixedSize(true);
mPhotoWallRecyclerView.addOnScrollListener(mOnScrollListener);
mPhotoWallAdapter = new PhotoWallAdapter2(mCtx, null);
mPhotoWallAdapter.setAddrCardListener(mAddrCardListener);
// Set the RecyclerView's Adapter
mPhotoWallRecyclerView.setAdapter(mPhotoWallAdapter);
适配器代码
public class PhotoWallAdapter2 extends RecyclerView.Adapter<PhotoWallAdapter2.MyViewHolder> {
private ArrayList<CardAddrItem> mDataset;
private List<Integer> mHeights;
private AddrCardListener mListener;
private DisplayImageOptions options;
public PhotoWallAdapter2(Context context, ArrayList<CardAddrItem> myDataset) {
if (myDataset == null)
this.mDataset = new ArrayList<CardAddrItem>();
else
this.mDataset = myDataset;
options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
}
public void getRandomHeight() {
mHeights = new ArrayList<Integer>();
int min = 252;
for (int i = 0; i < mDataset.size(); i++) {
//随机的获取一个范围为200-600直接的高度
String name = mDataset.get(i).getName();
int w = (name.length() + 1) * 24 + 36;
int ww = Math.max(min, w);
mHeights.add(ww);
}
}
public void setAddrCardListener(AddrCardListener listener) {
mListener = listener;
}
private void setAdapterListener(MyViewHolder holder) {
if (mListener == null) return;
if (holder.tvTitle.getVisibility() == View.GONE) {
return;
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyViewHolder holder = (MyViewHolder) v.getTag();
final int position = holder.getLayoutPosition();
notifyItemChanged(position);
mListener.onAddrItemClick(position);
}
});
holder.itemView.setTag(holder);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new view by inflating the row item xml.
final View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.photo_card_cell2, parent, false);
MyViewHolder holder = new MyViewHolder(v);
setAdapterListener(holder);
return holder;
}
public void addData(List<CardAddrItem> datalist) {
if ((datalist != null) && (datalist.size() > 0)) {
mDataset.clear();
notifyDataSetChanged();
mDataset.addAll(getItemCount(), datalist);
getRandomHeight();
notifyItemChanged(0);
notifyDataSetChanged();
}
}
public ArrayList<CardAddrItem> getData() {
return mDataset;
}
public CardAddrItem getItem(int position) {
return (mDataset != null && position >= 0 && position < mDataset.size()) ?
mDataset.get(position) : null;
}
@Override
public int getItemCount() {
return (mDataset == null) ? 0 : mDataset.size();
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
CardAddrItem map = mDataset.get(position);
holder.tvTitle.setText(map.getName().trim());
holder.tvTitle.setVisibility(View.VISIBLE);
holder.tvAddress.setText(map.getAddress().trim());
holder.tvAddress.setVisibility(View.VISIBLE);
String url = map.getUrl();
holder.ivPhoto.setTag(holder.spinner);
holder.ivPhoto.setScaleType(ImageView.ScaleType.CENTER_CROP);
ImageLoader.getInstance().displayImage(url, holder.ivPhoto, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
holder.spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
Toast.makeText(view.getContext(), message, Toast.LENGTH_SHORT).show();
holder.spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
holder.spinner.setVisibility(View.GONE);
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
holder.spinner.setProgress(Math.round(100.0f * current / total));
}
});
}
/**
* Create a ViewHolder to represent your cell layout
* and data element structure
*/
public static class MyViewHolder extends RecyclerView.ViewHolder {
ImageView ivPhoto;
TextView tvTitle;
TextView tvAddress;
View llCardBack;
ProgressBar spinner;
public MyViewHolder(View itemView) {
super(itemView);
ivPhoto = (ImageView) itemView.findViewById(R.id.photo);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvAddress = (TextView) itemView.findViewById(R.id.tvAddress);
llCardBack = itemView.findViewById(R.id.llCardBack);
spinner = (ProgressBar) itemView.findViewById(R.id.loading);
}
}
public interface AddrCardListener {
void onAddrItemClick(int position);
void onAddrNaviClick(int position);
void onAddrCollClick(int position);
}
相关文章推荐
- Android5.x之RecyclerView使用(5)网格布局
- Android开发之RecyclerView实现流式布局
- Android RecyclerView多个Item布局的实现(可实现头部底部)
- android开发之&使用RecyclerView实现瀑布流布局(二)
- Android 使用RecyclerView实现多列布局及其优劣
- Android RecyclerView多个Item布局的实现(可实现头部底部)
- Android学习之RecyclerView学习(实现瀑布流式布局)
- android新特性:使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果
- Android TV横向滚动网格布局——RecyclerView的使用
- 【android】使用RecyclerView和CardView,实现知乎日报精致布局
- android新特性:使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果
- Android RecyclerView加载不同布局简单实现
- Android RecyclerView网格布局(支持多种分割线)详解(2)
- Android RecyclerView 详解(2)---网格布局(支持多种分割线)
- Android中RecyclerView布局代替GridView实现类似支付宝的界面
- android studio pulltorefresh功能实现 通过swiperefreshlayout 使用recyclerview布局
- Android RecyclerView与泛型 简单实现多布局
- Android利用ViewPager+GridView,实现网格布局(功能列表)并能水平滑动
- Android RecyclerView详解及实现瀑布流式布局
- Android RecyclerView详解及实现瀑布流式布局 推荐