0


Ich mache eine App, die einige schöne Mädchen in Recyclerview mit mehr Last beim Scrollen nach unten zeigt. Und ich bin mit einigen Problemen fest, Sie können es in Videos Link hier sehen: recyclerview error from google drive
Oder:
I. Wenn Sie weitere Elemente hinzufügen, zeigt es nur eine Spalte nicht alle 3 Spalten wie definiert.
II. Wenn Sie nach oben scrollen, werden alle Kindansichten sehr schnell angezeigt und danach bringt mich die Recycleransicht ganz nach oben und überspringt alle Elemente. Beispiel: Das aktuelle Element ist 100 und scrollt nach oben, einige Millisekunden stehen oben auf der Liste.
Mein Projekt hat: 1. build.grade: kompilieren 'com.android.support:recyclerview-v7:23.4.0': Ich möchte Recyclerview nicht auf 24 wegen JDK-Version aktualisieren.
2. MainActivity erstreckt AppCompatActivityRecyclerView lädt Liste der Bilder mit endlosem Scrollen

public class MainActivity extends AppCompatActivity { 

private RelativeLayout rootView; 
private RecyclerView mRecyclerView; 
private StaggeredGridLayoutManager mLayoutManager; 
private ImagesAdapter mAdapter; 
private Handler mHandler; 

private int currentOffset; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    currentOffset = 0; 
    loading = true; 
    mHandler = new Handler(getMainLooper()); 
    initRetrofit(); 
    initWidget(); 

    fetchingData(true); 
} 

private void initRetrofit() { 
    Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 
    OkHttpClient.Builder builderHttpClient = new OkHttpClient.Builder(); 
    //builderHttpClient.interceptors().add(new LoggingInterceptor()); 
    OkHttpClient client = builderHttpClient.build(); 

    NetworkManager.init(new Retrofit.Builder().baseUrl(APIConfig.BASE_URL).addConverterFactory(new ToStringConverterFactory()).addConverterFactory(GsonConverterFactory.create(gson)).client(client).build()); 
} 

private void initWidget() { 
    mRecyclerView = (RecyclerView) findViewById(R.id.rv_main); 

    mLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); 

    mAdapter = new ImagesAdapter(this, new ArrayList<PhotoItemModel>()); 

    mRecyclerView.setLayoutManager(mLayoutManager); 
    mRecyclerView.addItemDecoration(new SpacesItemDecoration(15)); 
    mRecyclerView.setAdapter(mAdapter); 

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() 
      { 
       @Override 
       public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
       { 
        if(dy > 0) //check for scroll down 
        { 
         visibleItemCount = mLayoutManager.getChildCount(); 
         totalItemCount = mLayoutManager.getItemCount(); 

         int[] items = mLayoutManager.findFirstCompletelyVisibleItemPositions(null); 
         if (items.length > 0) { 
          pastVisibleItems = items[0]; 
         } 

         if (loading) 
         { 
          if ((visibleItemCount + pastVisibleItems) >= totalItemCount) 
          { 
           loading = false; 
           fetchingData(); 
          } 
         } 
        } 
       } 
      }); 
} 

private void fetchingData() { 
    currentOffset = mAdapter.getItemCount(); 
    mHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      NetworkManager.getPhotoByOffset(currentOffset, new Callback<GetPhotoResponse>() { 
       @Override 
       public void onResponse(Call<GetPhotoResponse> call, retrofit2.Response<GetPhotoResponse> response) { 
        if (null != response && null != response.body()) { 
         ResponseModel responseModel = response.body().getResponseModel(); 
         List<PostItemModel> postItemModels = responseModel.getPostItemModels(); 
         List<PhotoItemModel> photoItemModels = new ArrayList<>(); 
         for (PostItemModel postItemModel : postItemModels) { 
          photoItemModels.addAll(postItemModel.getPhotos()); 
         } 
         mAdapter.insertMoreItems(photoItemModels); 
         loading = true; 
        } else { 
         loading = true; 
         fetchingData(); 
        } 
       } 

       @Override 
       public void onFailure(Call<GetPhotoResponse> call, Throwable t) { 
        t.printStackTrace(); 
        loading = true; 
        fetchingData(); 
       } 
      }); 
     } 
    }, 5000); 
} 


3. Adapter:

public class ImagesAdapter extends RecyclerView.Adapter<VHImage> { 

private MainActivity mainActivity; 
private List<PhotoItemModel> photoItemModels; 

public List<PhotoItemModel> getPhotoItemModels() { 
    return photoItemModels; 
} 

public ImagesAdapter(MainActivity mainActivity, ArrayList<PhotoItemModel> photoItemModels) { 
    this.mainActivity = mainActivity; 
    this.photoItemModels = photoItemModels; 
} 

@Override 
public VHImage onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false); 
    return new VHImage(mainActivity, view); 
} 

@Override 
public void onBindViewHolder(VHImage holder, int position) { 
    holder.bindData(photoItemModels.get(position)); 
} 

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

