代码之家  ›  专栏  ›  技术社区  ›  Lord PB

加载RecyclerView非常慢

  •  -2
  • Lord PB  · 技术社区  · 7 年前

    我的应用程序性能有问题,我可以在视图中加载数据,但是,生成列表需要两分钟以上的时间。这是因为我的代码没有得到很好的优化吗?

    下面是我的活动,我称之为 RecyclerView 在…上

    public class ResultsActivity extends AppCompatActivity {
    
        private RecyclerView rlist;
    
        private LinearLayoutManager linearLayoutManager;
        private DividerItemDecoration dividerItemDecoration;
        private List<Riders> ridersList;
        private RecyclerView.Adapter adapter;
    
        public static Intent makeIntent(Context context) {
            return new Intent(context, ResultsActivity.class);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_results);
    
            rlist = findViewById(R.id.recycler_view);
            ridersList = new ArrayList<>();
            adapter = new RidersAdapter(getApplicationContext(),ridersList);
            linearLayoutManager = new LinearLayoutManager(this);
            linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            dividerItemDecoration = new DividerItemDecoration(rlist.getContext(),linearLayoutManager.getOrientation());
    
            rlist.setHasFixedSize(true);
            rlist.setLayoutManager(linearLayoutManager);
            rlist.addItemDecoration(dividerItemDecoration);
            rlist.setAdapter(adapter);
    
            getData();
        }
    
        private void getData(){
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setMessage("Loading results...");
            progressDialog.show();
    
            JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    for (int i = 0; i < response.length(); i++){
                        try {
                            JSONObject jsonObject = response.getJSONObject(i);
    
                            Riders riders = new Riders();
                            riders.setName(jsonObject.getString("Full_Name"));
                            riders.setClub(jsonObject.getString("Club"));
                            riders.setFinishPosition(jsonObject.getString("Finish_Position"));
    
                            ridersList.add(riders);
                        } catch (JSONException e){
                            e.printStackTrace();
                            progressDialog.dismiss();
                        }
                    }
                }
            }, new Response.ErrorListener(){
    
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("Volley", error.toString());
                    progressDialog.dismiss();
                }
            });
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(jsonArrayRequest);
        }
    }
    

    Json正在以这种格式加载

    "[{"Full_Name":"Sam sam",
    "Club":"Club",
    "Finish_Position":"1"
    },
    {  
    "Full_Name":"Chris Chris",
    "Club":"Club",
    "Finish_Position":"2"
    }"
    

    都是一根大绳子,没有断线什么的?任何帮助都将不胜感激。

    适配器为-

    public class RidersAdapter extends RecyclerView.Adapter<RidersAdapter.MyViewHolder> {
    
        private List<Riders> ridersList;
        private Context context;
    
        public class MyViewHolder extends RecyclerView.ViewHolder {
            public TextView title, position, club;
    
            public MyViewHolder(View view) {
                super(view);
                title = (TextView) view.findViewById(R.id.main_title);
                club = (TextView) view.findViewById(R.id.main_rating);
                position = (TextView) view.findViewById(R.id.main_year);
            }
        }
    
    
        public RidersAdapter(Context applicationContext, List<Riders> ridersList) {
            this.ridersList = ridersList;
        }
    
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.singleitem, parent, false);
    
            return new MyViewHolder(itemView);
        }
    
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            Riders riders = ridersList.get(position);
            holder.title.setText(riders.getName());
            holder.club.setText(riders.getClub());
            holder.position.setText(riders.getFinishPosition());
        }
    
        @Override
        public int getItemCount() {
            return ridersList.size();
        }
    1 回复  |  直到 7 年前
        1
  •  0
  •   Reaz Murshed vir us    7 年前

    这不是你问题的正确答案。然而,我想知道你的 RecyclerView 从服务器获取响应时是否更新?我没有看到任何 notifyDataSetChanged()

    您需要更改 onResponse 功能如下所示。

    @Override
    public void onResponse(JSONArray response) {
        for (int i = 0; i < response.length(); i++){
            try {
                JSONObject jsonObject = response.getJSONObject(i);
    
                Riders riders = new Riders();
                riders.setName(jsonObject.getString("Full_Name"));
                riders.setClub(jsonObject.getString("Club"));
                riders.setFinishPosition(jsonObject.getString("Finish_Position"));
    
                ridersList.add(riders);
            } catch (JSONException e){
                e.printStackTrace();
                progressDialog.dismiss();
            }
    
            // You need to call notifyDataSetChanged to see the effect in your RecyclerView.
            adapter.notifyDataSetChanged(); 
        }
    }