在一个Recycler View 同时写入多个布局

在项目中,根据需求我需要在一个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);
                        }
                    }
                });
            }
        });
    }


}
发布了19 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xyzahaha/article/details/84989287