首页 > 解决方案 > E/RecyclerView:没有附加适配器;在 recyclerview 跳过布局和视图 0 并且不显示 recyclerview

问题描述

我发现了一些错误,而在 recyclerview 显示数据时它没有显示数据。仅显示 0。在显示布局回收器但数据为空之后

这里 StatistikActivty 显示 recyclerview

public class StatistikActivity extends AppCompatActivity {

    ImageView back;
    EditText etedit;
    private ProgressBar progressBar;
    private RecyclerView rcdata;
    private static final String STATS_URL = "https://api.covid19api.com/summary";
    ArrayList<ModelData> dataArrayList;
    AdapterData adapterData;

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

        back = findViewById(R.id.imageView16);
        progressBar = findViewById(R.id.progresbar);
        etedit = findViewById(R.id.etedit);
        rcdata = findViewById(R.id.recystat);
        rcdata.setLayoutManager(new LinearLayoutManager(this));
        dataArrayList = new ArrayList<>();
        adapterData = new AdapterData(this, dataArrayList);
        rcdata.setAdapter(adapterData);
        rcdata.setHasFixedSize(true);
        progressBar.setVisibility(View.GONE);

        prosesdata();

        etedit.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                try{
                    adapterData.getFilter().filter(charSequence);
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onBackPressed();
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
        prosesdata();
    }

    private void prosesdata(){

        progressBar.setVisibility(View.VISIBLE);

        StringRequest stringRequest = new StringRequest(Request.Method.GET, STATS_URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                handlerespon(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(StatistikActivity.this, ""+error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

    private void handlerespon(String response) {

        dataArrayList = new ArrayList<>();
        dataArrayList.clear();

        try {
            JSONObject jsonObject = new JSONObject(response);
            JSONArray jsonArray = jsonObject.getJSONArray("Countries");

            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.setDateFormat("dd/MM/yyyy hh:mm a");
            Gson gson = gsonBuilder.create();

            for (int i=0; i<jsonArray.length(); i++){
                ModelData modelData = gson.fromJson(jsonArray.getJSONObject(i).toString(), ModelData.class);
                dataArrayList.add(modelData);
            }

           // adapterData = new AdapterData(this, dataArrayList);
            //rcdata.setAdapter(adapterData);
            rcdata.setHasFixedSize(true);
            adapterData.notifyDataSetChanged();

            progressBar.setVisibility(View.GONE);

        }
        catch (Exception e){
            progressBar.setVisibility(View.GONE);
            Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    public class Urutan implements Comparator<ModelData> {
        @Override
        public int compare(ModelData modelData, ModelData t1) {
            return modelData.getCountry().compareTo(t1.getCountry());
        }
    }
}

这里适配器数据

    public class AdapterData extends RecyclerView.Adapter<AdapterData.RecyclerHolder> implements Filterable {

    private Context context;
    public ArrayList<ModelData> dataArrayList, searchdat;
    private Searchdata searchdata;

    public AdapterData(Context context, ArrayList<ModelData> dataArrayList) {
        this.context = context;
        this.dataArrayList = dataArrayList;
        this.searchdat = dataArrayList;
    }

    @NonNull
    @Override
    public RecyclerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.list_stat, parent, false);

        return new RecyclerHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerHolder holder, int position) {
        ModelData modelData = dataArrayList.get(position);

        String Country = modelData.getCountry();
        String TotalConfirmed = modelData.getTotalConfirmed();
        String NewConfirmed = modelData.getNewConfirmed();
        String TotalDeaths = modelData.getTotalDeaths();
        String NewDeaths = modelData.getNewDeaths();
        String TotalRecovered = modelData.getTotalRecovered();
        String NewRecovered= modelData.getNewRecovered();

        holder.negara.setText(Country);
        holder.totalpositif.setText(TotalConfirmed);
        holder.positifbaru.setText(NewConfirmed);
        holder.totalmati.setText(TotalDeaths);
        holder.matihariini.setText(NewDeaths);
        holder.totalsembuh.setText(TotalRecovered);
        holder.sembuhhariini.setText(NewRecovered);
    }

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

    @Override
    public Filter getFilter() {
        if(searchdata == null) {
            searchdata = new Searchdata(this, searchdat);
        }
        return searchdata;
    }

    class RecyclerHolder extends RecyclerView.ViewHolder{

        TextView negara, totalpositif, positifbaru, totalmati, matihariini, totalsembuh, sembuhhariini;

        public RecyclerHolder(@NonNull View itemView) {
            super(itemView);

            negara = itemView.findViewById(R.id.negara);
            totalpositif = itemView.findViewById(R.id.negara);
            positifbaru = itemView.findViewById(R.id.negara);
            totalmati = itemView.findViewById(R.id.negara);
            matihariini = itemView.findViewById(R.id.negara);
            totalsembuh = itemView.findViewById(R.id.negara);
            sembuhhariini = itemView.findViewById(R.id.negara);

        }
    }
}

这里搜索数据

    public class Searchdata extends Filter {

    private AdapterData adapterData;
    private ArrayList<ModelData> searchdat;

    public Searchdata(AdapterData adapterData, ArrayList<ModelData> searchdat) {
        this.adapterData = adapterData;
        this.searchdat = searchdat;
    }

    @Override
    protected FilterResults performFiltering(CharSequence c) {

        FilterResults results = new FilterResults();

        if(c != null && c.length() >0){

            c = c.toString().toUpperCase();
            ArrayList<ModelData> modelDataArrayList = new ArrayList<>();
            for(int i=0; i<searchdat.size(); i++){
                if(searchdat.get(i).getCountry().toUpperCase().contains(c)){
                    modelDataArrayList.add(searchdat.get(i));
                }
            }

            results.count = modelDataArrayList.size();
            results.values = modelDataArrayList;
        } else {
            results.count = searchdat.size();
            results.values = searchdat;
        }

        return results;
    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults results) {
        adapterData.dataArrayList = (ArrayList<ModelData>) results.values;

        adapterData.notifyDataSetChanged();

    }
}

请帮助我,谢谢

标签: javaandroidandroid-recyclerview

解决方案


尝试在您的回收器视图适配器中进行过滤,而不是使用自定义过滤器。像这样编辑您的活动代码:

public class StatistikActivity extends AppCompatActivity {

    ImageView back;
    EditText etedit;
    private ProgressBar progressBar;
    private RecyclerView rcdata;
    private static final String STATS_URL = "https://api.covid19api.com/summary";
    ArrayList<ModelData> dataArrayList = new ArrayList<>();

    private String search = "";

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

        back = findViewById(R.id.imageView16);
        progressBar = findViewById(R.id.progresbar);
        etedit = findViewById(R.id.etedit);

        rcdata = findViewById(R.id.recystat);
        rcdata.setLayoutManager(new LinearLayoutManager(this));
        rcdata.setAdapter(new AdapterData(this, dataArrayList, search));
        rcdata.setHasFixedSize(true);

        progressBar.setVisibility(View.GONE);

        prosesdata();

        etedit.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                search = charSequence.toString();
                rcdata.setAdapter(new AdapterData(this, dataArrayList, search));
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onBackPressed();
            }
        });
    }
    
