简体   繁体   English

如何在Android中自动更新RecyclerView.Adapter?

[英]how to auto update RecyclerView.Adapter in android?

This is My Code: 这是我的代码:

public class ItemsListActivity extends AppCompatActivity {

    private List<AllItems> listItems;
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecyclerView.Adapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_items_list);

        Button camera=(Button)findViewById(R.id.camera);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        listItems = new ArrayList<>();
        camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(ItemsListActivity.this, Camera.class);
                startActivity(i);
            }
        });

        getData();
    }

    private void getData(){
        final ProgressDialog loading = ProgressDialog.show(this,"Loading Data", "Please wait...",false,false);
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        loading.dismiss();
                        parseData(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });

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

    private void parseData(JSONArray array){
        for(int i = 0; i<array.length(); i++) {
            AllItems items = new AllItems();
            JSONObject json = null;
            try {
                json = array.getJSONObject(i);
                items.setImageUrl(json.getString(Config.TAG_IMAGE_URL));
                items.setName(json.getString(Config.TAG_NAME));

            } catch (JSONException e) {
                e.printStackTrace();
            }
            listItems.add(items);
        }

        adapter = new CardAdapter(listItems, this);
        recyclerView.setAdapter(adapter);

        adapter.notifyItemRangeChanged(0, listItems.size());
    }
}

And This Is CardAdapter: 这是CardAdapter:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {

    private ImageLoader imageLoader;
    private Context context;
    List<AllItems> superHeroes;

    public CardAdapter(List<AllItems> superHeroes, Context context){
        super();
        this.superHeroes = superHeroes;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.all_items_lists, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        AllItems superHero =  superHeroes.get(position);

        imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();
        imageLoader.get(superHero.getImageUrl(), ImageLoader.getImageListener(holder.imageView, R.mipmap.ic_launcher, android.R.drawable.ic_dialog_alert));

        holder.imageView.setImageUrl(superHero.getImageUrl(), imageLoader);
        holder.textViewName.setText(superHero.getName());

    }

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

    class ViewHolder extends RecyclerView.ViewHolder{
        public NetworkImageView imageView;
        public TextView textViewName;

        public ViewHolder(View itemView) {
            super(itemView);
            imageView = (NetworkImageView) itemView.findViewById(R.id.imageViewHero);
            textViewName = (TextView) itemView.findViewById(R.id.textViewName);
        }
    }
}

how do I update adapter data in order to display newly received items? 如何更新适配器数据以显示新接收的项目?

You are creating instance of adapter every time you parsing the data, just create its instance once in onCreate() method like below: 每次解析数据时都在创建适配器的实例,只需在onCreate()方法中一次创建它的实例,如下所示:

layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
listItems = new ArrayList<>();
adapter = new CardAdapter(listItems, this);
recyclerView.setAdapter(adapter);

and just notify the adapter with your parse data like below: 然后只需将您的解析数据通知适配器,如下所示:

listItems.add(items);
adapter.notifyDataSetChanged();

will work for you. 将为您工作。

Here what is happening that evertime your are calling getData() you are initializing adapter again . 在这里,每次调用getData()都在重新初始化适配器时,会发生什么情况。 Instead you should initialize your adapter in onCreate and in getData just update the list that you are passing in adapter and call adapter.notifyDataSetChanged(). 相反,您应该在onCreate和getData中初始化适配器,只需更新要在适配器中传递的列表并调用adapter.notifyDataSetChanged()。

    private List<AllItems> listItems; 
    private RecyclerView recyclerView; private RecyclerView.LayoutManager layoutManager;
     private RecyclerView.Adapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_items_list); Button camera=(Button)findViewById(R.id.camera); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); listItems = new ArrayList<>();
    adapter = new CardAdapter(listItems, this); 
    recyclerView.setAdapter(adapter);
    camera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(ItemsListActivity.this, Camera.class); startActivity(i); } }); getData(); }
     private void getData(){ 
final ProgressDialog loading = ProgressDialog.show(this,"Loading Data", "Please wait...",false,false); 

JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { loading.dismiss(); parseData(response); } 
}, new Response.ErrorListener() { 
@Override public void onErrorResponse(VolleyError error) { } }); RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(jsonArrayRequest); } 

private void parseData(JSONArray array){
 for(int i = 0; i<array.length(); i++) { 
AllItems items = new AllItems(); JSONObject json = null; 
try 
{
 json = array.getJSONObject(i); items.setImageUrl(json.getString(Config.TAG_IMAGE_URL)); items.setName(json.getString(Config.TAG_NAME)); } catch (JSONException e) { e.printStackTrace(); } listItems.add(items); } 
     }
    adapter.notifyDataSetChanged().
        }

And if you don't want to show previous items call lisItems.clear() before adding new items 如果您不想显示以前的项目,请在添加新项目之前调用lisItems.clear()。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM