2015-11-09 8 views
5

चालू और बंद करने के बाद सामग्री दिखाई देती है मैं एंड्रॉइड के लिए बिल्कुल नया हूं और मैं कॉलेज से दोस्तों के समूह के साथ बिल्डिंग और ऐप बना रहा हूं। समस्या यह है कि हम में चलाने है कि जब तत्वों की सूची को भरने के लिए एक सर्वर से डेटा प्राप्त डेटा लोड से प्रदर्शित करने के लिए है और किसी सूची में शामिल हो जाता है लेकिन recyclerView यह कभी नहीं प्रदर्शित करता है (यहां तक ​​कि अपने कस्टम एडाप्टर से NotifyDataSetChanged बुला के बाद)। वापस जब हमने ऐप का परीक्षण करने के लिए हार्डकोड किए गए डेटा का उपयोग किया, तो यह कभी नहीं हुआ।RecyclerView NotifyDataSetChanged() के बाद अद्यतन नहीं होता है, स्क्रीन

अजीब बात यह है कि तत्वों की सूची रीसाइक्लर पर प्रदर्शित होती है जब मैं डिस्प्ले बंद कर देता हूं और फिर इसे चालू करता हूं (जब मैं स्क्रीन को चालू करता हूं तो मेरे कस्टम एडाप्टर के बाइंडव्यूहोल्डर को कॉल किया जाता है)। इसके अलावा, अगर मैं उस खंड को प्रतिस्थापित करता हूं जिसमें रीसाइक्लिंग व्यू दूसरे के साथ होता है और फिर उस पर वापस लौटाता है, डेटा सूची में लोड हो जाता है लेकिन दिखाया नहीं जाता है।

मैं क्या जानना चाहता हूं कि यह क्यों हो रहा है और इसे हल करने के लिए मैं क्या कर सकता हूं (और इसे सुलझाने का मतलब है कि मैं रीसाइक्लिंग व्यू को सही वस्तुओं के साथ पॉप्युलेट कर रहा हूं जैसे कि मैं खंड को लॉन्च करता हूं और रीसाइक्लर को अद्यतन करता हूं, जब मैं जोड़ता हूं सूची में अधिक तत्व)

हम सर्वर से डेटा प्राप्त करने के लिए कस्टम एडाप्टर और रेट्रोफिट का उपयोग कर रहे हैं।

यहाँ कोड

टुकड़ा है कि के लिए recyclerView

public class EventViewListFragment extends Fragment implements EventListAdapter.ClickListener{ 

    private RestClient restClient; 
    private Builder builder; 
    private String token ; 

    private boolean userScrolled = true; 
    int pastVisiblesItems, visibleItemCount, totalItemCount; 

    private LinearLayoutManager mLayoutManager; 

    private RecyclerView recyclerView; 
    private EventListAdapter eventListAdapter; 

    private Button btnNewEvent; 

    FloatingActionButton suggestFAB; 

    private int currentPage=1; 


