Android 实现朋友圈有图片和视频(转)

这里写图片描述

效果就是图上的样子。

首先是布局文件,没什么就是一个RecycleView 
<android.support.v7.widget.RecyclerView 
android:id="@+id/dis_rv" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 
</android.support.v7.widget.RecyclerView>
 
然后是item的布局文件,item布局文件是一个cardview。我这个比较乱,因为有圆角图片作为头像,有标题,有内容,然后是一个自定义九宫格的控件,下面是个ImageView作为视频的封面,开始都让他们隐藏,在适配器里判断,让对应的显示出来。

复制代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:layout_marginBottom="15dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    app:cardBackgroundColor="@android:color/white"
    app:cardCornerRadius="5dp"
    app:cardUseCompatPadding="false">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <cn.com.jwtimes.www.jwtimes.view.RoundImageView
            android:layout_width="54dp"
            android:layout_height="54dp"
            android:layout_marginLeft="12dp"
            android:layout_marginTop="10dp"
            android:src="@mipmap/touxiang" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="12dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/dis_disname_tv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"

                android:paddingTop="10dp"
                android:text="前合租华安"
                android:textColor="#000"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/dis_conrent_tv"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:paddingRight="10dp"
                android:text="冯绍峰的上升到发送的范德萨范德萨范德萨"
                android:textColor="#666"
                android:textSize="13sp" />

            <cn.com.jwtimes.www.jwtimes.view.NineGridTestLayout xmlns:app="http://schemas.android.com/apk/res-auto"
                android:id="@+id/layout_nine_grid"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:layout_marginTop="8dp"
                app:sapcing="4dp" />


            <FrameLayout
                android:id="@+id/frameLayout"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:layout_marginRight="40dp"
                android:visibility="gone">

                <ImageView
                    android:id="@+id/pic_iiv"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:background="@color/datadetailtext"
                    android:scaleType="fitXY" />

                <ImageView
                    android:id="@+id/start_iv"
                    android:layout_width="60dp"
                    android:layout_height="60dp"
                    android:layout_gravity="center"
                    android:src="@mipmap/startvoi" />
            </FrameLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/dis_time_tv"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="2015-08-02 13:31"
                        android:textColor="#AFAFAF"
                        android:textSize="10sp" />

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="6dp"
                        android:orientation="horizontal">

                        <ImageView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@mipmap/upload_location" />

                        <TextView
                            android:id="@+id/dis_pos_tv"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginBottom="12dp"
                            android:layout_marginLeft="5dp"
                            android:text="北京市丰台"
                            android:textColor="#AFAFAF"
                            android:textSize="10sp" />
                    </LinearLayout>

                </LinearLayout>

                <ImageButton
                    android:id="@+id/ibm_delect"
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:layout_marginRight="13dp"
                    android:layout_marginTop="4dp"
                    android:background="@null"
                    android:src="@mipmap/upload_more" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</android.support.v7.widget.CardView>

复制代码

下面我们来看适配器 我适配器更乱 。我先把整体代码贴出来.

复制代码

package cn.com.jwtimes.www.jwtimes.adapter;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.com.jwtimes.www.jwtimes.R;
import cn.com.jwtimes.www.jwtimes.bean.DisasterUpload;
import cn.com.jwtimes.www.jwtimes.fragment.UploadFragment;
import cn.com.jwtimes.www.jwtimes.ui.disaupload.PlayMovieActivity;
import cn.com.jwtimes.www.jwtimes.view.NineGridTestLayout;


/**
 * Created by 王超然 on 2016/6/6.
 */
public class RecycleDisAdapter extends RecyclerView.Adapter<RecycleDisAdapter.ViewHolder> {

    private List<DisasterUpload.DataEntity.ListEntity> datas;
    private LayoutInflater inflater;
    private List<String> imageList;
    UploadFragment fm;
    Bitmap bitmap;

    public RecycleDisAdapter(List<DisasterUpload.DataEntity.ListEntity> datas, Context mContext, List<String> imageList, UploadFragment fm) {
        this.datas = datas;
        this.imageList = imageList;
        this.fm = fm;
        this.inflater = LayoutInflater.from(mContext);
    }

