RecyclerView загружает список изображений с бесконечной прокруткой

android android-recyclerview recycler-adapter recyclerview-layout

868 просмотра

1 ответ

16 Репутация автора

Я делаю приложение, которое показывает некоторых красивых девушек RecyclerViewс грузом больше, когда прокручиваешь вниз. И я застрял с несколькими проблемами, вы можете увидеть это в видео ссылки здесь.

Или же:

I. При добавлении дополнительных элементов отображается только один столбец, а не все 3 столбца, как определено.

II. При прокрутке вверх все дочерние представления перемещаются очень быстро и после этого RecyclerViewвыводят меня наверх и пропускают все элементы среди. Пример: текущий элемент равен 100 и прокрутите вверх, несколько миллисекунд, которые вы стоите в верхней части списка.

Мой проект имеет:

  1. build.grade: compile 'com.android.support:recyclerview-v7:23.4.0': Я не хочу обновлять RecyclerViewдо 24 из-за версии JDK.
  2. MainActivity расширяет AppCompatActivity:

    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. адаптер:

    public class ImagesAdapter extends RecyclerView.Adapter<VHImage> {
    private MainActivity mainActivity;
    private List<PhotoItemModel> photoItemModels;
    
    public ImagesAdapter(MainActivity mainActivity, ArrayList<PhotoItemModel> photoItemModels) {
        this.mainActivity = mainActivity;
        this.photoItemModels = photoItemModels;
    }
    
    public List<PhotoItemModel> getPhotoItemModels() {
        return 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());
    }
    }
    
  4. ViewHolder

    public class VHImage extends RecyclerView.ViewHolder implements View.OnClickListener {
    private MainActivity mainActivity;
    private ImageView ivImage;
    private View div1, div2;
    private PhotoItemModel photoItemModel;
    
    public VHImage(MainActivity mainActivity, View itemView) {
        super(itemView);
        this.mainActivity = mainActivity;
        ivImage = (ImageView) 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);
    }
    
    public void bindData(PhotoItemModel photoItemModel) {
        this.photoItemModel = photoItemModel;
        Glide.with(mainActivity.getApplicationContext())
                .load(photoItemModel.getAltSizesList().get(2).getUrl())
                .diskCacheStrategy(DiskCacheStrategy.RESULT)
                .listener(new RequestListener<String, GlideDrawable>() {
                    @Override
                    public boolean onException(Exception e, String model, Target<GlideDrawable> target, 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(View view) {
        mainActivity.onImageClick(view, ((ImageView) view).getDrawable(), photoItemModel);
    }
    }
    
  5. макет деятельности

    <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" />
    

  6. макет элемента

    <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" />
    

Автор: Long Đình Источник Размещён: 18.07.2016 05:44

Ответы (1)


0 плюса

600 Репутация автора

Перед загрузкой изображения вы не сможете найти его размер, если не отправите свой размер изображения из веб-службы и не настроите свой ImageViewрост, прежде чем показывать его.

Например, ваш ответ веб-службы может быть примерно таким:

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

Затем установите свой ImageViewразмер следующим образом:

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

Для повышения производительности установите ImageViewразмер макета, прежде чем добавить его в RecyclerView.

Автор: Saman Salehi Размещён: 13.12.2016 05:03
Вопросы из категории :
32x32