    public EventViewListFragment(){ 
     restClient = new RestClient(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     System.out.println("Se llamo al onCreate de EventViewListFragment"); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     System.out.println("se llamo al onCreateView de EvENT List Fragment"); 
     // Inflate the layout for this fragment 
     View layout =inflater.inflate(R.layout.fragment_events_list, container, false); 
     setUpElements(layout); 
     addListeners(); 
     return layout; 
    } 

    private void setUpElements(View layout) 
    { 
     recyclerView = (RecyclerView) layout.findViewById(R.id.eventList); 
     eventListAdapter = new EventListAdapter(getActivity()); 
     eventListAdapter.setClickListener(this); 
     eventListAdapter.setData(getInitialData()); 
     recyclerView.setAdapter(eventListAdapter); 
     mLayoutManager=new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     suggestFAB = (FloatingActionButton) layout.findViewById(R.id.suggestFAB); 
     builder = new Builder(); 
    } 

    private void addListeners() 
    { 
     addNewEventListener(); 
     addScrollBottomListener(); 
    } 



    private void addNewEventListener() 
    { 
     /*btnNewEvent.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View view) 
      { 
       EventsActivity.getInstance().toNewEventForm(); 
      } 
     });*/ 

     suggestFAB.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       EventsActivity.getInstance().toNewEventForm(); 
       currentPage=1; 
      } 
     }); 
    } 

    public List<Event> getInitialData() 
    { 
     List<Event> data=new ArrayList<>(); 
     data = getEvents(data); 
     return data; 
    } 

    @Override 
    public void itemClicked(View view, int position) { 
     EventsActivity.getInstance().toEventPage(eventListAdapter.getItemAtPos(position)); 
     currentPage=1; 

    } 
    private void addScrollBottomListener() { 
     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 

      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 

       super.onScrollStateChanged(recyclerView, newState); 
       if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { 
        userScrolled = true; 

       } 

      } 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, 
            int dy) { 

       super.onScrolled(recyclerView, dx, dy); 
       // Here get the child count, item count and visibleitems 
       // from layout manager 

       visibleItemCount = mLayoutManager.getChildCount(); 
       totalItemCount = mLayoutManager.getItemCount(); 
       pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition(); 
       if (userScrolled && (visibleItemCount + pastVisiblesItems) == totalItemCount) { 
        userScrolled = false; 

        addNewElementsToList(); 
       } 

      } 

     }); 

    } 

    private void addNewElementsToList() 
    { 
     Toast.makeText(getActivity(), "Cargando Mas Elementos", Toast.LENGTH_SHORT).show(); 
     eventListAdapter.setData(getEvents(eventListAdapter.getData())); 
    } 

    private List<Event> getEvents(final List<Event> eventsList) 
    { 
     System.out.println("Asignando CALL"); 
     Call<JsonElement> eventPage = restClient.getConsumerService().getEvents(token, "", currentPage, 10); 
     System.out.println("Enquequeing"); 
     eventPage.enqueue(new Callback<JsonElement>() { 
      @Override 
      public void onResponse(Response<JsonElement> response) { 
       JsonObject responseBody = response.body().getAsJsonObject(); 
       if (responseBody.has("events")) { 
        JsonArray jsonArray = responseBody.getAsJsonArray("events"); 
        System.out.println(jsonArray.size()); 
        for (int i = 0; i < jsonArray.size(); i++) { 
         JsonObject storedObject = jsonArray.get(i).getAsJsonObject(); 
         Event current = new Event(); 
         current.setEventId(storedObject.get("id").getAsInt()); 
         current.setName(storedObject.get("title").getAsString()); 
         Calendar startCal = new GregorianCalendar(); 
         startCal.setTimeInMillis((storedObject.get("starts_at").getAsLong()) * 1000); 
         current.setStartDateTime(startCal); 
         Calendar endCal = new GregorianCalendar(); 
         endCal.setTimeInMillis((storedObject.get("ends_at").getAsLong()) * 1000); 
         current.setFinishDateTime(endCal); 
         current.setImgUrl(storedObject.get("image").getAsString()); 
         eventsList.add(current); 
        } 
       } else { 
        if (responseBody.has("error")) { 
         System.out.println("ERROR"); 
         wan.wanmarcos.models.Error error = builder.buildError(responseBody.get("error").getAsJsonObject()); 
         Toast.makeText(getActivity(), "Error : " + error.toString(), Toast.LENGTH_SHORT).show(); 
        } else { 

        } 
       } 
      } 

      @Override 
      public void onFailure(Throwable t) { 
      } 
     }); 
     eventListAdapter.notifyDataSetChanged(); 
     currentPage++; 
     return eventsList; 
    } 
} 

कस्टम एडाप्टर शामिल है RecyclerView

public class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.EventListViewHolder>{ 
    private LayoutInflater inflater; 
    private List<Event> data = Collections.emptyList(); 
    private Context context; 
    private ClickListener clickListener; 

    public EventListAdapter(Context context){ 
     inflater = LayoutInflater.from(context); 
     this.context=context; 
    } 

