老规矩首先先上布局
咱们先看效果


布局实现
<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);
}

布局我就贴一个另一个和这个差不多
这个一样也需要一个工具类具体可以参照我的另一篇文章
可能写的不是很好但是我会慢慢努力使它变好