    public void setList(List<DisasterUpload.DataEntity.ListEntity> list) {
        datas = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View convertView = inflater.inflate(R.layout.disaster_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(convertView);
        return viewHolder;


    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.setIsRecyclable(false);
        holder.dis_disname_tv.setText(datas.get(position).getSbName());
        holder.dis_conrent_tv.setText(datas.get(position).getSbContent());
        holder.dis_pos_tv.setText(datas.get(position).getLocation());
        holder.dis_time_tv.setText(datas.get(position).getSbTime());
        final Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what){
                    case 1:
                        holder.pic_iv.setImageBitmap((Bitmap) msg.obj);
                        break;
                }
                super.handleMessage(msg);
            }
        };
        if (datas.get(position).getSpList().size() != 0) {
            holder.frameLayout.setVisibility(View.VISIBLE);
            final String file = "http://124.193.178.222:1888/JwsdApp/" + datas.get(position).getSpList().get(0).getSpURL();
            Map<Integer, Bitmap> bitmapMap = new HashMap<>();
            if (bitmapMap.containsKey(position)) {
                 bitmap = bitmapMap.get(position);
                holder.pic_iv.setImageBitmap(bitmap);
            } else {
                Thread t = new Thread(new Runnable(){
                    public void run(){
                        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
                        //获取网络视频
                        try {
                            retriever.setDataSource(file, new HashMap<String, String>());
                            bitmap = retriever.getFrameAtTime();
                            if (bitmap!=null){
                                Message message = handler.obtainMessage();
                                message.what = 1;
                                message.obj = bitmap;
                                handler.sendMessage(message);

                            }

                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (RuntimeException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                retriever.release();
                            } catch (RuntimeException e) {
                                e.printStackTrace();
                            }
                        }
                    }});
                t.start();

            }
            holder.start_iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(fm.getActivity(), PlayMovieActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putString("text", file);
                    intent.putExtras(bundle);
                    fm.getActivity().startActivity(intent);
                }
            });

        }

            imageList.clear();
            for (int i = 0; i < datas.get(position).getTpList().size(); i++) {
                imageList.add("http://124.193.178.222:1888/JwsdApp/" + datas.get(position).getTpList().get(i).getTpURL());
            }

            holder.layout.setUrlList(imageList);



    }

    @Override
    public int getItemCount() {
        return getListSize(datas);
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        private NineGridTestLayout layout;
        private TextView dis_disname_tv, dis_conrent_tv, dis_pos_tv, dis_time_tv;
        private ImageButton ibm_delect;
        private FrameLayout frameLayout;
        private ImageView pic_iv, start_iv;

        ViewHolder(View itemView) {
            super(itemView);
            frameLayout = (FrameLayout) itemView.findViewById(R.id.frameLayout);
            dis_disname_tv = (TextView) itemView.findViewById(R.id.dis_disname_tv);
            dis_conrent_tv = (TextView) itemView.findViewById(R.id.dis_conrent_tv);
            dis_pos_tv = (TextView) itemView.findViewById(R.id.dis_pos_tv);
            dis_time_tv = (TextView) itemView.findViewById(R.id.dis_time_tv);
            pic_iv = (ImageView) itemView.findViewById(R.id.pic_iiv);
            layout = (NineGridTestLayout) itemView.findViewById(R.id.layout_nine_grid);
            start_iv = (ImageView) itemView.findViewById(R.id.start_iv);
            ibm_delect = (ImageButton) itemView.findViewById(R.id.ibm_delect);
            ibm_delect.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    fm.showdelectPopwindow();
                    fm.backgroundAlpha(0.5f);
                }
            });
        }
    }

    private int getListSize(List<DisasterUpload.DataEntity.ListEntity> list) {
        if (list == null || list.size() == 0) {
            return 0;
        }
        return list.size();
    }
    public void addAll(List<DisasterUpload.DataEntity.ListEntity> dd) {
        datas.addAll(dd);
        notifyDataSetChanged();

    }

    public void clear() {
        datas.clear();
        imageList.clear();
        notifyDataSetChanged();
    }
}

复制代码

其余的也没什么好说的 我主要说说设置封面经历,我要获取网络视频的第一帧作为相册封面,开始写完特别卡,因为每次都要请求,我就想我建一个bitmap的集合把图片存里,然后用position作为key每次我都去我的集合里找一遍,有就从集合取,没有就请求,然后发现还是卡,后来我想那干脆开个线程让她加载,然后发现,加载完以后, 我在切换别的fragment都是空白的 ,后来发现我没写handler通知更新UI。

首先 后台返回的数据有两个集合一个是图片集合一个是视频集合,但视频只有一个所以我判断了视频集合不等于0的时候显示ImageView。

复制代码

