【问题标题】:how to clear RecyclerView adapter data如何清除 RecyclerView 适配器数据
【发布时间】:2017-01-25 05:04:22
【问题描述】:

在我的 UI 中,我使用了两个按钮将不同的数据加载到 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);
    }

}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    使用此代码清除 RecycleView 项目

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

    【讨论】:

    • 会尝试让你知道。
    • 这段代码应该去哪里?在adapter 里面?没有帮助。
    • 适配器内部,可以添加这个方法
    【解决方案2】:

    您需要在第二次获取数据之前清除您的Array List

    for loop 之前的parseData1 方法中执行此操作。

    listSuperHeroes.clear();
    
    listSuperHeroes1.clear();
    

    【讨论】:

    • 那么在 parseData.. 中呢?
    【解决方案3】:

    你要做的是在按钮 Click 上更新 RecyclerView,把下面的方法放在你的适配器中

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

    比用新数据调用这个方法

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

    【讨论】:

      【解决方案4】:

      在线获取数据后无需设置适配器

      //Finally initializing our adapter
          adapter = new CardAdapter18(listSuperHeroes1, this);
      
          //Adding adapter to recyclerview
          recyclerView.setAdapter(adapter);
      

      您可以在'listSuperHeroes1' 中创建和添加数据时初始化设置适配器,解析数据后您可以执行adapter.notifyDataSetChanged(); 这将更改列表数据。

      以及获取先前数据的解决方案,您必须从listsuperHeroes1 中删除所有数据,如果您遇到任何问题,请发表评论。

      【讨论】:

        【解决方案5】:

        我只是在改进@Rony 的答案。 如果您在尝试调用.size() 之前始终检查 ArrayList 是否不为空,否则可能会出现空指针异常

        if (listSuperHeroes != null && !listSuperHeroes.isEmpty()) {
                int size = listSuperHeroes.size();
                listSuperHeroes.clear();
                notifyItemRangeRemoved(0, size); 
        }
        

        【讨论】:

          猜你喜欢
          • 2015-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-20
          • 2020-07-27
          • 2017-08-18
          • 1970-01-01
          相关资源
          最近更新 更多