zoukankan      html  css  js  c++  java
  • 用recyclerview实现对话(通过接口实现)

    老规矩首先先上布局

    咱们先看效果

    布局实现

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:background="#ffffff"
        android:layout_height="match_parent">
    
        <include
            android:id="@+id/include"
            layout="@layout/title"></include>
    
        <RelativeLayout
            android:id="@+id/rl_input"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_alignParentBottom="true"
            android:paddingBottom="12dp">
    
            <TextView
                android:id="@+id/tv_send"
                android:layout_width="50dp"
                android:layout_height="35dp"
                android:layout_alignParentRight="true"
                android:layout_alignParentBottom="true"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="25dp"
                android:background="@drawable/send_bg"
                android:gravity="center"
                android:text="发送"
                android:textColor="#ffffffff"
                android:textSize="13sp" />
    
            <ImageView
                android:id="@+id/iv_photo"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_alignTop="@id/tv_send"
                android:layout_alignParentBottom="true"
                android:layout_marginLeft="19dp"
                android:src="@mipmap/photo" />
    
            <EditText
                android:id="@+id/et_input"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="15dp"
                android:layout_toLeftOf="@id/tv_send"
                android:layout_toRightOf="@+id/iv_photo"
                android:background="@drawable/et_bg"
                android:hint="点击输入回复内容"
                android:paddingLeft="5dp"
                android:paddingTop="10dp"
                android:paddingBottom="10dp"
                android:textColor="#ffa5a5a5"
                android:textSize="13sp" />
        </RelativeLayout>
    
        <com.scwang.smartrefresh.layout.SmartRefreshLayout
            android:id="@+id/srl_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@id/rl_input"
            android:layout_below="@id/include"
            app:srlEnableAutoLoadMore="false">
    
            <com.scwang.smartrefresh.layout.header.ClassicsHeader
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:srlTextPulling="@string/down"
                app:srlTextRelease="@string/Release" />
    
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="25dp"
                android:layout_marginRight="25dp"
                android:fadeScrollbars="false"
                android:nestedScrollingEnabled="false"
                android:scrollbars="none"
                android:visibility="visible" />
        </com.scwang.smartrefresh.layout.SmartRefreshLayout>
    
    
    </RelativeLayout>
    

     java代码

    我觉得最主要就是这两句一个是刷新列表(获取到有新的数据就刷新)下一句是把数据添加到最下面一行

    myDetailsAdapter.notifyDataSetChanged();
    recycler_view.scrollToPosition(myDetailsAdapter.getItemCount() - 1);

     

    public class FeedbackDetails extends Activity {
        private View include;
        private ImageView iv_back, iv_photo;
        private RecyclerView recycler_view;
        private TextView tv_send;
        private EditText et_input;
        private MyDetailsAdapter myDetailsAdapter;
        public static RelativeLayout rl_input;
        //反馈信息序列号
        private String serialNumber;
        //信息工具类
        private List<MyFeedbackDetailsModel> myFeedbackDetailsModel = new ArrayList<>();
        //上一页传递数据
        long feedbackTime;
        String content;
        //图片1
        String img1;
        //图片1
        String img2;
        //图片1
        String img3;
        //是否已解决
        int state;
        //是否显示已解决 未解决
        boolean no;
        //线程传递数据
        private Message send_message;
        //页码
        private int pageNum = 1;
        //每页条数
        private int pageSize = 10;
        public static final int CHOOSE_PHOTO = 2;// 相册
        //下拉刷新
        private RefreshLayout srl_layout;
        //获取图片
        private File headFile = null;
        private Dialog mWeiboDialog;
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 100) {
                    myDetailsAdapter.notifyDataSetChanged();
                    recycler_view.scrollToPosition(myDetailsAdapter.getItemCount() - 1);
                } else if (msg.what == 2) {
                    WeiboDialogUtils.closeDialog(mWeiboDialog);
    //                AlertDialog.Builder builder = new AlertDialog.Builder(FeedbackDetails.this);
    //                builder.setTitle("提交成功");
                }
                super.handleMessage(msg);
            }
        };
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
           /* Configuration mConfiguration = this.getResources().getConfiguration(); //获取设置的配置信息
            int ori = mConfiguration.orientation; //获取屏幕方向
            if (ori == mConfiguration.ORIENTATION_LANDSCAPE) {
                //横屏
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//强制为竖屏
            } else if (ori == mConfiguration.ORIENTATION_PORTRAIT) {
                //竖屏
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制为横屏
            }*/
    //横竖屏切换 Configuration cf = this.getResources().getConfiguration(); int ori = cf.orientation; if (ori == cf.ORIENTATION_LANDSCAPE) { setContentView(R.layout.feedback_details); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if (ori == cf.ORIENTATION_PORTRAIT) { setContentView(R.layout.feedback_details); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏 } setInit(); setOnclick(); } private void setInit() {
    //从前一页获取数据 Intent intent = getIntent(); serialNumber = intent.getStringExtra("serialNumber"); feedbackTime = intent.getLongExtra("feedbackTime", 0); content = intent.getStringExtra("content"); img1 = intent.getStringExtra("img1"); img2 = intent.getStringExtra("img2"); img3 = intent.getStringExtra("img3"); state = intent.getIntExtra("state", 0); srl_layout = findViewById(R.id.srl_layout); no = true; getdata(); include = findViewById(R.id.include); iv_back = include.findViewById(R.id.iv_back); tv_send = findViewById(R.id.tv_send); iv_photo = findViewById(R.id.iv_photo); et_input = findViewById(R.id.et_input); recycler_view = findViewById(R.id.recycler_view); rl_input = findViewById(R.id.rl_input); //设置布局管理器 LinearLayoutManager mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recycler_view.setLayoutManager(mLayoutManager); myFeedbackDetailsModel.add(new MyFeedbackDetailsModel(content, "0", "0", "3", null, feedbackTime, img1, img2, img3, null, 0,no)); } private void setOnclick() { //设置adapter myDetailsAdapter = new MyDetailsAdapter(myFeedbackDetailsModel, this); recycler_view.setAdapter(myDetailsAdapter); recycler_view.scrollToPosition(myDetailsAdapter.getItemCount() - 1);//此句为设置显示 //设置Item添加和移除的动画 recycler_view.setItemAnimator(new DefaultItemAnimator());
    //刷新 srl_layout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(RefreshLayout refreshlayout) { pageNum++; getdata(); myDetailsAdapter.notifyDataSetChanged(); refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败 } }); iv_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); tv_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取用户输入 String text = et_input.getText().toString(); //用户输入发送到网络上 setsend(text, null); //内容发送成功之后清空输入文本框 et_input.setText(""); } }); iv_photo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { show(); } }); myDetailsAdapter.setOnItemClickListener(new MyDetailsAdapter.OnItemClickListener() { @Override public void ontv_no(View v) { setsend("0", null); rl_input.setVisibility(View.GONE); } @Override public void ontv_yes(View v) { setsend("1", null); no = false; } }); } private void show() { final Dialog dialog = new Dialog(this, R.style.ActionSheetDialogStyle); View inflate = LayoutInflater.from(this).inflate(R.layout.dialog_item, null); //相册 Button bt_camera = inflate.findViewById(R.id.bt_camera); //取消 Button bt_cancel = inflate.findViewById(R.id.bt_cancel); dialog.setContentView(inflate); Window dialogWindow = dialog.getWindow(); dialogWindow.setGravity(Gravity.BOTTOM); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.y = 20; dialogWindow.setAttributes(lp); bt_cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); } }); bt_camera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); if (ContextCompat.checkSelfPermission(FeedbackDetails.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(FeedbackDetails.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } else { openAlbum(); } } }); dialog.show(); } private void openAlbum() { // Intent intent = new Intent(Intent.ACTION_PICK, null); // intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); // startActivityForResult(intent, CHOOSE_PHOTO); Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); startActivityForResult(intent, CHOOSE_PHOTO);//打开相册 } //相册 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { openAlbum(); } else { Toast.makeText(this, "你拒绝了权限申请,可能无法打开相册哟", Toast.LENGTH_SHORT).show(); } break; default: } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CHOOSE_PHOTO: if (resultCode == RESULT_OK) { // 判断手机系统版本号 if (Build.VERSION.SDK_INT >= 19) { // 4.4及以上系统使用这个方法处理图片 handleImageOnKitKat(data); } else { // 4.4以下系统使用这个方法处理图片 handleImageBeforeKitKat(data); } } break; default: break; } } @TargetApi(19) private void handleImageOnKitKat(Intent data) { String imagePath = null; Uri uri = data.getData(); if (DocumentsContract.isDocumentUri(this, uri)) { // 如果是document类型的Uri,则通过document id处理 String docId = DocumentsContract.getDocumentId(uri); if ("com.android.providers.media.documents".equals(uri.getAuthority())) { String id = docId.split(":")[1]; // 解析出数字格式的id String selection = MediaStore.Images.Media._ID + "=" + id; imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection); } else if ("com.android.providers.downloads.documents".equals(uri. getAuthority())) { Uri contentUri = ContentUris.withAppendedId(Uri.parse("content: downloads/public_downloads"), Long.valueOf(docId)); imagePath = getImagePath(contentUri, null); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { // 如果是content类型的Uri,则使用普通方式处理 imagePath = getImagePath(uri, null); } else if ("file".equalsIgnoreCase(uri.getScheme())) { // 如果是file类型的Uri,直接获取图片路径即可 imagePath = uri.getPath(); } displayImage(imagePath); // 根据图片路径显示图片 // mWeiboDialog = WeiboDialogUtils.createLoadingDialog(FeedbackDetails.this, "加载中..."); // handler.sendEmptyMessageDelayed(1, 2000); } private void handleImageBeforeKitKat(Intent data) { Uri uri = data.getData(); String imagePath = getImagePath(uri, null); displayImage(imagePath); // mWeiboDialog = WeiboDialogUtils.createLoadingDialog(FeedbackDetails.this, "加载中..."); // handler.sendEmptyMessageDelayed(1, 2000); } private String getImagePath(Uri uri, String selection) { String path = null; // 通过Uri和selection来获取真实的图片路径 Cursor cursor = getContentResolver().query(uri, null, selection, null, null); if (cursor != null) { if (cursor.moveToFirst()) { path = cursor.getString(cursor.getColumnIndex(MediaStore. Images.Media.DATA)); } cursor.close(); } return path; } private void displayImage(String imagePath) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; // Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options); Bitmap bitmap1 = getBitmapFromUri(this, getImageContentUri(this, imagePath)); if (bitmap1 != null) { headFile = saveMyBitmap(bitmap1, "head"); upphoto(headFile); } else { Toast.makeText(this, "获取图片失败", Toast.LENGTH_SHORT).show(); } } // 通过uri加载图片 public static Bitmap getBitmapFromUri(Context context, Uri uri) { try { ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); parcelFileDescriptor.close(); return image; } catch (Exception e) { e.printStackTrace(); } return null; } public static Uri getImageContentUri(Context context, String path) { Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", new String[]{path}, null); if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else { // 如果图片不在手机的共享图片数据库,就先把它插入。 if (new File(path).exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, path); return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } } //将bitmap转化为png格式 //首先获取了系统相册的地址,然后每次我拍下照片或者选择照片时, // 都进行简单的压缩,因为图片要上传到服务器进行审核管理,做成微信头像之类的超级压缩方法有损画质, // 所以我只是进行了简单的压缩上传最后写成一个文件。(在第二个页面的时候可能会有几个问题, // 三个ImageView即是三个bitmap,三个File文件。如何判断及正确的显示,我们可以定义成全局变量, // 因为都是点击事件,所以bitmap会在点击后修改,然后保存下来。 public File saveMyBitmap(Bitmap mBitmap, String prefix) { File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); File file = null; try { file = File.createTempFile( prefix, /* prefix */ ".jpg" // , /* suffix */ // storageDir /* directory */ ); FileOutputStream fos = new FileOutputStream(file); //创建一个字节数组输出流对象 //Bitmap.CompressFormat format 图像的压缩格式; //int quality 图像压缩率,0-100。 0 压缩100%,100意味着不压缩; //OutputStream stream 写入压缩数据的输出流; mBitmap.compress(Bitmap.CompressFormat.JPEG, 50, fos);//通过bitmap中的compress,将图片压缩到os流对象中. //其中第二个参数quality,为100表示不压缩,如果为80,表示压缩百分之20. // Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth()/2, mBitmap.getHeight()/2, true); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } return file; } //发送消息请求 public void setsend(final String text, final String bitmap) { //开启线程来发起网络请求 new Thread(new Runnable() { @Override public void run() { try { MediaType JSON = MediaType.parse("application/json; charset=utf-8"); JSONObject json = new JSONObject(); try { //反馈信息序列号 json.put("serialNumber", serialNumber); //消息内容 if (text.isEmpty()) { json.put("message", bitmap); //消息类型(0:文本;1:图片;2:系统) json.put("type", "1"); } else if (text.equals("0")) { json.put("message", text); //消息类型(0:文本;1:图片;2:系统) json.put("type", "2"); } else if (text.equals("1")) { json.put("message", text); //消息类型(0:文本;1:图片;2:系统) json.put("type", "2"); } else { json.put("message", text); //消息类型(0:文本;1:图片;2:系统) json.put("type", "0"); } } catch (JSONException e) { e.printStackTrace(); } //1 . 拿到OkHttpClient对象 OkHttpClient client = new OkHttpClient(); //创建一个RequestBody(参数1:数据类型 参数2传递的json串) RequestBody requestBody = RequestBody.create(JSON, String.valueOf(json)); //3 . 构建Request,将FormBody作为Post方法的参数传入 Request request = new Request.Builder() .url("http://172.28.60.97:8200/ZYGameServer_v2/app/v2/sendMessage") .post(requestBody) .build(); Response response = client.newCall(request).execute(); String responseData = response.body().string(); getfeedback(responseData); } catch (IOException e) { e.printStackTrace(); } } //一个JSON对象——JSONObject{} //一个JSON数组——JSONArray[] private void getfeedback(String responseData) { try { JSONObject jsonObject1 = new JSONObject(responseData); String code = jsonObject1.getString("code"); if (code.equals("0")) { myFeedbackDetailsModel.clear(); pageNum = 1; myFeedbackDetailsModel.add(new MyFeedbackDetailsModel(content, "0", "0", "3", null, feedbackTime, img1, img2, img3, null, 0,no)); getdata(); } } catch (JSONException e) { e.printStackTrace(); } } }).start(); } //上传图片 private void upphoto(final File bitmap) { mWeiboDialog = WeiboDialogUtils.createLoadingDialog(FeedbackDetails.this, "加载中..."); //开启线程来发起网络请求 new Thread(new Runnable() { @Override public void run() { try { //1 . 拿到OkHttpClient对象 OkHttpClient client = new OkHttpClient(); // MediaType.parse() 里面是上传的文件类型。 MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); if (bitmap != null) { RequestBody body = RequestBody.create(MediaType.parse("image/*"), bitmap); // 参数分别为, 请求key ,文件名称 , RequestBody builder.addFormDataPart("zyFile", bitmap.getName(), body); } MultipartBody requestBody = builder.build(); // 3 . 构建Request,将FormBody作为Post方法的参数传入 Request request = new Request.Builder() .url("http://172.28.60.97:8200/ZYGameServer_v2/v1/upload/feedback") .post(requestBody) .build(); Response response = client.newCall(request).execute(); String responseData = response.body().string(); getfeedback(responseData); } catch (IOException e) { e.printStackTrace(); } } //一个JSON对象——JSONObject{} //一个JSON数组——JSONArray[] private void getfeedback(String responseData) { try { Log.i("zyag", responseData); JSONObject jsonObject1 = new JSONObject(responseData); String path = jsonObject1.getString("path"); setsend("", path); //借用线程来为传图片加加载动画 具体思路当图片上传成功后调用 handler.sendEmptyMessageDelayed(2, 0); } catch (JSONException e) { e.printStackTrace(); } } }).start(); } //请求显示数据 private void getdata() { //开启线程来发起网络请求 new Thread(new Runnable() { @Override public void run() { try { MediaType JSON = MediaType.parse("application/json; charset=utf-8"); JSONObject json = new JSONObject(); try { json.put("serialNumber", serialNumber); json.put("pageNum", pageNum); json.put("pageSize", pageSize); } catch (JSONException e) { e.printStackTrace(); } //1 . 拿到OkHttpClient对象 OkHttpClient client = new OkHttpClient(); //创建一个RequestBody(参数1:数据类型 参数2传递的json串) RequestBody requestBody = RequestBody.create(JSON, String.valueOf(json)); //3 . 构建Request,将FormBody作为Post方法的参数传入 Request request = new Request.Builder() .url("http://172.28.60.97:8200/ZYGameServer_v2/app/v2/getChatInfoByPage") .post(requestBody) .build(); Response response = client.newCall(request).execute(); String responseData = response.body().string(); getfeedback(responseData); } catch (IOException e) { e.printStackTrace(); } } //一个JSON对象——JSONObject{} //一个JSON数组——JSONArray[] private void getfeedback(String responseData) { try { // Log.i("fk",responseData); JSONObject jsonObject1 = new JSONObject(responseData); JSONArray jsonArray = jsonObject1.getJSONArray("data"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); //消息内容 String message = jsonObject.getString("message"); //消息类型(0:文本;1:图片;;2:系统) String type = jsonObject.getString("type"); //0:未读;1:已读 String read = jsonObject.getString("read"); //消息来源(0:用户;1:平台) String source = jsonObject.getString("source"); String isValid = jsonObject.getString("isValid"); // 创建时间 long createTime = jsonObject.getLong("createTime"); myFeedbackDetailsModel.add(new MyFeedbackDetailsModel(message, type, read, source, isValid, createTime, null, null, null, serialNumber, state,no)); } send_message = Message.obtain(); send_message.what = 100; handler.sendMessage(send_message); } catch (JSONException e) { e.printStackTrace(); } } }).start(); } }

     适配器使用了加载多布局(左边一个 右边一个) 

    public class MyDetailsAdapter extends RecyclerView.Adapter {
        private List<MyFeedbackDetailsModel> myFeedbackDetailsModels;
        //判断文字超出三行后显示还是隐藏
        private Boolean flag = true;
        //设置常量
        //平台
        private static final int LEFT = 1;
        //用户
        private static final int RIGHT = 0;
        //头部
        private static final int TITLE = 3;
        private LayoutInflater inflater;
        private Context mContext;
        public MyDetailsAdapter(List<MyFeedbackDetailsModel> myFeedbackDetailsModels, Context context) {
            this.myFeedbackDetailsModels = myFeedbackDetailsModels;
            mContext = context;
            inflater = LayoutInflater.from(mContext);
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            RecyclerView.ViewHolder holder = getViewHolderByViewType(viewType);
            return holder;
        }
    
        //点击事件接口
        protected OnItemClickListener mItemClickListener;
    
        public interface OnItemClickListener {
            void ontv_no(View v);
            void ontv_yes(View v);
        }
    
        public void setOnItemClickListener(OnItemClickListener listener) {
            this.mItemClickListener = listener;
        }
        /**
         * 根据不同的position,设置不同的ViewType
         * position表示当前是第几个Item,通过position拿到当前的Item对象,然后判断这个item对象需要那种视图
         */
        @Override
        public int getItemViewType(int position) {
            if (myFeedbackDetailsModels.get(position).getSource().equals("1")) {
                return LEFT;
            } else if (myFeedbackDetailsModels.get(position).getSource().equals("0")) {
                return RIGHT;
            } else if (myFeedbackDetailsModels.get(position).getSource().equals("null")) {
                return RIGHT;
            } else if (myFeedbackDetailsModels.get(position).getSource().equals("3")) {
                return TITLE;
            }
            return 0;
        }
    
        private RecyclerView.ViewHolder getViewHolderByViewType(int viewType) {
            View left = View.inflate(mContext, R.layout.left_item, null);
            View right = View.inflate(mContext, R.layout.right_item, null);
            View title = View.inflate(mContext, R.layout.title_item, null);
            RecyclerView.ViewHolder holder = null;
            switch (viewType) {
                case LEFT:
                    holder = new ViewHolderLeft(left);
                    break;
                case RIGHT:
                    holder = new ViewHolderRight(right);
                    break;
                case TITLE:
                    holder = new ViewHolderTitle(title);
                    break;
            }
            return holder;
        }
    
        /**
         * 获取图标 bitmap
         *
         * @param context
         * Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)//android 10存储图片地址
         */
        public static synchronized Drawable getBitmap(Context context) {
            PackageManager packageManager = null;
            ApplicationInfo applicationInfo = null;
            try {
                packageManager = context.getApplicationContext()
                        .getPackageManager();
                applicationInfo = packageManager.getApplicationInfo(
                        context.getPackageName(), 0);
            } catch (PackageManager.NameNotFoundException e) {
                applicationInfo = null;
            }
            Drawable d = packageManager.getApplicationIcon(applicationInfo); //xxx根据自己的情况获取drawable
    
    //        Bitmap APKicon;
    //        if(d instanceof BitmapDrawable) {
    //            APKicon  = ((BitmapDrawable)d).getBitmap();
    //        }else{
    //            Bitmap bitmap = Bitmap.createBitmap(d.getIntrinsicWidth(),d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    //            Canvas canvas = new Canvas(bitmap);
    //            d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    //            d.draw(canvas);
    //            APKicon = bitmap;
    //        }
    //        BitmapDrawable bd = (BitmapDrawable) d;
    //        Bitmap bm = bd.getBitmap();
            return d;
        }
        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            // 绑定数据
            MyFeedbackDetailsModel myFeedbackModel = myFeedbackDetailsModels.get(position);
            if (holder instanceof ViewHolderLeft) {
                FeedbackDetails feedbackDetails = new FeedbackDetails();
                //是平台系统IsValid = 1有效 =0无效
                if (myFeedbackModel.getSource().equals("1") && myFeedbackModel.getType().equals("2") && myFeedbackModel.getIsValid().equals("1")) {
                    //如果问题已解决那么就不显示
                    if (myFeedbackModel.getState() == 1) {
                        //布局隐藏
                        feedbackDetails.rl_input.setVisibility(View.GONE);
                    } else {
                        //布局显示
                        if (myFeedbackModel.isNo()){
                            ((ViewHolderLeft) holder).ll_solve.setVisibility(View.VISIBLE);
                        }else {
                            ((ViewHolderLeft) holder).ll_solve.setVisibility(View.GONE);
                        }
    
                        feedbackDetails.rl_input.setVisibility(View.GONE);
                        //点击未解决
                        if (mItemClickListener != null) {
                            ((ViewHolderLeft) holder).tv_no.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    mItemClickListener.ontv_no(v);
                                }
                            });
                        }
                        //已解决
                        if (mItemClickListener != null) {
                            ((ViewHolderLeft) holder).tv_yes.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    mItemClickListener.ontv_yes(v);
                                }
                            });
                        }
                    }
                } else {
                    //是平台的系统的 无效的
                    ((ViewHolderLeft) holder).ll_solve.setVisibility(View.GONE);
                    feedbackDetails.rl_input.setVisibility(View.VISIBLE);
                }
    
                //更换应用头像
                ((ViewHolderLeft) holder).iv_head.setImageDrawable(getBitmap(mContext));
    //            ((ViewHolderLeft) holder).iv_head.setImageBitmap(getBitmap(mContext));
                if (myFeedbackModel.getType().equals("1")) {
                    ((ViewHolderLeft) holder).tv_text.setVisibility(View.GONE);
                    ((ViewHolderLeft) holder).iv_photo.setVisibility(View.VISIBLE);
                    //应用框架显示网络图片
                    Glide.with(mContext)
                            .load(myFeedbackModel.getMessage())
                            .into(((ViewHolderRight) holder).iv_photo);
                    ((ViewHolderLeft) holder).tv_date.setText(getUserDate(myFeedbackModel.getCreateTime()));
                    //放大图片
                    ((ViewHolderLeft) holder).iv_photo.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            view.getContext().startActivity(new Intent(view.getContext(), OtherActivity.class).putExtra("photo", myFeedbackModel.getMessage()),
                                    // 注意这里的sharedView
                                    // Content,View(动画作用view),String(和XML一样)
                                    ActivityOptions.makeSceneTransitionAnimation((Activity) view.getContext(), view, "sharedView").toBundle());
                        }
    
                    });
                } else {
                    ((ViewHolderLeft) holder).tv_text.setText(myFeedbackModel.getMessage());
                    ((ViewHolderLeft) holder).tv_date.setText(getUserDate(myFeedbackModel.getCreateTime()));
                }
            } else if (holder instanceof ViewHolderRight) {
                // 如果设置了回调,则设置点击事件
                String url = FeedbackGlobalManager.getInstanse().getHeadImageStr();
    
                if ((url == null || url == ""|| url.equals(null)||url.isEmpty())) {
                    ((ViewHolderRight) holder).iv_head.setImageResource(R.mipmap.default_head);
    //                ((ViewHolderRight) holder).iv_head.setImageResource(R.drawable.tianjiazhaopian);
                    //headType =0 网络图片
                } else {
                    if (url.startsWith("http")) {
                        //应用框架显示网络图片
                        Glide.with(mContext)
                                .load(url)
                                .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                                .into(((ViewHolderRight) holder).iv_head);
                        //本地图片
                    } else{
                        Bitmap bitmap= getBitmapFromUri(mContext, getImageContentUri(mContext,url));
    //                    Bitmap bitmap = BitmapFactory.decodeFile(url);
    //                    ((ViewHolderRight) holder).iv_head.setImageBitmap(createCircleBitmap(bitmap));
                        ((ViewHolderRight) holder).iv_head.setImageBitmap(bitmap);
                    }
                }
    
    //            }
                if (myFeedbackModel.getType().equals("1")) {
                    ((ViewHolderRight) holder).tv_text.setVisibility(View.GONE);
                    ((ViewHolderRight) holder).iv_photo.setVisibility(View.VISIBLE);
                    //应用框架显示网络图片
                    //指定图片大小
    //                RequestOptions options = new RequestOptions()
    //                        .override(250, 250);
    //                initphoto(myFeedbackModel.getMessage(),((ViewHolderRight) holder).iv_photo);
    
                    Glide.with(mContext)
                            .load(myFeedbackModel.getMessage())
                            .into(((ViewHolderRight) holder).iv_photo);
    
                    ((ViewHolderRight) holder).tv_date.setText(getUserDate(myFeedbackModel.getCreateTime()));
                    ((ViewHolderRight) holder).iv_photo.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            view.getContext().startActivity(new Intent(view.getContext(), OtherActivity.class).putExtra("photo", myFeedbackModel.getMessage()),
                                    // 注意这里的sharedView
                                    // Content,View(动画作用view),String(和XML一样)
                                    ActivityOptions.makeSceneTransitionAnimation((Activity) view.getContext(), view, "sharedView").toBundle());
                        }
    
                    });
                } else {
                    ((ViewHolderRight) holder).tv_text.setVisibility(View.VISIBLE);
                    ((ViewHolderRight) holder).iv_photo.setVisibility(View.GONE);
                    ((ViewHolderRight) holder).tv_text.setText(myFeedbackModel.getMessage());
                    ((ViewHolderRight) holder).tv_date.setText(getUserDate(myFeedbackModel.getCreateTime()));
                }
            } else if (holder instanceof ViewHolderTitle) {
                //文字显示超过三行隐藏 点击展开才显示
                ((ViewHolderTitle) holder).tv_text.setText(myFeedbackModel.getMessage());
                ((ViewHolderTitle) holder).tv_text.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        if (((ViewHolderTitle) holder).tv_text.getLineCount() >= 3) {
                            ((ViewHolderTitle) holder).iv_more.setVisibility(View.VISIBLE);
    //                        ((ViewHolderTitle) holder).iv_more.setImageResource(R.mipmap.more_open);
                        } else {
                            ((ViewHolderTitle) holder).iv_more.setVisibility(View.GONE);
                        }
                    }
                });
                ((ViewHolderTitle) holder).iv_more.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (flag) {
                            flag = false;
                            ((ViewHolderTitle) holder).iv_more.setImageResource(R.mipmap.more);
                            ((ViewHolderTitle) holder).tv_text.setEllipsize(null);//展开
                            ((ViewHolderTitle) holder).tv_text.setMaxLines(Integer.MAX_VALUE);//把TextView行数显示取消掉
                            ((ViewHolderTitle) holder).tv_text.setSingleLine(false);//这个方法是必须设置的,否则无法展开
                        } else {
                            flag = true;
                            ((ViewHolderTitle) holder).iv_more.setImageResource(R.mipmap.more_open);
                            ((ViewHolderTitle) holder).tv_text.setEllipsize(TextUtils.TruncateAt.END); // 收缩
                            ((ViewHolderTitle) holder).tv_text.setMaxLines(3);
                        }
                    }
                });
                ((ViewHolderTitle) holder).tv_date.setText(getUserDate(myFeedbackModel.getCreateTime()));
                //判断是否有图片
                if (myFeedbackModel.getImg1().equals("null")) {
                    ((ViewHolderTitle) holder).ll_img.setVisibility(View.GONE);
                } else {
                    ((ViewHolderTitle) holder).ll_img.setVisibility(View.VISIBLE);
                    //应用框架显示网络图片
                    Glide.with(mContext)
                            .load(myFeedbackModel.getImg1())
                            .into(((ViewHolderTitle) holder).iv_img1);
                    //放大图片
                    ((ViewHolderTitle) holder).iv_img1.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            view.getContext().startActivity(new Intent(view.getContext(), OtherActivity.class).putExtra("photo", myFeedbackModel.getImg1()),
                                    // 注意这里的sharedView
                                    // Content,View(动画作用view),String(和XML一样)
                                    ActivityOptions.makeSceneTransitionAnimation((Activity) view.getContext(), view, "sharedView").toBundle());
                        }
    
                    });
    //            应用框架显示网络图片
                    Glide.with(mContext)
                            .load(myFeedbackModel.getImg2())
                            .into(((ViewHolderTitle) holder).iv_img2);
                    //放大图片
                    ((ViewHolderTitle) holder).iv_img2.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            view.getContext().startActivity(new Intent(view.getContext(), OtherActivity.class).putExtra("photo", myFeedbackModel.getImg2()),
                                    // 注意这里的sharedView
                                    // Content,View(动画作用view),String(和XML一样)
                                    ActivityOptions.makeSceneTransitionAnimation((Activity) view.getContext(), view, "sharedView").toBundle());
                        }
    
                    });
                    //应用框架显示网络图片
                    Glide.with(mContext)
                            .load(myFeedbackModel.getImg3())
                            .into(((ViewHolderTitle) holder).iv_img3);
                    //放大图片
                    ((ViewHolderTitle) holder).iv_img3.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            view.getContext().startActivity(new Intent(view.getContext(), OtherActivity.class).putExtra("photo", myFeedbackModel.getImg3()),
                                    // 注意这里的sharedView
                                    // Content,View(动画作用view),String(和XML一样)
                                    ActivityOptions.makeSceneTransitionAnimation((Activity) view.getContext(), view, "sharedView").toBundle());
                        }
    
                    });
                }
    
            }
        }
        // 通过uri加载图片
        public static Bitmap getBitmapFromUri(Context context, Uri uri) {
            try {
                ParcelFileDescriptor parcelFileDescriptor =
                        context.getContentResolver().openFileDescriptor(uri, "r");
                FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
                Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
                parcelFileDescriptor.close();
                return image;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Uri getImageContentUri(Context context, String path) {
            Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
                    new String[] { path }, null);
            if (cursor != null && cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
                Uri baseUri = Uri.parse("content://media/external/images/media");
                return Uri.withAppendedPath(baseUri, "" + id);
            } else {
                // 如果图片不在手机的共享图片数据库,就先把它插入。
                if (new File(path).exists()) {
                    ContentValues values = new ContentValues();
                    values.put(MediaStore.Images.Media.DATA, path);
                    return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                } else {
                    return null;
                }
            }
        }
    
    //    private Bitmap createCircleBitmap(Bitmap resource)
    //    {
    //        //获取图片的宽度
    //        int width = resource.getWidth();
    //        Paint paint = new Paint();
    //        //设置抗锯齿
    //        paint.setAntiAlias(true);
    //        //创建一个与原bitmap一样宽度的正方形bitmap
    //        Bitmap circleBitmap = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888);
    //        //以该bitmap为低创建一块画布
    //        Canvas canvas = new Canvas(circleBitmap);
    //        //以(width/2, width/2)为圆心,width/2为半径画一个圆
    //        canvas.drawCircle(width/2, width/2, width/2, paint);
    //
    //        //设置画笔为取交集模式
    //        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    //        //裁剪图片
    //        canvas.drawBitmap(resource, 0, 0, paint);
    //
    //        return circleBitmap;
    //    }
        public static String getUserDate(long sformat) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String sd = formatter.format(new Date(sformat));   // 时间戳转换成时间     (这里也是毫秒时间戳)
            return sd;
        }
    
        @Override
        public int getItemCount() {
            return myFeedbackDetailsModels == null ? 0 : myFeedbackDetailsModels.size();
        }
    
        private class ViewHolderLeft extends RecyclerView.ViewHolder {
            TextView tv_date, tv_text, tv_no, tv_yes;
            ImageView iv_head, iv_photo;
            LinearLayout ll_solve;
    
            public ViewHolderLeft(View itemView) {
                super(itemView);
                tv_date = itemView.findViewById(R.id.tv_date);
                tv_text = itemView.findViewById(R.id.tv_text);
                iv_head = itemView.findViewById(R.id.iv_head);
                iv_photo = itemView.findViewById(R.id.iv_photo);
                ll_solve = itemView.findViewById(R.id.ll_solve);
    
                tv_no = itemView.findViewById(R.id.tv_no);
                tv_yes = itemView.findViewById(R.id.tv_yes);
    
            }
        }
    
        private class ViewHolderRight extends RecyclerView.ViewHolder {
            TextView tv_date, tv_text;
            ImageView iv_head;
            ImageView iv_photo;
    
            public ViewHolderRight(View itemView) {
                super(itemView);
                tv_date = itemView.findViewById(R.id.tv_date);
                tv_text = itemView.findViewById(R.id.tv_text);
                iv_head = itemView.findViewById(R.id.iv_head);
                iv_photo = itemView.findViewById(R.id.iv_photo);
                iv_head = itemView.findViewById(R.id.iv_head);
            }
        }
    
        private class ViewHolderTitle extends RecyclerView.ViewHolder {
            TextView tv_date, tv_text;
            ImageView iv_head;
            ImageView iv_img1, iv_img2, iv_img3, iv_more;
            LinearLayout ll_img;
    
            public ViewHolderTitle(View itemView) {
                super(itemView);
                tv_date = itemView.findViewById(R.id.tv_date);
                tv_text = itemView.findViewById(R.id.tv_text);
                iv_head = itemView.findViewById(R.id.iv_head);
                //图片一
                iv_img1 = itemView.findViewById(R.id.iv_img1);
                //图片二
                iv_img2 = itemView.findViewById(R.id.iv_img2);
                //图片三
                iv_img3 = itemView.findViewById(R.id.iv_img3);
                //显示更多
                iv_more = itemView.findViewById(R.id.iv_more);
                //图片布局
                ll_img = itemView.findViewById(R.id.ll_img);
    }

    布局我就贴一个另一个和这个差不多

    这个一样也需要一个工具类具体可以参照我的另一篇文章

    可能写的不是很好但是我会慢慢努力使它变好

  • 相关阅读:

    如何找回自己!
    身体锻炼靶心心率!
    圣人言大任之人!
    如何修清净心?(净空老法师法语)
    vim 查询定位!
    深切悼念灾区遇难同胞!
    求后倒零
    植物大战僵尸【二分答案, 加贪心思想】
    植物大战僵尸【二分答案, 加贪心思想】
  • 原文地址:https://www.cnblogs.com/wang-jingyuan/p/12175127.html
Copyright © 2011-2022 走看看