2017-01-25 1 views
0

Hier in meiner Benutzeroberfläche habe ich zwei Schaltflächen verwendet, um verschiedene Daten in einen RecyclerView zu laden. Zum ersten Mal werden die Daten beim Klicken auf jede Schaltfläche richtig angezeigt. Aber wenn ich zum zweiten Mal auf die Schaltfläche klicke, werden die Daten zweimal zum Adapter hinzugefügt. Ich meine der Adapter ist nicht gelöscht. Es ist weiterhin auf die Daten hinzufügen auf Knopfdruck. Ich denke, ich muss etwas mit dem Adapter auf Knopfdruck tun. Kann mir jemand bitte sagen, wie man den Adapter reinigt oder wo ich falsch liege ..RecyclerView-Adapterdaten löschen

Hier ist der Code.

public class GstVendorLocRetrieve extends AppCompatActivity { 

    private String vault; 

    private TextView txt; 
    public static final String DATA_URL = "http://oursite.com/getgstvendorlocation.php?vault_no="; 
    public static final String DATA_URL1 = "http://oursite.com/getgstcustomerlocation.php?vault_no="; 

    //Tags for my JSONRes 
    public static final String TAG_VendorID = "VendorID"; 
    public static final String TAG_CustomerID = "Customer_ID"; 
    public static final String TAG_ADDRESS = "Address"; 

    private Button vendor; 
    private Button customer; 

    //Creating a List of superheroes 
    private List<GstVendLoc> listSuperHeroes; 
    private List<GstCustLoc> listSuperHeroes1; 

    //Creating Views 
    private RecyclerView recyclerView; 
    private RecyclerView.LayoutManager layoutManager; 
    private RecyclerView.Adapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.locationretrieve); 

     SharedPreferences sharedPreferences = getSharedPreferences(GstLogin.SHARED_PREF_NAME, MODE_PRIVATE); 
     vault = sharedPreferences.getString(GstLogin.EMAIL_SHARED_PREF,"Not Available"); 

     vendor = (Button) findViewById(R.id.login); 
     customer = (Button) findViewById(R.id.login1); 

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

     //Initializing our superheroes list 
     listSuperHeroes = new ArrayList<>(); 
     listSuperHeroes1 = new ArrayList<>(); 

     vendor.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       recyclerView.setAdapter(null); 
       getData(); 
      } 
     }); 

     customer.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       recyclerView.setAdapter(null); 
       getData1(); 
      } 
     }); 

    } 

    //This method will get data from the web api 
    private void getData(){ 
     //Showing a progress dialog 
     final ProgressDialog loading = ProgressDialog.show(this,"Loading Data", "Please wait...",false,false); 

     //Creating a json array request 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(DATA_URL+vault, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         //Dismissing progress dialog 
         loading.dismiss(); 

         //calling method to parse json array 
         parseData(response); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 

     //Creating request queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

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

    //This method will parse json data 
    private void parseData(JSONArray array){ 
     for(int i = 0; i<array.length(); i++) { 
      GstVendLoc gst1 = new GstVendLoc(); 
      JSONObject json = null; 
      try { 

       json = array.getJSONObject(i); 
       gst1.setVendorID(json.getString(TAG_VendorID)); 
       gst1.setAddress(json.getString(TAG_ADDRESS)); 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      listSuperHeroes.add(gst1); 
     } 

     //Finally initializing our adapter 
     adapter = new CardAdapter17(listSuperHeroes, this); 

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

    } 

    private void getData1(){ 
     //Showing a progress dialog 
     final ProgressDialog loading = ProgressDialog.show(this,"Loading Data", "Please wait...",false,false); 

     //Creating a json array request 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(DATA_URL1+vault, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         //Dismissing progress dialog 
         loading.dismiss(); 

         //calling method to parse json array 
         parseData1(response); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 

     //Creating request queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

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

    //This method will parse json data 
    private void parseData1(JSONArray array){ 
     for(int i = 0; i<array.length(); i++) { 
      GstCustLoc gst1 = new GstCustLoc(); 
      JSONObject json = null; 
      try { 

       json = array.getJSONObject(i); 
       gst1.setCustomer_ID(json.getString(TAG_CustomerID)); 
       gst1.setAddress(json.getString(TAG_ADDRESS)); 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      listSuperHeroes1.add(gst1); 
     } 

     //Finally initializing our adapter 
     adapter = new CardAdapter18(listSuperHeroes1, this); 

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

} 

Antwort

4

Sie benötigen Array List zu löschen, bevor Sie Daten zweites Mal erhalten.

Tun Sie dies innerhalb Methode vor for loop.

listSuperHeroes.clear(); 

listSuperHeroes1.clear(); 
+0

und was ist mit parseData ..? –

+0

@sunily Gleiches in dieser Methode auch 'listSuperHeroes.clear();' in 'parseData' Methode und' listSuperHeroes1.clear(); 'in' parseData1' Methode. –

+0

okay, versuchen Sie es und lassen Sie es wissen. –

1

Mit diesem Code für klaren RecycleView Artikel

public void clear() { 
    int size = listSuperHeroes.size(); 
    listSuperHeroes.clear(); 
    notifyItemRangeRemoved(0, size); 
} 
+0

werden versuchen, und u wissen. –

1

Sie nicht brauchen Adapter zu setzen, nachdem Daten aus dem Online-

//Finally initializing our adapter 
    adapter = new CardAdapter18(listSuperHeroes1, this); 

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

Sie setzen den Adapter in dem auf erstellen und fügen Sie Daten in der 'listSuperHeroes1' und nach Parse-Daten initialisieren können Sie tun adapter.notifyDataSetChanged(); Dies wird die Listendaten ändern.

und die Lösung für das Abrufen der vorherigen Daten müssen Sie alle Daten aus dem listsuperHeroes1 entfernen dies wird Ihnen helfen, wenn Sie irgendein Problem kommentieren bitte.

1

Was Sie tun müssen, ist aktualisieren RecyclerView auf Schaltfläche klicken, Setzen unten Methode in Ihrem Adapter

public void updateData(ArrayList<ViewModel> viewModels) { 
    items.clear(); 
    items.addAll(viewModels); 
    notifyDataSetChanged(); 
} 

als rufen Sie diese Methode mit neuen Daten

ArrayList<ViewModel> viewModelsWithNewData = new ArrayList<ViewModel>(); 
adapter.updateData(viewModelsWithNewData);