if (datas.get(position).getSpList().size() != 0) {
            holder.frameLayout.setVisibility(View.VISIBLE);
            final String file = "http://124.193.178.222:1888/JwsdApp/" + datas.get(position).getSpList().get(0).getSpURL();
            Map<Integer, Bitmap> bitmapMap = new HashMap<>();//bitmap的集合
            if (bitmapMap.containsKey(position)) {
                 bitmap = bitmapMap.get(position);
                holder.pic_iv.setImageBitmap(bitmap);//集合要是存在就设置上
            } else {
                Thread t = new Thread(new Runnable(){
                    public void run(){//开启线程获取视频第一帧
                        MediaMetadataRetriever retriever = new MediaMetadataRetriever(); //获取网络视频
                        try {
                            retriever.setDataSource(file, new HashMap<String, String>());
                            bitmap = retriever.getFrameAtTime();
                            if (bitmap!=null){
                                Message message = handler.obtainMessage();//用handler发送通知
                                message.what = 1;
                                message.obj = bitmap;
                                handler.sendMessage(message);

                            }

                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (RuntimeException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                retriever.release();
                            } catch (RuntimeException e) {
                                e.printStackTrace();
                            }
                        }
                    }});
                t.start();

            }

复制代码

然后点击视频要能播放 所以我把点击事件写在了这里:

复制代码

 holder.start_iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(fm.getActivity(), PlayMovieActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putString("text", file);
                    intent.putExtras(bundle);
                    fm.getActivity().startActivity(intent);
                }
            });

复制代码

然后下面是这设置图片的九宫格控件

            imageList.clear();
            for (int i = 0; i < datas.get(position).getTpList().size(); i++) {
                imageList.add("http://124.193.178.222:1888/JwsdApp/" + datas.get(position).getTpList().get(i).getTpURL());
            }
            holder.layout.setUrlList(imageList);

NineGridLayout的代码

复制代码

package cn.com.jwtimes.www.jwtimes.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;

import cn.com.jwtimes.www.jwtimes.R;

/**
 * Created by 王超然 on 2016/6/6.
 */
public abstract class NineGridLayout extends ViewGroup {

    private static final float DEFUALT_SPACING = 3f;
    private static final int MAX_COUNT = 9;

    protected Context mContext;
    private float mSpacing = DEFUALT_SPACING;
    private int mColumns;
    private int mRows;
    private int mTotalWidth;
    private int mSingleWidth;

    private boolean mIsShowAll = false;
    private boolean mIsFirst = true;
    private ArrayList<String> mUrlList = new ArrayList<>();

    public NineGridLayout(Context context) {
        super(context);
        init(context);
    }

