在项目中,根据需求我需要在一个recyclerView中潜逃不同的布局,但是因为以前一直用的多个List View混合使用,写这个布局主要是在Adapter中:看代码:
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.administrator.yun.Login;
import com.example.administrator.yun.R;
import com.example.administrator.yun.allUtils.ExceptionToServer;
import com.example.administrator.yun.allUtils.Exit_app;
import com.example.administrator.yun.allUtils.GetNewsNameUtils;
import com.example.administrator.yun.allUtils.IsWifiStatus;
import com.example.administrator.yun.allUtils.ItemDialog;
import com.example.administrator.yun.allUtils.Logutil;
import com.example.administrator.yun.allUtils.Reback_infor;
import com.example.administrator.yun.allUtils.RequestUrl;
import com.example.administrator.yun.allUtils.ToastUtil;
import com.example.administrator.yun.allUtils.Token_UserId;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class EquipmentUpAdapter extends RecyclerView.Adapter implements ItemChange{
private static final int TYPE_UP_BODY = 1;
private static final int TYPE_UNDER_BODY = 2;
View view;
private SharedPreferences sp;//存span与地址
private Reback_infor rebackinfor;//获取服务器回调的数据
private String token, user_id;//token
private Context context;
private List<EquipmentBean> router = new ArrayList<>();
private Handler mhandler = new Handler();
private String device_name;
private Call call;
private EquipmentManagement equipmentManagement;
private String payload;//我想使用局部刷新但是一直不知道为什么传的payloads为空,所以自定义了一个
//回调接口
private UpdataUi upUi;
public void EquipmentAdapter(UpdataUi upUi) {
this.upUi = upUi;
}
public EquipmentUpAdapter(Context context, List<EquipmentBean> router) {
this.context = context;
this.router = router;
//获取来自activity的接口的数据
equipmentManagement = (EquipmentManagement)context;
equipmentManagement.EquipmentManagement(this);
}
@Override
public void itemChange(int position, String pay) {
payload = pay;
notifyItemChanged(position,pay);
}
//在这开始使用不同的布局
@Override
public int getItemViewType(int position) {
EquipmentBean bean = router.get(position);
if (bean.getType()==TYPE_UP_BODY){
return TYPE_UP_BODY;
}else if (bean.getType()==TYPE_UNDER_BODY){
return TYPE_UNDER_BODY;
}
return bean.getType();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if (i == TYPE_UP_BODY) {
view = LayoutInflater.from(context).inflate(R.layout.frag_home_equipment_item1,viewGroup,false);
return new upBody(view);
} else if (i == TYPE_UNDER_BODY) {
view = LayoutInflater.from(context).inflate(R.layout.frag_home_equipment_item2,viewGroup,false);
return new underBody(view);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List payloads) {
super.onBindViewHolder(holder, position, payloads);
try {
EquipmentBean equipmentBean = router.get(position);
if (payloads.isEmpty()){
if (payload.equals("upData")) {
onBindViewHolder(holder, position);
}else if (payload.equals("/edit_device")){
((upBody)holder).router_name.setText(device_name);
}else if (payload.equals("statu")){
Logutil.i("-->","-->"+holder.getItemViewType());
Logutil.i("-->","-->"+holder.getItemId());
Logutil.i("-->","-->"+holder.getLayoutPosition());
((upBody)holder).runTime.setText(equipmentBean.getUptime());
((upBody)holder).statue.setText(equipmentBean.getStatus());
((upBody)holder).router_version.setText(equipmentBean.getVer());
}else if (payload.equals("statuColor")){
((upBody)holder).runTime.setText(equipmentBean.getUptime());
((upBody)holder).statue.setText(equipmentBean.getStatus());
((upBody)holder).router_version.setText(equipmentBean.getVer());
((upBody)holder).router_version.getResources().getColor(R.color.red);
}
}else if (payloads.get(0).toString().equals("upData")) {
onBindViewHolder(holder, position);
}else if (payloads.get(0).toString().equals("/edit_device")){
((upBody)holder).router_name.setText(device_name);
}else if (payloads.get(0).toString().equals("statu")){
((upBody)holder).runTime.setText(equipmentBean.getUptime());
((upBody)holder).statue.setText(equipmentBean.getStatus());
((upBody)holder).router_version.setText(equipmentBean.getVer());
}else if (payloads.get(0).toString().equals("statuColor")){
((upBody)holder).runTime.setText(equipmentBean.getUptime());
((upBody)holder).statue.setText(equipmentBean.getStatus());
((upBody)holder).router_version.setText(equipmentBean.getVer());
((upBody)holder).router_version.getResources().getColor(R.color.red);
}
}catch (Exception e){
ToastUtil.showToast((Activity) context,"数据异常!",1500);
}
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, final int i) {
EquipmentBean equipmentBean = router.get(i);
if (viewHolder instanceof upBody){
((upBody)viewHolder).router_name.setText(equipmentBean.getRoterName());
((upBody)viewHolder).router_number.setText(equipmentBean.getMach());
((upBody)viewHolder).router_version.setText(equipmentBean.getVer());
((upBody)viewHolder).cpu_version.setText(equipmentBean.getCpu());
((upBody)viewHolder).hardware_id.setText(equipmentBean.getUid());
((upBody)viewHolder).runTime.setText(equipmentBean.getUptime());
((upBody)viewHolder).statue.setText(equipmentBean.getStatus());
((upBody)viewHolder).upRouter.setOnClickListener(new upClick("/upimg",equipmentBean.getIp()));
((upBody)viewHolder).reFresh.setOnClickListener(new upClick("/reboot",equipmentBean.getIp()));
if (equipmentBean.getStatus().equals("本地在线")||equipmentBean.getStatus().equals("待激活")){
((upBody)viewHolder).statue.setOnClickListener(new upClick("/ycdbug",equipmentBean.getIp()));
((upBody)viewHolder).btn_layout.setVisibility(View.VISIBLE);
}else {
((upBody)viewHolder).btn_layout.setVisibility(View.GONE);
}
((upBody)viewHolder).upbodyCard.setOnLongClickListener(new upLongClick(i));
}else if (viewHolder instanceof underBody){
((underBody)viewHolder).under_number.setText(equipmentBean.getMach());
((underBody)viewHolder).under_version.setText(equipmentBean.getVer());
((underBody)viewHolder).under_cpuversion.setText(equipmentBean.getCpu());
((underBody)viewHolder).under_hardware_id.setText(equipmentBean.getUid());
((underBody)viewHolder).under_runTime.setText(equipmentBean.getUptime());
((underBody)viewHolder).under_btn.setOnClickListener(new underClick(i));
}
}
@Override
public int getItemCount() {
return router.size();
}
public TextView reFreData;
private class upBody extends RecyclerView.ViewHolder{
public TextView router_name;
public TextView router_number;
public TextView router_version;
public TextView cpu_version;
public TextView hardware_id;
public TextView runTime;
public TextView statue;
public Button upRouter,reFresh;
public Button under_btn;
LinearLayout layout_under,layout_all ,btn_layout;
CardView upbodyCard,up;
ConstraintLayout under;
public upBody(@NonNull View itemView) {
super(itemView);
router_name = (TextView)itemView.findViewById(R.id.router_name);
statue = (TextView)itemView.findViewById(R.id.statue);
router_number = (TextView)itemView.findViewById(R.id.router_number);
router_version = (TextView)itemView.findViewById(R.id.router_version);
cpu_version = (TextView)itemView.findViewById(R.id.cpu_version);
hardware_id = (TextView)itemView.findViewById(R.id.hardware_id);
runTime = (TextView)itemView.findViewById(R.id.runTime);
upRouter = (Button) itemView.findViewById(R.id.upRouter);
reFresh = (Button) itemView.findViewById(R.id.reFresh);
under_btn = (Button)itemView.findViewById(R.id.under_btn);
btn_layout = (LinearLayout)itemView.findViewById(R.id.btn_layout);
layout_all = (LinearLayout)itemView.findViewById(R.id.layout_all);
layout_under = (LinearLayout)itemView.findViewById(R.id.layout_under);
upbodyCard = (CardView)itemView.findViewById(R.id.upbodyCard);
up = (CardView)itemView.findViewById(R.id.up);
under = (ConstraintLayout)itemView.findViewById(R.id.under);
}
}
private class underBody extends RecyclerView.ViewHolder{
public LinearLayout under;
public ImageView imgview;
public TextView hardwareId;
public TextView under_number;
public TextView under_version;
public TextView under_cpuversion;
public TextView under_hardware_id;
public TextView under_runTime;
public Button under_btn;
public underBody(@NonNull View itemView) {
super(itemView);
under = (LinearLayout)itemView.findViewById(R.id.under);
under_number = (TextView)itemView.findViewById(R.id.under_number);
under_version = (TextView)itemView.findViewById(R.id.under_version);
under_cpuversion = (TextView)itemView.findViewById(R.id.under_cpuversion);
under_hardware_id = (TextView)itemView.findViewById(R.id.under_hardware_id);
under_runTime = (TextView)itemView.findViewById(R.id.under_runTime);
under_btn = (Button)itemView.findViewById(R.id.under_btn);
}
}
private class upLongClick implements View.OnLongClickListener {
private int position;
public upLongClick(int i) {
position=i;
}
@Override
public boolean onLongClick(View v) {
//打开缓存文件名为“login”,并从中获取到"token","id",用于验证用户信息
sp = context.getSharedPreferences("login", Context.MODE_PRIVATE);
token = Token_UserId.token(context);
user_id = Token_UserId.user_id(context);
if (IsWifiStatus.isNetworkConnected(context)){//判断网络状态
View view1 = LayoutInflater.from(context).inflate(R.layout.frag_send_list_longitem, null);
Button btn_change = (Button)view1.findViewById(R.id.change);
Button btn_remove = (Button)view1.findViewById(R.id.remove);
final ItemDialog itemDialog = new ItemDialog(context);
itemDialog.setView(view1);
itemDialog.show();
final String device_key = router.get(position).getUid().toString();
btn_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editDialog(position,"/edit_device");
itemDialog.dismiss();
}
});
btn_remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FormBody.Builder requestbuilder = new FormBody.Builder();
RequestBody builder = requestbuilder
.add("token", token)
.add("user_id", user_id)
.add("device_key",device_key)
.build();
device(builder,"/del_device",position);
itemDialog.dismiss();
}
});
}else {
ToastUtil.showToast((Activity) context,"网络连接失败!",1000);
}
return false;
}
}
private class underClick implements View.OnClickListener {
private int position;
public underClick(int i) {
position=i;
}
@Override
public void onClick(View v) {
editDialog(position,"/use_device");
}
}
private void editDialog(final int position, final String url){
AlertDialog.Builder builder = new AlertDialog.Builder(context);// 自定义对话框
View editView = LayoutInflater.from(context).inflate(R.layout.frag_set_person_edittxt, null);
final EditText etShow = (EditText) editView.findViewById(R.id.edit);
builder.setView(editView)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
String device_key = router.get(position).getUid().toString();
device_name = etShow.getText().toString();
if (device_name.equals("")){
ToastUtil.showToast((Activity) context,"设备名不能为空!",1000);
}else {
sp = context.getSharedPreferences("login", Context.MODE_PRIVATE);
token = Token_UserId.token(context);
user_id = Token_UserId.user_id(context);
FormBody.Builder requestbuilder = new FormBody.Builder();
RequestBody builder = requestbuilder
.add("token", token)
.add("user_id", user_id)
.add("device_name", device_name)
.add("device_key", device_key)
.build();
device(builder, url, position);
}
} catch (Exception e){
Logutil.i("EquipmentUpAdapter","-->"+e);
}
}
})
.setNegativeButton("取消", null)
.show();
}
private void device(final RequestBody builder, final String url, final int position) {
OkHttpClient mokhtttpClient = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build();
call = mokhtttpClient.newCall(RequestUrl.request(builder,(Activity) context,url));
call.enqueue(new Callback() {//enqueue排队
@Override
public void onFailure(Call call, IOException e) {
if (context!=null){
Logutil.w("EquipmentUpAdapter","-->"+e);
ToastUtil.showToast((Activity) context,"网络连接失败!",5000);
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String thead = response.body().string();
mhandler.post(new Runnable() {
@Override
public void run() {
Logutil.e("-->", "-->" + thead);
try {
Gson gson = new Gson();
rebackinfor =gson.fromJson(thead,Reback_infor.class);
if (rebackinfor.getCode().equals("1")){
if (url.equals("/edit_device")){
notifyItemChanged(position,"/edit_device");
}else if (url.equals("/use_device")){
upUi.upData(position,device_name);
// device_name
}else if (url.equals("/del_device")){
router.remove(position);
notifyItemRemoved(position);
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);// 自定义对话框
builder.setMessage(rebackinfor.getMsg())
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.show();
}else {
AlertDialog.Builder builder = new AlertDialog.Builder(context);// 自定义对话框
builder.setMessage(rebackinfor.getMsg())
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (rebackinfor.getCode().toString().equals("400")){
context.startActivity(new Intent(context, Login.class));
Exit_app.getInstance().OutSign();
}
dialog.dismiss();
}
})
.show();
}
} catch (Exception e) {
ExceptionToServer exception = new ExceptionToServer();
GetNewsNameUtils ll =new GetNewsNameUtils();
exception.exception(ll.getHeadSuffix()+":"+e);
Logutil.w("-->","-->"+e);
ToastUtil.showToast((Activity) context,"数据错误,请联系管理员!",5000);
}
}
});
}
});
}
private class upClick implements View.OnClickListener {
private Integer click=0;
private String url;
private String ip;
public upClick(String url,String ip) {
this.url=url;
this.ip=ip;
}
@Override
public void onClick(View v) {
if (url.equals("/upimg")){
upimg();
}else if (url.equals("/reboot")){
reboot();
}else if (url.equals("/ycdbug")){
ycddug();
}
}
//更新设备
private void upimg() {
final ItemDialog itemDialog = new ItemDialog(context);
View view = ((Activity)context).getLayoutInflater().inflate(R.layout.frag_set_router_webview, null);
WebView webView = (WebView) view.findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view,String url) {
itemDialog.setCancelable(true);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
View view1 = ((Activity)context).getLayoutInflater().inflate(R.layout.frag_phone_itemstatu, null);
itemDialog.setView(view1);
}});
webView.loadUrl("http://"+ip.toString().trim()+"/upimg");
itemDialog.setView(view);
itemDialog.setCancelable(false);
itemDialog.show();
}
//重启设备
private void reboot() {
AlertDialog.Builder builder1 = new AlertDialog.Builder(context);
builder1.setMessage("是否想要继续重启该设备?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
OkHttpClient mokhtttpClient = new OkHttpClient();
Request request = new Request.Builder()
.get()
.url("http://"+ip.toString().trim()+url)
.build();
call = mokhtttpClient.newCall(request);
Logutil.e("-->","-->"+ip.toString().trim());
http(call,url); }})
.setNegativeButton("No",null);
builder1.show();
}
//点击本地在线,开始debug
private void ycddug() {
if (click < 5) {
click++;
int onclick = 5 - click;
if (onclick != 0) {
ToastUtil.showToast((Activity)context, "再点击" + onclick + "步", 500);
}
if (click == 5) {
click=0;
ToastUtil.showToast((Activity)context, "正在启动调试功能...", 1000);
OkHttpClient mokhtttpClient = new OkHttpClient();
Request request = new Request.Builder()
.get()
.url("http://"+ip.toString().trim()+url)
.build();
call = mokhtttpClient.newCall(request);
Logutil.e("-->","-->"+ip.toString().trim());
http(call,url);
}
}
}
}
private List<Router_RebootStatu> routerRebootStatu = new ArrayList<>();
private List<Router_DeBug> deBugs=new ArrayList<>();
//请求数据
private void http(Call call, final String url) {
if (routerRebootStatu.size()!=0){
routerRebootStatu.clear();
}
final Gson gson = new Gson();
call.enqueue(new Callback() {//enqueue排队
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String thead = response.body().string();
mhandler.post(new Runnable() {
@Override
public void run() {
Logutil.w("-->","-->"+thead);
try {
if (url.equals("/reboot")){
routerRebootStatu = gson.fromJson(thead,new TypeToken<LinkedList<Router_RebootStatu>>(){}.getType());
} else if (url.equals("/ycdbug")){
Gson gson = new Gson();
deBugs = gson.fromJson(thead,new TypeToken<LinkedList<Router_DeBug>>(){}.getType());
Logutil.e("-->","-->"+deBugs.get(0).getDBUGID());
}
}catch (Exception e){
ExceptionToServer exception = new ExceptionToServer();
GetNewsNameUtils ll =new GetNewsNameUtils();
exception.exception(ll.getHeadSuffix()+":"+e);
ToastUtil.showToast((Activity)context,"数据错误!",3000);
}
}
});
((Activity)context).runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if (url.equals("/reboot")){
Handler handler =new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Logutil.e("==>","-->"+routerRebootStatu.get(0).getStatus().toString().trim());
String xx="0";
if (routerRebootStatu.get(0).getStatus().toString().trim().equals(xx)) {
ToastUtil.showToast((Activity)context, "重启设备成功!", 2000);
}else {
ToastUtil.showToast((Activity)context, "重启失败!", 2000);
}
}
}, 2000);
}else if (url.equals("/ycdbug")){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
View view = ((Activity)context).getLayoutInflater().inflate(R.layout.frag_set_router_debug, null);
TextView textView1 = (TextView)view.findViewById(R.id.debug_txt);
if (deBugs.get(0).getDBUGID()!=null){
textView1.setText("调试结果:"+deBugs.get(0).getDBUGID().toString().trim());
}else {
textView1.setText("错误提示:"+deBugs.get(0).getERROR().toString().trim());
}
builder.setView(view)
.setPositiveButton("Yes",null)
.setPositiveButton("YES",null)
.show();
}
}catch (Exception e){
ExceptionToServer exception = new ExceptionToServer();
GetNewsNameUtils ll =new GetNewsNameUtils();
exception.exception(ll.getHeadSuffix()+":"+e);
ToastUtil.showToast((Activity)context,"数据错误!",3000);
}
}
});
}
});
}
}