請尊重原創,轉載請註明出處:http://blog.csdn.net/mabeijianxi/article/details/50533703
先看下效果圖:
源碼地址:https://github.com/mabeijianxi/Circle-of-friends
源碼的核心類(adapter)裏面幾乎對每個方法都有註解。本demo主要想分享的是:
- listview各種嵌套處理
- listview的優化處理
- 用ImageLoader的一些特殊方式來優化圖片加載
- listview的高度封裝操作(刷新、加載更多、ui操作等)
- Activity動畫的靈活應用
<strong>
</strong><span style="font-size:14px;">public class EaluationAdapter extends RecyclerView.Adapter<EaluationAdapter.EaluationHolder> {
/**
* 當高分辨率的時候服務器的圖片顯得太小,這裏優化下顯示比例
*/
private Float fTimes;
private Context mContext;
private boolean mIsLoadImage = true;
private ArrayList<EaluationListBean> mEaluationList;
private EaluationGvPicAdaper mEaluationGvPicAdaper;
private ImageLoader mImageLoader = ImageLoader.getInstance();
private DisplayImageOptions mConfig = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.home_youpin)
.showImageOnFail(R.drawable.home_youpin)
.cacheInMemory(true)// 在內存中會緩存該圖片
.cacheOnDisk(true)// 在硬盤中會緩存該圖片
.considerExifParams(true)// 會識別圖片的方向信息
.resetViewBeforeLoading(true)// 重設圖片
.build();
public ArrayList<EaluationListBean> getmEaluationList() {
return mEaluationList;
}
/**
* 是否加載圖片
*
* @param isLoadImage
*/
public void setLoadImage(boolean isLoadImage) {
this.mIsLoadImage = isLoadImage;
}
public EaluationAdapter(Context context) {
this.mContext = context;
mEaluationList = new ArrayList<>();
// 適配單圖放大比例
String sTimes = mContext.getResources().getString(R.string.times);
fTimes = Float.valueOf(sTimes);
}
public void clearAdapterNotifyData() {
mEaluationList.clear();
notifyDataSetChanged();
}
public void clearAdapter() {
mEaluationList.clear();
}
public void addEaluationDataAllNotifyData(ArrayList<EaluationListBean> data) {
if (data != null) {
mEaluationList.addAll(data);
notifyDataSetChanged();
}
}
public void addEaluationDataAll(ArrayList<EaluationListBean> data) {
if (data != null) {
mEaluationList.addAll(data);
}
}
public void addEaluationData(EaluationListBean data) {
if (data != null) {
mEaluationList.add(data);
notifyDataSetChanged();
}
}
@Override
public int getItemCount() {
return mEaluationList.size();
}
@Override
public EaluationHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_comments, parent, false);
return new EaluationHolder(view);
}
@Override
public void onBindViewHolder(EaluationHolder holder, int position) {
EaluationListBean ealuationListBean = mEaluationList.get(position);
List<EaluationListBean.EaluationPicBean> attachments = ealuationListBean.attachments;
if (ealuationListBean.avatar != null) {
mImageLoader.displayImage(ealuationListBean.avatar.smallPicUrl, holder.icon, mConfig);
setIconClick(holder, ealuationListBean.avatar.smallPicUrl, ealuationListBean.avatar.picUrl);
} else {
holder.icon.setImageResource(R.drawable.home_youpin);
setIconClick(holder, "null", "null");
}
holder.tv_nickname.setText(ealuationListBean.userName);
holder.tv_text.setText(ealuationListBean.content);
holder.tv_date.setText(ealuationListBean.creatTime);
holder.rb_stars.setRating(ealuationListBean.grade);
setUpImage(holder, attachments, position);
setUpTereplys(holder, ealuationListBean.evaluatereplys);
}
/**
* 設置回覆內容規則
*這裏用的是自定義的LinearLayout,這樣比listview消耗要小一些
* @param holder
* @param evaluatereplysList
*/
private void setUpTereplys(EaluationHolder holder, List<EvaluatereplysBean> evaluatereplysList) {
if (evaluatereplysList != null && evaluatereplysList.size() > 0) {
holder.lv_comments_details.setVisibility(View.VISIBLE);
EvaluatereplysAdapter evaluatereplysAdapter = new EvaluatereplysAdapter(mContext, evaluatereplysList);
holder.lv_comments_details.setAdapter(evaluatereplysAdapter);
} else {
holder.lv_comments_details.setVisibility(View.GONE);
}
}
/**
* 設置圖片顯示規則
*
* @param holder
* @param attachments
* @param position
*/
private void setUpImage(EaluationHolder holder, List<EaluationListBean.EaluationPicBean> attachments, int position) {
holder.fl_image.setVisibility(View.GONE);
if (attachments != null) {
if (attachments.size() == 0) {
holder.fl_image.setVisibility(View.GONE);
} else if (attachments.size() == 1) {
setSingleImage(attachments, holder, position);
holder.gv_image.setVisibility(View.GONE);
holder.iv_image.setVisibility(View.VISIBLE);
holder.fl_image.setVisibility(View.VISIBLE);
} else {
holder.iv_image.setVisibility(View.GONE);
holder.gv_image.setVisibility(View.VISIBLE);
holder.fl_image.setVisibility(View.VISIBLE);
setManyImage(attachments, holder, position);
}
} else {
holder.fl_image.setVisibility(View.GONE);
}
}
/**
* 設置頭像的點擊看大圖事件,這裏爲了方便直接把bean類進行了轉換傳遞
* @param holder
* @param miniPicUrl
* @param picUrl
*/
private void setIconClick(EaluationHolder holder, final String miniPicUrl, final String picUrl) {
holder.icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, LookBigPicActivity.class);
Bundle bundle = new Bundle();
List<EaluationListBean.EaluationPicBean> attachments = new ArrayList<EaluationListBean.EaluationPicBean>();
EaluationListBean.EaluationPicBean ealuationPicBean = new EaluationListBean().new EaluationPicBean();
ealuationPicBean.imageUrl = picUrl;
ealuationPicBean.smallImageUrl = miniPicUrl;
attachments.add(ealuationPicBean);
bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments);
intent.putExtras(bundle);
intent.putExtra(LookBigPicActivity.CURRENTITEM, 0);
mContext.startActivity(intent);
// 動畫處理
startActivityAnim();
}
});
}
/**
* 設置多圖
*
* @param attachments
* @param holder
* @param position
*/
private void setManyImage(List<EaluationListBean.EaluationPicBean> attachments, EaluationHolder holder, int position) {
// mEaluationGvPicAdaper = (EaluationGvPicAdaper) holder.gv_image.getTag(position);
// if(mEaluationGvPicAdaper==null){
EaluationGvPicAdaper mEaluationGvPicAdaper = new EaluationGvPicAdaper(mContext, attachments, mIsLoadImage);
// holder.gv_image.setTag(position,mEaluationGvPicAdaper);
holder.gv_image.setAdapter(mEaluationGvPicAdaper);
// }
}
/**
* 設置單圖
*
* @param attachments
* @param holder
*/
private void setSingleImage(final List<EaluationListBean.EaluationPicBean> attachments, final EaluationHolder holder, final int position) {
//可更具請求選擇是否設置是否對單圖快滑處理
// if (mIsLoadImage) {
mImageLoader.displayImage(attachments.get(0).smallImageUrl, holder.iv_image, mConfig, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
// 優化顯示比例
if (fTimes != 1) {
int height = loadedImage.getHeight();
int width = loadedImage.getWidth();
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int) (width * fTimes), (int) (height * fTimes));
holder.iv_image.setLayoutParams(params);
}
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
holder.iv_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 點擊查看大圖的操作
Intent intent = new Intent(mContext, LookBigPicActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments);
intent.putExtras(bundle);
intent.putExtra(LookBigPicActivity.CURRENTITEM, 0);
mContext.startActivity(intent);
startActivityAnim();
}
});
// }
// 優化快滑時的圖片加載
/* else {
//這樣其實有時候會得不到,具體原因可以看源碼裏面的util,裏面有詳細註釋
Bitmap bitmap = mImageLoader.getMemoryCache().get(attachments.get(0).smallImageUrl);
if (bitmap != null) {
holder.iv_image.setImageBitmap(bitmap);
}
}*/
}
/**
* 開始跳轉動畫
*/
private void startActivityAnim() {
((MainActivity) mContext).overridePendingTransition(R.anim.activity2pic_in, R.anim.activity2pic_out);
}
static class EaluationHolder extends RecyclerView.ViewHolder {
public CircularImage icon;
public ImageView iv_image;
public TextView tv_nickname;
public TextView tv_text;
// 可更具情況設置爲emoji表情
public TextView tv_date;
public RatingBar rb_stars;
public CustomGridView gv_image;
public LinearListView lv_comments_details;
public FrameLayout fl_image;
public EaluationHolder(View itemView) {
super(itemView);
icon = (CircularImage) itemView.findViewById(R.id.icon);
iv_image = (ImageView) itemView.findViewById(R.id.iv_image);
tv_nickname = (TextView) itemView.findViewById(R.id.tv_nickname);
tv_text = (TextView) itemView.findViewById(R.id.tv_text);
tv_date = (TextView) itemView.findViewById(R.id.tv_date);
rb_stars = (RatingBar) itemView.findViewById(R.id.rb_stars);
gv_image = (CustomGridView) itemView.findViewById(R.id.gv_image);
lv_comments_details = (LinearListView) itemView.findViewById(R.id.lv_comments_details);
fl_image = (FrameLayout) itemView.findViewById(R.id.fl_image);
}
}
}</span>
主要對單圖與多圖處理,對滑動優化處理,其實還開了硬件加速(android:hardwareAccelerated="true"),這樣可以最大程度讓listview順暢,大圖查看模仿了QQ空間的查看模式,具體的可以看源碼裏面的幾個adapter。
能力有限,如有不足的地方歡迎指出。