    public NineGridLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.NineGridLayout);

        mSpacing = typedArray.getDimension(R.styleable.NineGridLayout_sapcing, DEFUALT_SPACING);
        typedArray.recycle();
        init(context);
    }

    private void init(Context context) {
        mContext = context;
        if (getListSize(mUrlList) == 0) {
            setVisibility(GONE);
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        mTotalWidth = right - left;
        mSingleWidth = (int) ((mTotalWidth - mSpacing * (3 - 1)) / 3);
        if (mIsFirst) {
            notifyDataSetChanged();
            mIsFirst = false;
        }
    }

    /**
     * 设置间隔
     *
     * @param spacing
     */
    public void setSpacing(float spacing) {
        mSpacing = spacing;
    }

    /**
     * 设置是否显示所有图片(超过最大数时)
     *
     * @param isShowAll
     */
    public void setIsShowAll(boolean isShowAll) {
        mIsShowAll = isShowAll;
    }

    public void setUrlList(List<String> urlList) {
        if (getListSize(urlList) == 0) {
            setVisibility(GONE);
            return;
        }
        setVisibility(VISIBLE);

        mUrlList.clear();
        mUrlList.addAll(urlList);

        if (!mIsFirst) {
            notifyDataSetChanged();
        }
    }

    public void notifyDataSetChanged() {
        post(new TimerTask() {
            @Override
            public void run() {
                refresh();
            }
        });
    }

    private void refresh() {
        removeAllViews();
        int size = getListSize(mUrlList);
        if (size > 0) {
            setVisibility(VISIBLE);
        } else {
            setVisibility(GONE);
        }

        if (size == 1) {
            String url = mUrlList.get(0);
            RatioImageView imageView = createImageView(0, url);

            //避免在ListView中一张图未加载成功时,布局高度受其他item影响
            LayoutParams params = getLayoutParams();
            params.height = mSingleWidth;
            setLayoutParams(params);
            imageView.layout(0, 0, mSingleWidth, mSingleWidth);

            boolean isShowDefualt = displayOneImage(imageView, url, mTotalWidth);
            if (isShowDefualt) {
                layoutImageView(imageView, 0, url, false);
            } else {
                addView(imageView);
            }
            return;
        }

        generateChildrenLayout(size);
        layoutParams();

        for (int i = 0; i < size; i++) {
            String url = mUrlList.get(i);
            RatioImageView imageView;
            if (!mIsShowAll) {
                if (i < MAX_COUNT - 1) {
                    imageView = createImageView(i, url);
                    layoutImageView(imageView, i, url, false);
                } else { //第9张时
                    if (size <= MAX_COUNT) {//刚好第9张
                        imageView = createImageView(i, url);
                        layoutImageView(imageView, i, url, false);
                    } else {//超过9张
                        imageView = createImageView(i, url);
                        layoutImageView(imageView, i, url, true);
                        break;
                    }
                }
            } else {
                imageView = createImageView(i, url);
                layoutImageView(imageView, i, url, false);
            }
        }
    }

    private void layoutParams() {
        int singleHeight = mSingleWidth;

        //根据子view数量确定高度
        LayoutParams params = getLayoutParams();
        params.height = (int) (singleHeight * mRows + mSpacing * (mRows - 1));
        setLayoutParams(params);
    }

    private RatioImageView createImageView(final int i, final String url) {
        RatioImageView imageView = new RatioImageView(mContext);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                onClickImage(i, url, mUrlList);
            }
        });
        return imageView;
    }

    /**
     * @param imageView
     * @param url
     * @param showNumFlag 是否在最大值的图片上显示还有未显示的图片张数
     */
    private void layoutImageView(RatioImageView imageView, int i, String url, boolean showNumFlag) {
        final int singleWidth = (int) ((mTotalWidth - mSpacing * (3 - 1)) / 3);
        int singleHeight = singleWidth;

        int[] position = findPosition(i);
        int left = (int) ((singleWidth + mSpacing) * position[1]);
        int top = (int) ((singleHeight + mSpacing) * position[0]);
        int right = left + singleWidth;
        int bottom = top + singleHeight;

        imageView.layout(left, top, right, bottom);

        addView(imageView);
        if (showNumFlag) {//添加超过最大显示数量的文本
            int overCount = getListSize(mUrlList) - MAX_COUNT;
            if (overCount > 0) {
                float textSize = 30;
                final TextView textView = new TextView(mContext);
                textView.setText("+" + String.valueOf(overCount));
                textView.setTextColor(Color.WHITE);
                textView.setPadding(0, singleHeight / 2 - getFontHeight(textSize), 0, 0);
                textView.setTextSize(textSize);
                textView.setGravity(Gravity.CENTER);
                textView.setBackgroundColor(Color.BLACK);
                textView.getBackground().setAlpha(120);

                textView.layout(left, top, right, bottom);
                addView(textView);
            }
        }
        displayImage(imageView, url);
    }

    private int[] findPosition(int childNum) {
        int[] position = new int[2];
        for (int i = 0; i < mRows; i++) {
            for (int j = 0; j < mColumns; j++) {
                if ((i * mColumns + j) == childNum) {
                    position[0] = i;//行
                    position[1] = j;//列
                    break;
                }
            }
        }
        return position;
    }

    /**
     * 根据图片个数确定行列数量
     *
     * @param length
     */
    private void generateChildrenLayout(int length) {
        if (length <= 3) {
            mRows = 1;
            mColumns = length;
        } else if (length <= 6) {
            mRows = 2;
            mColumns = 3;
            if (length == 4) {
                mColumns = 2;
            }
        } else {
            mColumns = 3;
            if (mIsShowAll) {
                mRows = length / 3;
                int b = length % 3;
                if (b > 0) {
                    mRows++;
                }
            } else {
                mRows = 3;
            }
        }

    }

    protected void setOneImageLayoutParams(RatioImageView imageView, int width, int height) {
        imageView.setLayoutParams(new LayoutParams(width, height));
        imageView.layout(0, 0, width, height);

        LayoutParams params = getLayoutParams();
//        params.width = width;
        params.height = height;
        setLayoutParams(params);
    }

    private int getListSize(List<String> list) {
        if (list == null || list.size() == 0) {
            return 0;
        }
        return list.size();
    }

    private int getFontHeight(float fontSize) {
        Paint paint = new Paint();
        paint.setTextSize(fontSize);
        Paint.FontMetrics fm = paint.getFontMetrics();
        return (int) Math.ceil(fm.descent - fm.ascent);
    }

    /**
     * @param imageView
     * @param url
     * @param parentWidth 父控件宽度
     * @return true 代表按照九宫格默认大小显示,false 代表按照自定义宽高显示
     */
    protected abstract boolean displayOneImage(RatioImageView imageView, String url, int parentWidth);

    protected abstract void displayImage(RatioImageView imageView, String url);

    protected abstract void onClickImage(int position, String url, ArrayList<String> urlList);
}

复制代码

NineGridTestLayout的代码

复制代码