    ...
    
    private void handlerespon(String response) {

        dataArrayList = new ArrayList<>();
        dataArrayList.clear();

        try {
            JSONObject jsonObject = new JSONObject(response);
            JSONArray jsonArray = jsonObject.getJSONArray("Countries");

            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.setDateFormat("dd/MM/yyyy hh:mm a");
            Gson gson = gsonBuilder.create();

            for (int i=0; i<jsonArray.length(); i++){
                ModelData modelData = gson.fromJson(jsonArray.getJSONObject(i).toString(), ModelData.class);
                dataArrayList.add(modelData);
            }

            rcdata.setAdapter(new AdapterData(this, dataArrayList, search));

            progressBar.setVisibility(View.GONE);

        }
        catch (Exception e){
            progressBar.setVisibility(View.GONE);
            Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    public class Urutan implements Comparator<ModelData> {
        @Override
        public int compare(ModelData modelData, ModelData t1) {
            return modelData.getCountry().compareTo(t1.getCountry());
        }
    }
}

你的回收器视图适配器是这样的

public class AdapterData extends RecyclerView.Adapter<AdapterData.RecyclerHolder> implements Filterable {

    private Context context;
    public ArrayList<ModelData> dataArrayList;
    private Searchdata searchdata;
    private String search;

    public AdapterData(Context context, ArrayList<ModelData> dataArrayList, String search) {
        this.context = context;
        this.search = search;
        
        if (!search.equals("")) {
            for(int i=0; i<searchdat.size(); i++){
                if(dataArrayList.get(i).getCountry().toUpperCase().contains(c)) {
                    this.dataArrayList.add(dataArrayList.get(i));
                }
            }
        } else {
            this.dataArrayList = dataArrayList;
        }
    }

    // Remove the getFilter method
    ...
}

推荐阅读