2017-05-06 1 views
0

이 내 코드입니다 :RecyclerView.Adapter를 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); 
     } 
    } 
} 

어떻게 새롭게 수신 된 항목을 표시하기 위해 어댑터 데이터를 업데이트하는 방법은 무엇입니까?

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

을 그냥 아래처럼 구문 분석 데이터와 어댑터를 통보 :

+0

를 추가하기 전에 lisItems.clear()를 호출 표시하지 않으려면. 그것들과 함께 작동하지 않는 것은 무엇입니까? –

답변

1

당신은 어댑터의 경우 당신이 데이터를 파싱 할 때마다 작성, 은 아래와 같이()에서 onCreate 번 방법의 인스턴스를 생성 :

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

이 도움이 될 것입니다.

+0

형님, 고마워요. –

1

여기서 evertime이 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(). 
     } 

그리고 당신은 이전 항목이 이미 ** 통지를 ** 어댑터를 다시 설정하라는되어 새로운 아이템

관련 문제