2017-03-01 5 views
1

In meiner App sende ich eine Volley-Anfrage, die Listenelemente nacheinander abruft, nicht alle auf einmal. Ich möchte eine Fortschrittsanzeige am Ende der Recycler-Ansicht implementieren, wenn die Daten abgerufen werden. Die Klasse 'updateAdapter' aktualisiert den Adapter und ich dachte daran, den Fortschrittsbalken im Scroll-Listener Recyclerview sichtbar zu machen. Aber ich habe keine Ahnung, wie ich das in meinem Code machen soll.Fortschrittsbalken am Ende der Recycler-Ansicht hinzufügen

updateAdapter.java

//THIS CLASS UPDATES THE RECYCLER VIEW 

    public class updateAdapter{ 

    private FetchWpApi fetch; 

    private int totalItemCount; 
    private int prevLastvisible=0; 
    private int fpage=1; 
    private Context context; 
    private RecyclerView recyclerView; 
    private ArrayList<sItem> list= new ArrayList<>(); 
    private LinearLayoutManager manager; 
    private ProgressBar progressBar; 

    //CONSTRUCTOR FOR updateAdapter 
    public updateAdapter(RecyclerView recyclerView, final Context context, String url, LinearLayoutManager manager){ 
     this.context=context; 
     this.recyclerView=recyclerView; 
     fetch=new FetchWpApi(url,context); 
     this.manager=manager; 
    } 

    public void fetchAndPut() 
    { 
     if(recyclerView.getAdapter()==null) { 
      fetch.fetchApiData(fpage, new FetchWpApi.Callback() { 
       @Override 
       public void onSuccess(sItem sitem) { 
        list.add(sitem); 
        if (list.size() == 1 || recyclerView.getAdapter() == null) { 
         ItemAdapter adapter = new ItemAdapter(context, list); 
         recyclerView.setAdapter(adapter); 

        } else if (list.size() > 1 && recyclerView.getAdapter() != null) { 
         recyclerView.getAdapter().notifyDataSetChanged(); 
         recyclerView.getAdapter().notifyItemRangeChanged(0, recyclerView.getAdapter().getItemCount()); 
        } 
       } 
       @Override 
       public void onFail(String msg) { 
        Toast.makeText(context, "FAILED PRIMARY LOAD", Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 

     recyclerView.addOnItemTouchListener(
         //Not important 
     ); 

     //SCROLL LISTENER ATTACHED TO THE RECYCLER VIEW 
     //SHOW PROGRESS BAR HERE? 
     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() 
     { 
      @Override 
      public void onScrolled(final RecyclerView recyclerView, int dx, int dy) 
      { 
       if(dy > 0) //check for scroll down 
       { 
        totalItemCount = manager.getItemCount(); 
        int lastVisibleItemPosition = ((LinearLayoutManager) manager).findLastVisibleItemPosition(); 
         if((lastVisibleItemPosition+1)==totalItemCount && totalItemCount%10==0 && lastVisibleItemPosition>prevLastvisible) 

         { 

          //SET VISIBILITY OF THE PROGRESS BAR IN THE LAST CARD ITEM TO VISIBLE ?? 

          fpage++; 
          //loading = false; 
          Log.v("...", "Last Item !"); 
          //Do pagination.. i.e. fetch new data 
          prevLastvisible=lastVisibleItemPosition; 
          fetch.fetchApiData(fpage,new FetchWpApi.Callback(){ 
           @Override 
           public void onSuccess(sItem sitem){ 
            list.add(sitem); 
            recyclerView.getAdapter().notifyDataSetChanged(); 
            recyclerView.getAdapter().notifyItemRangeChanged(0, recyclerView.getAdapter().getItemCount()); 

           } 
           @Override 
           public void onFail(String msg){ 
            Toast.makeText(context,"FAILED ONLOAD",Toast.LENGTH_LONG).show(); 
           } 
          }); 
         } 

       } 
      } 
     }); 

    } 

} 

Die progressbar, die ich angezeigt werden soll ist in diesem cardview:

finalcard.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:id="@+id/cvItem" 
android:layout_gravity="center" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 

> 

<!--<LinearLayout--> 
    <!--android:id="@+id/linearlayout"--> 
    <!--android:layout_width="match_parent"--> 
    <!--android:layout_height="wrap_content"--> 
    <!--android:layout_margin="10dp"--> 
    <!--&gt;--> 


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TextView 
     android:id="@+id/tvTitle" 
     android:textColor="#000" 
     android:text="Sample text Sampletext sample text sample text sample text" 
     android:layout_alignParentStart="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toStartOf="@+id/ivMainImage" 
     android:layout_marginTop="15dp" 
     android:paddingStart="16dp" 
     android:paddingEnd="2dp" 
     android:maxLines="4" 
     android:textSize="20sp" 
     android:layout_gravity="start" 
     /> 


    <TextView 
     android:id="@+id/dateText" 
     android:text="DATE" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingStart="16dp" 
     android:paddingEnd="0dp" 
     android:layout_gravity="start" 
     android:layout_below="@id/tvTitle" 
     android:ellipsize="marquee"/> 

    <ImageView 
     android:id="@+id/ivMainImage" 
     android:layout_width="140dp" 
     android:layout_height="130dp" 
     android:layout_gravity="end" 
     android:layout_alignParentEnd="true" 
     android:layout_margin="15dp" 
     android:src="@android:drawable/btn_star" 
     android:scaleType="centerCrop" 
     /> 

    <View 
     android:id="@+id/view" 
     android:layout_width="match_parent" 
     android:layout_height="2dp" 
     android:background="#0C000000" 
     android:layout_below="@id/ivMainImage" 
     /> 

    <ProgressBar 
     style="?android:attr/progressBarStyleSmall" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/progressBar2" 
     android:layout_below="@id/view" 
     android:visibility="gone" 
     /> 

</RelativeLayout> 

Antwort

2

Fixieren Sie Ihren Fortschrittsbalken unterhalb Ihrer Recycler-Ansicht anstatt der Kartenansicht. Stellen sichtbar Fortschrittsbalken beim Aufruf Web-Service, und stellen Sie die Sichtbarkeit gegangenes nach der vollständigen Serviceanruf

//Progress bar setVisibility - Visible 
progressbar.setVisibility(View.VISIBLE); 
fetch.fetchApiData(fpage, new FetchWpApi.Callback() { 
    @Override 
    public void onSuccess(sItem sitem) { 
    progressbar.setVisibility(View.GONE); 
    list.add(sitem); 
    recyclerView.getAdapter().notifyDataSetChanged(); 
    recyclerView.getAdapter().notifyItemRangeChanged(0, recyclerView.getAdapter().getItemCount()); 

    } 
    @Override 
    public void onFail(String msg) { 
    progressbar.setVisibility(View.GONE); 
    Toast.makeText(context, "FAILED ONLOAD", Toast.LENGTH_LONG).show(); 
    } 
}); 
+0

Oh, ich verstehe. Und wie bekommen Sie in der Recycler-Ansicht einen Hinweis auf die Fortschrittsanzeige? Ich habe Probleme mit findViewById –

+0

übergeben Sie Ihr Fortschrittsobjekt in dieser Klasse, wie Sie Recycler-Ansicht übergeben – Aman

1

thr gibt 2 Möglichkeiten: 1) legte die progressbar im unteren Bereich des Bildschirms und wenn Sie unten auf der recyclerView durch int last = layoutManager.findLastVisibleItemPosition(); wird es nur angezeigt und wenn Sie die Antwort erhalten, dann verstecken Sie es;

2) Fügen Sie in Ihrem Adapter: eine Dummy-Zeile zur letzten Position Ihrer Liste hinzu. und nur in Adapter überprüfen, wenn die Position zeigen, letzte ist dann der ProgressBar

if(position == list.size-1){ 
View row = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.progressbar, viewGroup, false);//create a layout which only have progress bar 
} 
else{ 
View row = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_list, viewGroup, false); 
} 
1