    @Override 
    public EventListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.event_list_item, parent, false); 
     EventListViewHolder holder = new EventListViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(EventListViewHolder holder, int position) { 
     System.out.println("se llamo al onBindViewHolder de ELA"); 
     Event current = getData().get(position); 
     holder.title.setText(current.getName()); 
     Picasso.with(context) 
       .load(current.getImgUrl()) 
       .into(holder.img); 
     String startDateAndTime = current.CalendarToString(current.getStartDateTime())+" - "+current.CalendarToString(current.getFinishDateTime()); 
     holder.dateAndTime.setText(startDateAndTime); 
    } 

    public void setClickListener(ClickListener clickListener){ 

     this.clickListener=clickListener; 
    } 

    @Override 
    public int getItemCount() { 

     return getData().size(); 
    } 

    public List<Event> getData() { 
     return data; 
    } 

    public void setData(List<Event> data) { 
     this.data = data; 
    } 

    class EventListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     TextView title; 
     TextView dateAndTime; 
     ImageView img; 

     public EventListViewHolder(View itemView) { 

      super(itemView); 
      itemView.setOnClickListener(this); 
      title = (TextView) itemView.findViewById(R.id.eventListTitle); 
      img = (ImageView) itemView.findViewById(R.id.eventListImage); 
      dateAndTime =(TextView) itemView.findViewById(R.id.eventListDateAndTime); 
     } 


     @Override 
     public void onClick(View v) { 

      if(clickListener!=null) 
      { 
       clickListener.itemClicked(v,getPosition()); 
      } 
     } 

    } 

    public Event getItemAtPos(int pos) 
    { 
     return getData().get(pos); 
    } 


    public interface ClickListener{ 
     public void itemClicked(View view,int position); 
    } 



} 

Fragment XML File

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/main_content" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context="wan.wanmarcos.fragments.EventViewListFragment"> 

      <android.support.v7.widget.RecyclerView 
       android:id="@+id/eventList" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:scrollbars="vertical" 
       > 
      </android.support.v7.widget.RecyclerView> 
    </RelativeLayout> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/suggestFAB" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     app:layout_anchorGravity="bottom|right|end" 
     android:layout_margin="16dp" 
     android:clickable="true" 
     android:src="@mipmap/ic_add_white_48dp" /> 

</android.support.design.widget.CoordinatorLayout> 

उत्तर

5

eventsList अपने Activity और अपने एडाप्टर में data में दो अलग अलग संग्रह हैं। आप पूर्व को भर रहे हैं लेकिन उत्तरार्द्ध नहीं। intialize new ArrayList<> बजाय Collections.emptyList(); और फिर अपने एडाप्टर में एक विधि जोड़ने के साथ data,, addAll फोन की तरह:

public void addAll(final List<Event> new events) { 
     final int currentCount = data.size(); 
     synchronized(data) { 
     data.addAll(events); 
     } 
     if (Looper.getMainLooper() == Looper.myLooper()) { 
      notifyItemRangeInserted(currentCount, events.size()); 
     } else { 
      new Handler(Looper.getMainLooper()).post(new Runnable() { 
      @Override 
      public void run() { 
       notifyItemRangeInserted(currentCount, events.size()); 
      } 
      }); 
     } 
} 

किसी और के चैक से ui धागे से या एक अलग धागा और कॉल से addAll बुला रहे हैं, तो अगर एक सुरक्षित तरीके से notifyItemRangeInsertedActivity में onResponse को पूरी तरह से भरने के बाद, eventsList भरने के बाद, बस eventListAdapter.addAll(eventsList)

+0

यह काम किया !!! बहुत बहुत धन्यवाद, आपने मुझे और मेरे दोस्तों को सूर्योदय तक पूरी रात रहने से बचाया। आप सबसे अच्छे हो !!!! –

+0

आपका स्वागत है – Blackbelt

+0

मेरे लिए भी काम किया ... बहुत बहुत धन्यवाद .. – ELITE

संबंधित मुद्दे