请尊重原创,转载请注明出处: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。
能力有限,如有不足的地方欢迎指出。