0

Ich bin Anfänger in Android-Entwicklung. Ich erstelle eine Anwendung, in der es recycleView mit CardView gibt. In Cardview verwende ich einen TextView und einen Switch Button. wenn ich den Knopfwert zum Server ändere, wird es dort aktualisiert.Wie Viewholder-Klasse nach Volley-Antwort zu aktualisieren

Ich möchte wissen, wie ich meine ViewHolder-Klasse für jede Volley-Antwort aktualisieren. Wenn ViewHolder nicht nextTime aktualisiert wird, ändert sich der Wert im Server nicht, aber die Switch-Schaltfläche ändert die Seite.

MainClass.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); 

    } 
} 

} 

Antwort

1

Zuerst Ihren Adapter in Ihrem onCreate Methode erstellen und halten:

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

erstellen neue Methode an Ihre Adapter Daten zu aktualisieren, wie:

mAdapter.updateItems(...); 

Schließlich, wenn Sie Antwort von Ihrem Service erhalten, müssen Sie nur die updateItems Methode aufrufen und mit

mAdapter.notifyDataSetChanged(); 

Hoffnung Änderungen zu informieren, das hilft!

0

Sie müssen den Tag für Ihren Switch in BindViewHolder setzen, um herauszufinden, auf welches Element geklickt wurde, um die Listenelemente zu aktualisieren.

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

Danach, sobald Sie bekam Volley Antwort erneuern.das 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); 

      } 
     });