Ich glaube, Sie dieses link folgen Recyclerview offically Kopf- oder Fußzeile hinzuzufügen. Und Sie fügen Footer als Fortschrittsbalken hinzu, um mehr Daten zu laden, und Fußzeile zu entfernen, wenn Sie mit dem Laden von Daten fertig sind.

0

HIER IST SIMPLER UND CLEANER APPROACH.

1. Fügen Sie den Fortschrittsbalken unter dem RecyclerView hinzu.

<android.support.v7.widget.RecyclerView 
     android:id="@+id/rv_movie_grid" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:paddingBottom="50dp" 
     android:clipToPadding="false" 
     android:background="@android:color/black" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent"> 

    </android.support.v7.widget.RecyclerView> 

    <ProgressBar 
     android:id="@+id/progressBar" 
     style="?android:attr/progressBarStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="invisible" 
     android:background="@android:color/transparent" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" /> 

Hier android: paddingBottom = "50dp" und android: clipToPadding = "false" sind sehr wichtig.

2. Erhalten Sie einen Verweis auf den Fortschrittsbalken.

progressBar = findViewById(R.id.progressBar); 

3. Methoden definieren, um Fortschrittsbalken ein- und ausblenden.

void showProgressView() { 
    progressBar.setVisibility(View.VISIBLE); 
} 

void hideProgressView() { 
    progressBar.setVisibility(View.INVISIBLE); 
} 
Verwandte Themen