package cn.com.jwtimes.www.jwtimes.view;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.view.View;

import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

import java.util.ArrayList;

import cn.com.jwtimes.www.jwtimes.ui.disaupload.ImageViewActivity;
import cn.com.jwtimes.www.jwtimes.utils.ImageLoaderUtil;


/**
 * Created by 王超然 on 2016/6/6.
 */
public class NineGridTestLayout extends NineGridLayout {

    protected static final int MAX_W_H_RATIO = 3;
    private Context context;

    public NineGridTestLayout(Context context) {
        super(context);
    }

    public NineGridTestLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected boolean displayOneImage(final RatioImageView imageView, String url, final int parentWidth) {

        ImageLoaderUtil.displayImage(mContext, imageView, url, ImageLoaderUtil.getPhotoImageOption(), 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 bitmap) {
                int w = bitmap.getWidth();
                int h = bitmap.getHeight();

                int newW;
                int newH;
                if (h > w * MAX_W_H_RATIO) {//h:w = 5:3
                    newW = parentWidth / 2;
                    newH = newW * 5 / 3;
                } else if (h < w) {//h:w = 2:3
                    newW = parentWidth * 2 / 3;
                    newH = newW * 2 / 3;
                } else {//newH:h = newW :w
                    newW = parentWidth / 2;
                    newH = h * newW / w;
                }
                setOneImageLayoutParams(imageView, newW, newH);
            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {

            }
        });
        return false;
    }

    @Override
    protected void displayImage(RatioImageView imageView, String url) {
        ImageLoaderUtil.getImageLoader(mContext).displayImage(url, imageView, ImageLoaderUtil.getPhotoImageOption());
    }

    @Override
    protected void onClickImage(int i, String url, ArrayList<String> urlList) {

        Intent intent = new Intent(mContext, ImageViewActivity.class);
        intent.putExtra("picurl",url);

        mContext.startActivity(intent);
       // Toast.makeText(mContext, "点击了图片" + url, Toast.LENGTH_SHORT).show();
    }
}

复制代码

然后就是fragment了 这里也没什么好说的。我用了SwipyRefreshLayout作为下拉刷新和上拉加载,我这里面有两个popupwindow 一个是这个fragment的Activity传的拍摄button,一个是item的删除button。

复制代码

package cn.com.jwtimes.www.jwtimes.fragment;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.PopupWindow;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;
import com.google.gson.Gson;
import com.mingle.widget.LoadingView;
import com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayout;
import com.orangegangsters.github.swipyrefreshlayout.library.SwipyRefreshLayoutDirection;

import java.util.ArrayList;
import java.util.List;

import cn.com.jwtimes.www.jwtimes.JWtimes;
import cn.com.jwtimes.www.jwtimes.R;
import cn.com.jwtimes.www.jwtimes.adapter.RecycleDisAdapter;
import cn.com.jwtimes.www.jwtimes.bean.DisasterUpload;
import cn.com.jwtimes.www.jwtimes.ui.disaupload.MovieRecorderActivity;
import cn.com.jwtimes.www.jwtimes.ui.disaupload.UploadphotoActivity;
import cn.com.jwtimes.www.jwtimes.uri.Uris;

/**
 * Created by 王超然 on 2016/9/7.
 */
public class UploadFragment extends BaseFragmet implements View.OnClickListener {
    private Context mContext;
    private ImageButton iv_show_pop;
    private PopupWindow mPopWindow;
    private LoadingView loadingView;
    private RecyclerView disUp_rv;
    private RecyclerView.LayoutManager mLayoutManager;
    private RecycleDisAdapter adapter;
    private List<DisasterUpload.DataEntity.ListEntity> datas;
    private List<DisasterUpload.DataEntity> dates;
    private int ap009 = 1;
    private int ap0010;
    private DisasterUpload disasterUpload;
    private List<String> imageList;
    private SwipyRefreshLayout zxyj_swipyrefreshlayout;
    private int position;
    private static final String ARG_LIST = "list";


    @SuppressLint("ValidFragment")
    public UploadFragment(Context context, ImageButton iv_camera) {
        this.mContext = context;
        this.iv_show_pop = iv_camera;
    }

