2016-05-19 7 views
0

Это мой файл кода.adapter.setNotifyDatachanged() не работает должным образом в android

public class FragmentOfferList extends ListFragment { 

    private RecyclerView recyclerView; 
    private String TAG = FragmentOfferList.class.getSimpleName(); 
    private static final String endpoint = "http://example.com/offer/offers.json"; 
    private List<Offer> offers = new ArrayList<>(); 
    private ProgressDialog pDialog; 
    RecyclerView.Adapter adapter; 

    public FragmentOfferList() { 
    } 

    public static FragmentOfferList newInstance(int num) { 
     FragmentOfferList f = new FragmentOfferList(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     pDialog = new ProgressDialog(getActivity()); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View v = inflater.inflate(R.layout.recycler_list, container, false); 
     recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     adapter = new MyAdapter(offers, getActivity()); 
     recyclerView.setAdapter(adapter); 
     recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() { 

      @Override 
      public void onClick(View view, int position) { 
       Offer offer = Utility.getOffers().get(position); 
       Intent intent = new Intent(getActivity(), ActivityProductList.class); 
       intent.putExtra("query", offer.getQuery()); 
       startActivity(intent); 

       //startActivity(new Intent(getActivity(), ActivityProductList.class)); 
      } 

      @Override 
      public void onLongClick(View view, int position) { 

      } 
     })); 
     if (Utility.getOffers().size() == 0){ 
      fetchOffers(); 
     } 
     else{ 
      Utility.displayToast("here"); 
      offers = Utility.getOffers(); 
      adapter.notifyDataSetChanged(); 
     } 

     return v; 
    } 

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 

     private List<Offer> offers; 
     private Context context; 

     public class MyViewHolder extends RecyclerView.ViewHolder { 
      public TextView title, year, offer; 
      ImageView imageView; 

      public MyViewHolder(View view) { 
       super(view); 
       imageView = (ImageView) view.findViewById(R.id.thumbnail); 
       title = (TextView) view.findViewById(R.id.title); 
       offer = (TextView) view.findViewById(R.id.offer); 
      } 
     } 

     public MyAdapter(List<Offer> offers, Context context) { 

      this.offers = offers; 
      this.context = context; 
     } 

     @Override 
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.card_offer, parent, false); 

      return new MyViewHolder(itemView); 
     } 

     @Override 
     public void onBindViewHolder(MyViewHolder holder, int position) { 
      Offer offer = offers.get(position); 
      holder.title.setText(offer.getName()); 
      holder.offer.setText(offer.getOffer()); 
      Glide.with(context).load(String.valueOf(offer.getUrl())) 
        .error(R.drawable.placeholder) 
        .thumbnail(0.5f) 
        .crossFade() 
        .diskCacheStrategy(DiskCacheStrategy.ALL) 
        .into(holder.imageView); 
     } 

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

    private void fetchOffers() { 

     pDialog.setMessage("Downloading json..."); 
     pDialog.show(); 

     JsonArrayRequest req = new JsonArrayRequest(endpoint, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, response.toString()); 
         pDialog.hide(); 

         offers.clear(); 
         for (int i = 0; i < response.length(); i++) { 
          try { 
           JSONObject object = response.getJSONObject(i); 
           Offer offer = new Offer(); 
           offer.setOffer(object.getString("offer")); 
           offer.setName(object.getString("name")); 
           offer.setUrl(object.getString("url")); 
           offer.setQuery(object.getString("query")); 
           offers.add(offer); 

          } catch (JSONException e) { 
           Log.e(TAG, "Json parsing error: " + e.getMessage()); 
          } 
         } 

         Utility.setOffers(offers); 
         adapter.notifyDataSetChanged(); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e(TAG, "Error: " + error.getMessage()); 
       pDialog.hide(); 
      } 
     }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(req); 
    } 
} 

Первый раз, когда Utility.getoffers(). Размер() является 0, она извлекает данные, сохраните его в Utility.setOffers (предложения) и отображение на экране, как и ожидалось. Но в следующий раз (вернуться и к той же активности) Utility.getoffers(). Size() не равен 0, я получил данные непосредственно из Utility.getBrands().

После этого я назвал adapter.notifyDataSetChaned(), но он не работает. Не работает menas, хотя данные sise больше, чем 0, но нет отображения данных на экране?

Что здесь не так? я что-то пропустил?

ответ

2

Вы не обновляете свой список offers, а заменяете его другим списком, к которому у вашего адаптера нет ссылки. Чтобы исправить это, вы можете сделать следующее:

offers.clear(); 
offers.addAll(Utility.getOffers()); 
adapter.notifyDataSetChanged(); 
Смежные вопросы