public void insertMoreItems(List<PhotoItemModel> morePhotoItemModels) { 
    int oldSize = photoItemModels.size(); 
    photoItemModels.addAll(morePhotoItemModels); 
    notifyItemRangeInserted(oldSize, morePhotoItemModels.size()); 
} 
  1. ViewHolder

    public class VHImage erstreckt RecyclerView .ViewHolder implementiert View.OnClickListener {

    private MainActivity mainActivity; privates ImageView ivImage; private Ansicht div1, div2; private PhotoItemModel photoItemModel;

    öffentlich VHImage (MainActivity mainActivity, Ansicht itemView) { super (itemView); this.mainActivity = mainActivity; ivImage = (Bildansicht) itemView.findViewById (R.id.iv_image); div1 = itemView.findViewById (R.id.v_div_1); div2 = itemView.findViewById (R.id.v_div_2); ivImage.setOnClickListener (this); }

    öffentliche void bindData (PhotoItemModel photoItemModel) { this.photoItemModel = photoItemModel; Glide.with (mainActivity.getApplicationContext()) .load (photoItemModel.getAltSizesList(). Get (2) .getUrl()) .diskCacheStrategy (DiskCacheStrategy.RESULT) .listener (neu RequestListener() { @Override public boolean OnException (Exception e, String-Modell, Target Ziel, boolean isFirstResource) { div1.setVisibility (View.INVISIBLE); div2.setVisibility (View.INVISIBLE); return false;}

      @Override 
          public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
           div1.setVisibility(View.VISIBLE); 
           div2.setVisibility(View.VISIBLE); 
           return false; 
          } 
         }) 
         .into(ivImage); 
    

    }

    @Override public void onClick (Ansicht anzeigen) { mainActivity.onImageClick (Ansicht, Ansicht ((ImageView)).getDrawable(), photoItemModel); } }

  2. Aktivität Layout

<android.support.v7.widget.RecyclerView 
    android:id="@+id/rv_main" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="0.5dp" 
    android:visibility="invisible"/> 

<ImageView 
    android:id="@+id/iv_full_screen" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:adjustViewBounds="true" 
    android:scaleType="fitCenter" 
    android:visibility="invisible"/> 


<ImageView 
    android:id="@+id/iv_splash1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:adjustViewBounds="true" 
    android:scaleType="fitCenter" 
    android:visibility="gone"/> 

<ImageView 
    android:id="@+id/iv_splash2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:adjustViewBounds="true" 
    android:scaleType="fitCenter" 
    android:visibility="gone"/> 

<ProgressBar 
    android:id="@+id/pb_loading" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="200dp" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/iv_splash1" 
    android:layout_centerHorizontal="true" 
    android:layout_gravity="bottom" 
    android:layout_marginBottom="3dp" 
    android:layout_marginTop="20dp" 
    android:indeterminate="true" 
    android:max="1000" 
    android:progressDrawable="@drawable/progress_drawable"/> 

  1. Artikel Layout

<View 
    android:id="@+id/v_div_1" 
    android:layout_width="match_parent" 
    android:layout_height="1dp" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:background="#000000" 
    android:visibility="invisible"/> 

<View 
    android:id="@+id/v_div_2" 
    android:layout_width="match_parent" 
    android:layout_height="1dp" 
    android:layout_marginLeft="5dp" 
    android:layout_marginRight="5dp" 
    android:layout_marginTop="0.5dp" 
    android:background="#000000" 
    android:visibility="invisible"/> 

<ImageView 
    android:id="@+id/iv_image" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="0.5dp" 
    android:adjustViewBounds="true"/> 

+0

Ich denke, Retrofit ist nicht in der Lage, alle Bilder so schnell zu laden. Überprüfen Sie, ob dies der Fall ist. Wenn ja, dann erstellen Sie einen Listener, der erkennt, ob alle Bilder geladen sind, und aktiviert den Bildlauf nach unten. Bis dahin zeige ich einen Fortschrittsdialog – suku

+0

Ich benutze Glide zum Laden von Bildern und ich habe etwas so seltsames gefunden. Das ist ImageView in ** 6.item Layout **. Wenn ich es lasse ** height = wrap_content ** und ** adjustViewBounds = "true" ** dann bekomme ich ein Problem, aber wenn ich ** height = xxdp ** ändere, ist es gelöst. Aber ich möchte es nicht mit einer bestimmten Höhe setzen. Noch eine andere Lösung finden ... –

Antwort

0

vor dem Download ein Bild, können Sie seine Größe nicht finden, wenn Sie Ihre Bildgröße von webservice senden und Ihre ImageView Höheneinstellung, bevor Sie es zeigen.

Zum Beispiel Ihre WebService Antwort könnte so etwas sein:

{ 
    "ImageLink" = "http://www.example.com/example.jpg" 
    "ImageWidth" = 1024 
    "ImageHeight" = 768 
} 

Dann stellen Sie Ihre ImageView Größe wie folgt aus:

imageview.getLayoutParams().height = imageview.getWidth() * (ImageHeight/ImageWidth); 

Für eine bessere Leistung eingestellt ImageView Layoutgröße, bevor Sie es in den RecyclerView.