2017-01-25 6 views
0

Здесь, в моем пользовательском интерфейсе, я использовал две кнопки для загрузки различных данных в RecyclerView. В первый раз данные отображаются правильно при нажатии каждой кнопки. Но если я дважды нажму кнопку, данные дважды добавляются к адаптеру. Я имею в виду, что адаптер не очищается. он продолжает добавлять данные по нажатию кнопки. Думаю, я должен что-то сделать с адаптером одним нажатием кнопки. Может ли кто-нибудь PLS дать мне знать, как очистить адаптер или где я иду не так.как очистить данные адаптера RecyclerView

Вот код.

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); 
    } 

} 

ответ

4

Вы должны очистить Array List, прежде чем получить данные во второй раз.

Сделайте это внутри метод до for loop.

listSuperHeroes.clear(); 

listSuperHeroes1.clear(); 
+0

а как насчет в parseData ..? –

+0

@sunily То же самое внутри этого метода также 'listSuperHeroes.clear();' inside 'parseData' метод и' listSuperHeroes1.clear(); 'inside' parseData1' метод. –

+0

в порядке попробуем и дадим вам знать. –

1

Используйте этот код для прозрачных элементов RecycleView

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

будет стараться, и пусть и знают. –

1

вам не нужно устанавливать адаптер после адресности данных из онлайн

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

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

можно инициализировать из установленного адаптера в режиме он создавать и добавлять данные в 'listSuperHeroes1' и после синтаксического анализа данных, которые вы можете сделать adapter.notifyDataSetChanged(); это изменит данные списка.

и решение для получения предыдущих данных необходимо удалить все данные из listsuperHeroes1, это поможет вам, если у вас возникнут проблемы, прокомментируйте.

1

То, что вы должны сделать, это обновление RecyclerView на кнопку Нажмите, Put ниже метод в адаптер

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

Чем этот метод вызывается с новыми данными

ArrayList<ViewModel> viewModelsWithNewData = new ArrayList<ViewModel>(); 
adapter.updateData(viewModelsWithNewData); 
Смежные вопросы