0

我是android开发的初学者。我正在创建一个应用程序,其中有带有 CardView 的 recycleView。在cardview 里面我使用一个TextView 和一个Switch 按钮。当我将按钮值更改为服务器时,它会在那里更新。

我想知道如何为每个凌空响应更新我的 ViewHolder 类。因为如果 ViewHolder 下一次不更新,则服务器中的值不会改变,但 Switch Button 会改变侧面。

主类.java

public class Light extends Fragment {

public static final String light_url = "http://192.168.0.7:8080/bizzonthego/Android/device_status.php";
private List<ItemList> LightList;
private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;

View v;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    v = inflater.inflate(R.layout.light, container, false);

    recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);


    LightList = new ArrayList<>();
    new Handler().postAtTime(new Runnable() {
        @Override
        public void run() {

            getData();

        }
    }, 1000);



    return v;
}

@Override
public void onStart() {
    super.onStart();

}

@Override
public void onResume() {
    super.onResume();
//        new Handler().postDelayed(new Runnable() {
//            @Override
//            public void run() {
//
//                getData();
//
//            }
//        }, 1000);
}

private void getData()
{

 final ProgressDialog loading = ProgressDialog.show(getActivity(), "Loading Data", "Please wait...", false, false);
    JsonArrayRequest jsonArrayRequest =new JsonArrayRequest(light_url, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {


           loading.dismiss();
            parseData(response);


        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    loading.dismiss();
                    Toast.makeText(getActivity(),"error to connect",Toast.LENGTH_SHORT).show();

                }
            });

    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());

    //Adding request to the queue
    requestQueue.add(jsonArrayRequest);

}
private void parseData(JSONArray array){


    for(int i = 0; i<array.length(); i++) {
        ItemList lightValue = new ItemList();
        JSONObject json = null;
        try {
            json = array.getJSONObject(i);
            String battery = json.getString("device");
            String status = json.getString("status");


            lightValue.setItem(battery);
            lightValue.setStatus(status);

        } catch (JSONException e) {
            e.printStackTrace();
        }

        LightList.add(lightValue);
    }



    //Finally initializing our adapter
    adapter = new CardView(LightList,getActivity());
    adapter.notifyDataSetChanged();

    //Adding adapter to recyclerview
    recyclerView.setAdapter(adapter);

    }
}

ViewHolder.java

public class CardView extends RecyclerView.Adapter<CardView.ViewHolder>{

List<ItemList> items;
private Context context;
public static final String POST_SWITCH_URL = "http://192.168.0.7:8080/bizzonthego/Android/device_control.php";



public CardView(List<ItemList> item, Context context){
    super();
//        items = new ArrayList<ItemList>();
//                   ItemList item = new ItemList();
//            item.setItem(names);
//
//            items.add(item);
    this.items = item;
    this.context =context;

}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.permisies_cardview, parent, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    final ItemList list =  items.get(position);

    holder.textViewName.setText(list.getItem());
    final String device = list.getItem();

    if(list.getStatus().equals("0"))
    {
        holder.mySwitch.setChecked(false);
        holder.mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                StringRequest stringRequest = new StringRequest(Request.Method.POST,POST_SWITCH_URL ,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String s) {

                                Toast.makeText(context, s, Toast.LENGTH_LONG).show();


                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError volleyError) {


                                //Showing toast
                                Toast.makeText(context, "error to connect", Toast.LENGTH_LONG).show();
                            }
                        }) {
                    @Override
                    protected java.util.Map<String, String> getParams() throws AuthFailureError {

                        Map<String, String> params = new Hashtable<String, String>();
                        final String control = "1";

                        params.put("device",device);
                        params.put("control",control);




                        return params;
                    }
                };

                //Creating a Request Queue
                RequestQueue requestQueue = Volley.newRequestQueue(context);

                //Adding request to the queue

                requestQueue.add(stringRequest);

            }
        });


    } else if(list.getStatus().equals("1"))
    {
        holder.mySwitch.setChecked(true);
        holder.mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                StringRequest stringRequest = new StringRequest(Request.Method.POST,POST_SWITCH_URL ,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String s) {

                                Toast.makeText(context, s, Toast.LENGTH_LONG).show();


                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError volleyError) {


                                //Showing toast
                                Toast.makeText(context, "error to connect", Toast.LENGTH_LONG).show();
                            }
                        }) {
                    @Override
                    protected java.util.Map<String, String> getParams() throws AuthFailureError {

                        Map<String, String> params = new Hashtable<String, String>();
                        final String control = "0";

                        params.put("device",device);
                        params.put("control",control);




                        return params;
                    }
                };

                //Creating a Request Queue
                RequestQueue requestQueue = Volley.newRequestQueue(context);

                //Adding request to the queue
                requestQueue.add(stringRequest);

            }
        });


    }




}

@Override
public int getItemCount() {
    return items.size();
}

class ViewHolder extends RecyclerView.ViewHolder{

    public TextView textViewName;
    public SwitchCompat mySwitch;


    public ViewHolder(View itemView) {
        super(itemView);


        textViewName = (TextView) itemView.findViewById(R.id.textViewName);
        mySwitch = (SwitchCompat) itemView.findViewById(R.id.switchbtn);

    }
}

}
4

2 回答 2

1

首先,在 onCreate 方法中创建适配器并保留它:

mAdapter = new CardView(getActivity());
recyclerView.setAdapter(mAdapter);

在适配器上创建一个新方法来更新数据,例如:

mAdapter.updateItems(...);

最后,当您从服务获得响应时,您只需要调用 updateItems 方法并通知更改

mAdapter.notifyDataSetChanged();

希望这可以帮助!

于 2016-06-09T09:37:01.303 回答
0

您必须在 BindViewHolder 中为您的开关设置标签,以找出已单击哪个项目以更新列表项。

**holder.mySwitch.setTag(position);**

之后,一旦您收到凌空响应,请更新您的ItemList

 holder.mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

          **final CompoundButton mySwitch=buttonView;**
                StringRequest stringRequest = new StringRequest(Request.Method.POST,POST_SWITCH_URL ,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String s) {

                                Toast.makeText(context, s, Toast.LENGTH_LONG).show();
                           //Got success response from volley

 **int sPosition=mySwitch.getTag();
items.get(sPosition).setItem("YOUR TEXT");
notifyDataSetChanged();**


                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError volleyError) {


                                //Showing toast
                                Toast.makeText(context, "error to connect", Toast.LENGTH_LONG).show();
                            }
                        }) {
                    @Override
                    protected java.util.Map<String, String> getParams() throws AuthFailureError {

                        Map<String, String> params = new Hashtable<String, String>();
                        final String control = "0";

                        params.put("device",device);
                        params.put("control",control);




                        return params;
                    }
                };

                //Creating a Request Queue
                RequestQueue requestQueue = Volley.newRequestQueue(context);

                //Adding request to the queue
                requestQueue.add(stringRequest);

            }
        });
于 2016-06-09T10:08:30.170 回答