    public UploadFragment() {

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_upload, null);
        initView(view);
        loadData();
        disUp_rv.setAdapter(adapter);
        zxyj_swipyrefreshlayout = (SwipyRefreshLayout) view.findViewById(R.id.zxyj_swipyrefreshlayout);
        zxyj_swipyrefreshlayout.setOnRefreshListener(new SwipyRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh(SwipyRefreshLayoutDirection direction) {
                if (direction == SwipyRefreshLayoutDirection.TOP) {
                    position = 0;
                    adapter.clear();
                    loadData();
                    zxyj_swipyrefreshlayout.setRefreshing(false);
                } else if (direction == SwipyRefreshLayoutDirection.BOTTOM) {
                    loadMoreData();
                    zxyj_swipyrefreshlayout.setRefreshing(false);
                    // Toast.makeText(getActivity(), "暂时还没开发", Toast.LENGTH_SHORT).show();
                    zxyj_swipyrefreshlayout.setRefreshing(false);
                }

            }
        });
        iv_show_pop.setOnClickListener(this);
        return view;
    }

    private void loadMoreData() {
        SharedPreferences share = getActivity().getSharedPreferences("userInfo", Activity.MODE_WORLD_READABLE);
        String userName = share.getString("USER_NAME", "");
        String passWord = share.getString("PASSWORD", "");
        TelephonyManager telephonyMgr = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
        String ap003 = telephonyMgr.getDeviceId();
        String ap006 = share.getString("ap006", "");
        int ap007 = share.getInt("ap007", 0);
        int num = Integer.parseInt(dates.get(0).getNumber());
        ap009++;
        ap0010 = 5;
        if ((num + ap0010) / ap009 < ap0010) {
            Toast.makeText(getActivity(), "没有更多数据.......", Toast.LENGTH_SHORT).show();
        } else {

            String resUrl = Uris.URI_DSUP +
                    "ap001=" + userName + "&ap002=" + passWord + "&ap003=" + ap003 + "&ap006=" + ap006 + "&ap007=" + ap007 + "&ap009=" + ap009 + "&ap0010=" + ap0010;
            Log.i("resUrl", resUrl);
            //实例化请求队列
            StringRequest request = new StringRequest(Request.Method.POST,
                    String.format(resUrl),
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            Gson gson = new Gson();
                            disasterUpload = gson.fromJson(response, DisasterUpload.class);
                            loadingView.setVisibility(View.GONE);
                            datas.addAll(disasterUpload.getData().getList());
                            adapter.addAll(disasterUpload.getData().getList());
                        }

                    },
                    null
            );

            //设置请求取消标记
            request.setTag("jjjjj");
            //将请求添加在请求队列
            JWtimes.getInstance().getQueue().add(request);

        }


    }

    private void initView(View view) {
        mLayoutManager = new LinearLayoutManager(getActivity());
        disUp_rv = (RecyclerView) view.findViewById(R.id.dis_rv);
        disUp_rv.setLayoutManager(mLayoutManager);
        imageList = new ArrayList<String>();
        loadingView = (LoadingView) view.findViewById(R.id.loadView);
        imageList.clear();
        adapter = new RecycleDisAdapter(new ArrayList<DisasterUpload.DataEntity.ListEntity>(), getActivity(), imageList, this);
        datas = new ArrayList<DisasterUpload.DataEntity.ListEntity>();
        dates = new ArrayList<DisasterUpload.DataEntity>();
    }


    private void loadData() {
        SharedPreferences share = getActivity().getSharedPreferences("userInfo", Activity.MODE_PRIVATE);
        String userName = share.getString("USER_NAME", "");
        final String passWord = share.getString("PASSWORD", "");
        TelephonyManager telephonyMgr = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
        String ap003 = telephonyMgr.getDeviceId();
        String ap006 = share.getString("ap006", "");
        int ap007 = share.getInt("ap007", 0);
        String resUrl = Uris.URI_DSUP + "ap001=" + userName + "&ap002=" + passWord + "&ap003=" + ap003 + "&ap006=" + ap006 + "&ap007=" + ap007 + "&ap009=1&ap0010=5";
        //实例化请求队列


        StringRequest request = new StringRequest(Request.Method.POST,
                String.format(resUrl),
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Gson gson = new Gson();
                        disasterUpload = gson.fromJson(response, DisasterUpload.class);
                        loadingView.setVisibility(View.GONE);
                        datas.addAll(disasterUpload.getData().getList());
                        adapter.addAll(disasterUpload.getData().getList());
                        dates.add(disasterUpload.getData());

                    }

                },
                null
        );


        request.setTag("ppp");
        //将请求添加在请求队列
        JWtimes.getInstance().getQueue().add(request);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.photo_ibm:
                showPopupWindow();
                backgroundAlpha(0.5f);
                break;
        }
    }

    /**
     * 显示选择window
     */
    private void showPopupWindow() {
        //设置contentView
        View contentView = LayoutInflater.from(mContext).inflate(R.layout.popup_photo, null);
        mPopWindow = new PopupWindow(contentView,
                RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT, true);
        mPopWindow.setContentView(contentView);
        mPopWindow.setBackgroundDrawable(new BitmapDrawable());
        //   mPopWindow.setOutsideTouchable(true);
        mPopWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                backgroundAlpha(1f);
            }
        });
        //设置各个控件的点击响应
        TextView tv1 = (TextView) contentView.findViewById(R.id.photo_tv);
        TextView tv2 = (TextView) contentView.findViewById(R.id.vdio_tv);
        tv1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent1 = new Intent(mContext, UploadphotoActivity.class);
                startActivityForResult(intent1, 11);
                getActivity().overridePendingTransition(R.anim.anim_slide_right_in, R.anim.anim_slide_left_out);
                mPopWindow.dismiss();
            }
        });
        tv2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, MovieRecorderActivity.class);
                startActivityForResult(intent, 12);
                getActivity().overridePendingTransition(R.anim.anim_slide_right_in, R.anim.anim_slide_left_out);
                mPopWindow.dismiss();
            }
        });
        //显示PopupWindow
        View rootview = LayoutInflater.from(mContext).inflate(R.layout.activity_home_pager, null);
        mPopWindow.showAtLocation(rootview, Gravity.CENTER, 0, 0);

    }

    /**
     * 删除的popupWindow
     */
    public void showdelectPopwindow() {
        //设置contentView
        View contentView = LayoutInflater.from(mContext).inflate(R.layout.popup_delect, null);
        mPopWindow = new PopupWindow(contentView,
                RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT, true);
        mPopWindow.setContentView(contentView);
        mPopWindow.setBackgroundDrawable(new BitmapDrawable());
        mPopWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                backgroundAlpha(1f);
            }
        });
        //设置各个控件的点击响应
        TextView delect_tv = (TextView) contentView.findViewById(R.id.delect_tv);

        delect_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mPopWindow.dismiss();
            }
        });

        //显示PopupWindow
        View rootview = LayoutInflater.from(mContext).inflate(R.layout.activity_home_pager, null);
        mPopWindow.showAtLocation(rootview, Gravity.CENTER, 0, 0);

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        adapter.clear();
    }

    public void backgroundAlpha(float bgAlpha) {
        WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
        lp.alpha = bgAlpha;
        getActivity().getWindow().setAttributes(lp);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 11 && data != null) {
            position = 0;
            adapter.clear();
            loadData();
            return;
        } else if (requestCode == 12 && data != null) {
            position = 0;
            adapter.clear();
            loadData();
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

复制代码

我是Android小渣渣,代码写的一团乱麻。demo是没有的因为项目比较大,没有单独奥,不过哪里缺什么文件,都可以找我。 
compile ‘com.android.support:cardview-v7:23.2.0’ 
compile files(‘libs/universal-image-loader-1.9.5.jar’)图片加载的imageloader 
compile ‘com.github.orangegangsters:swipy:1.2.2@aar’ 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了避免大家浪费时间,直接先看下面的 Gif,略大,请耐心点。看完后,若你觉得会需要到,那么就请听我继续。gif 链接 http://123.57.244.105:8081/commentthumb/GIF.gifgit显示,略大,请耐心GitHub 链接废话一句:这个显示只是其中一部分,重点是:FFmpeg Camera 的录制部分,所以,你的星星(star)也是一种更新通知 (我通知你)。https://github.com/af913337456/WeChatVideoView功能点如果你看完上面的gif图,你会发现如下几点功能 (Function list):1,直观的播放前,可以显示封面缩略图播放时,如果还没有本地缓存,那么先进行下载下载过程中,显示圆型区域进度效果下载后,播放完毕后可以循环播放播放已经播放过的,是具备本地缓存的,也就是既能播放网络,也能播放本地2,隐藏的低耗电量低内存占用无延迟图与视频切换低耦合,高内聚,几行代码接入,一共3个类解析直观的功能点,几乎就是和新版微信的一样,从朋友圈点击一个视频,然后进入到一个 Activity 页面进行加载以及播放。为什么低耗电量和低内存占用?因为采用的是 SurfaceView 而不是 TextureView,图与视频切换的切换延迟也是这个原因。在你的 Activity 中这样使用这样就会以 id 为 activity_main 的 Relativelayout 为父容器装载。因为要避免内存泄露,所以你还需要做完下面的一些步骤,不会超过6行代码。技术点 (可以不看)1,下载操作:自定义 AsyncTask。PS:AsyncTask 比 Thread handler 重量级却方便(回调进度),但是,如果是 即放即用,结束即销毁,那么,no need to think about this;2,视频播放组合拳: surfaceView mediaPlayersurfaceView 用作显示,mediaPlayer 用来解码两者关系: mediaPlayer 绑定 surfaceView。为什么不用 TextrueView?3,进度区域自定义 View,3个画笔绘制,一个圆,一个边,一个扇区。作者:林冠宏 / 指尖下的幽灵掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8博客:http://www.cnblogs.com/linguanh/GitHub : https://github.com/af913337456/
### 回答1: Android Studio可以通过使用RecyclerView和CardView来实现朋友圈功能。首先,你需要创建一个RecyclerView来显示朋友圈中的所有内容。然后,你可以使用CardView来显示每个朋友圈的内容,包括用户头像、用户名、发布时间、文字内容、图片和评论等。你还可以使用Glide库来加载图片。 在实现朋友圈功能时,你需要考虑到以下几个方面: 1. 数据的存储和获取:你需要使用数据库或者网络请求来获取朋友圈的数据,并将其存储到本地或者内存中。 2. 布局的设计:你需要设计好每个朋友圈的布局,包括头像、用户名、发布时间、文字内容、图片和评论等。 3. 图片的加载:你需要使用Glide库来加载图片,并处理图片的缩放和裁剪等操作。 4. 评论的实现:你需要实现评论功能,并将评论数据存储到数据库或者服务器中。 5. 下拉刷新和上拉加载更多:你需要实现下拉刷新和上拉加载更多功能,以便用户可以浏览更多的朋友圈内容。 总之,实现朋友圈功能需要你具备一定的Android开发经验和技能,同时需要你对RecyclerView、CardView、Glide库和数据库等技术有一定的了解和掌握。 ### 回答2: Android Studio是一种用于开发Android应用程序的综合开发环境,它提供了完整的开发工具集,其中包括代码编辑器、视觉布局构建器、调试器和测试工具等。 要实现朋友圈应用程序,首先需要了解朋友圈的基本功能,如发布动态、浏览动态、评论、点赞等等。然后,我们可以按照以下步骤来实现朋友圈: 1.设计数据库模型 数据库模型是实现朋友圈的关键。我们需要设计一个适当的数据结构来存储动态的信息,如动态的文本、图片、发布时间,还需要根据用户ID存储点赞、评论等信息。 2.创建用户界面 我们需要为朋友圈创建一个用户界面。这通常包括一个列表来显示动态,以及用于发布动态、评论和点赞的界面。 3.实现发布动态的功能 我们可以在界面上添加一个“发布动态”的按钮,让用户点击它后输入文本或选择图片,然后将相应的信息存储到数据库中。 4.实现浏览动态的功能 我们需要在用户界面中显示动态列表。当用户滚动列表时,我们应该加载更多动态并显示它们。 当用户点击每个动态时, 应该显示相应的详情页面. 5.实现点赞和评论功能 我们需要在用户界面中为每个动态添加点赞和评论的按钮。 当用户点击点赞或评论按钮时, 我们需要将相应的信息存储到数据库中, 并刷新动态列表。 综上所述,实现朋友圈需要考虑到用户界面的设计,数据库的操作和一些基本功能的实现。以上是我对如何使用Android Studio实现朋友圈的一些想法,希望对你有所帮助。 ### 回答3: Android Studio实现朋友圈功能可以通过以下几个步骤来实现: 1.创建一个可以滑动的列表视图,用于显示朋友圈的内容。 2.通过网络请求获取朋友圈的数据,并解析成json格式的数据。 3.将解析的数据绑定到列表视图上,显示朋友圈的内容。 4.为每个朋友圈的内容设置点赞和评论功能,这可以通过添加按钮或者手势监听器来实现。 5.实现发布朋友圈的功能,这可以通过一个输入框和发布按钮来实现,用户可以在输入框中输入自己想发布的内容,点击发布按钮后将内容发送到服务器端。 6.实现图片上传功能,用户可以在发布朋友圈时上传图片图片上传可以采用异步上传的方式,这可以通过使用Volley或者OkHttp等网络框架来实现。 7.对朋友圈的内容进行缓存,这可以通过使用SQLite或者其他缓存框架来实现,可以避免用户在每次打开应用时都需要重新加载数据,提高用户的使用体验。 8.实现消息提醒功能,这可以通过推送服务来实现,比如使用极光推送等第三方推送服务。 9.为朋友圈的内容添加定位功能,这可以使用高德地图或者百度地图等地图服务来实现。 10.优化用户体验,比如增加手势操作、支持多语言、适配不同的屏幕尺寸等。 总之,实现朋友圈功能需要借助不少的技术,需要综合运用各种技术,才能开发出一个完整的朋友圈应用。而且需要注意的是,在功能实现的同时,需要保证应用的性能,确保用户使用起来没有任何问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值