簡體   English   中英

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

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

這是我的代碼:

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

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

如何更新適配器數據以顯示新接收的項目?

每次解析數據時都在創建適配器的實例,只需在onCreate()方法中一次創建它的實例,如下所示:

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

然后只需將您的解析數據通知適配器,如下所示:

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

將為您工作。

在這里,每次調用getData()都在重新初始化適配器時,會發生什么情況。 相反,您應該在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().
        }

如果您不想顯示以前的項目,請在添加新項目之前調用lisItems.clear()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM