2015-10-22 24 views
11

Tôi đang tải hình ảnh 400x200 trong RecyclerView, nhưng việc di chuyển bị lag trên các thiết bị 2k. Tôi đang sử dụng Picasso để tải hình ảnh từ tài nguyên.RecyclerView laggy scrolling

Như bạn có thể thấy trong hình ảnh demo bị mờ trên màn hình 2k, nhưng nếu tôi tải hình ảnh có độ phân giải cao thì tình hình trở nên tồi tệ hơn. Làm thế nào để sửa lỗi này, tôi thậm chí không tải hình ảnh lớn, 400x200 của nó?

Demo

Đây là mã của tôi Card_view.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/card_view" 
 
    card_view:cardPreventCornerOverlap="false" 
 
    android:layout_width="fill_parent" 
 
    android:layout_height="wrap_content" 
 
    android:layout_margin="8dp" 
 
    card_view:cardCornerRadius="2dp" 
 
    > 
 

 
    <LinearLayout 
 

 
     android:layout_width="fill_parent" 
 
     android:layout_height="wrap_content" 
 
     android:orientation="vertical" 
 

 
     android:id="@+id/rel" 
 
     > 
 
     <ImageView 
 
      android:id="@+id/cardimage" 
 
      android:layout_width="match_parent" 
 
      android:layout_height="wrap_content" 
 
      android:scaleType="fitXY" 
 
      android:src="@drawable/p7" 
 
      /> 
 

 
     <TextView 
 
      android:layout_width="wrap_content" 
 
      android:layout_height="wrap_content" 
 
      android:text="title" 
 
      android:paddingLeft="16dp" 
 
      android:paddingRight="16dp" 
 
      android:paddingTop="16dp" 
 

 
      android:paddingBottom="24dp" 
 
      android:textStyle="bold" 
 
      android:textSize="24sp" 
 
      android:id="@+id/cardtitle" 
 
      android:layout_gravity="center_vertical" 
 
      /> 
 

 
    </LinearLayout> 
 

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

Mã Myadapter

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> { 

private Context mContext; 
List<Flower> list = new ArrayList<>(); 

public CardAdapter(Context mContext, List<Flower> list) { 
    this.mContext = mContext; 
    this.list = list; 

} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.card_view, parent, false); 
    return new ViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 

    holder.Flower=getItem(position); 
    holder.cardtitle.setText(list.get(position).name); 

    Picasso.with(mContext) 
      .load(list.get(position).id) 
      .placeholder(R.drawable.ic_launcher) 
      .into(holder.cardimage); 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 

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

public Flower getItem(int i) { 
    return list.get(i); 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 

    ImageView cardimage; 
    TextView cardtitle; 
    Flower Flower; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     cardimage = (ImageView) itemView.findViewById(R.id.cardimage); 
     cardtitle = (TextView) itemView.findViewById(R.id.cardtitle); 
    } 
} 
} 

UPDATE: Tôi tải hình ảnh từ tài nguyên, tôi không đang tải xuống không có gì

Đây là mảng tôi

private void initializeData() { 
    flowers = new ArrayList<>(); 
    flowers.add(new Flower("Flower 1", R.drawable.p8)); 
    flowers.add(new Flower("Flower 2", R.drawable.p10)); 
    flowers.add(new Flower("Flower 3", R.drawable.p11)); 
    flowers.add(new Flower("Flower 4", R.drawable.p8)); 
    flowers.add(new Flower("Flower 5", R.drawable.photo2)); 
    flowers.add(new Flower("Flower 6", R.drawable.photo6)); 
    flowers.add(new Flower("Flower 7", R.drawable.p12)); 
    flowers.add(new Flower("Flower 8", R.drawable.p9)); 
    flowers.add(new Flower("Flower 9", R.drawable.p8)); 
    flowers.add(new Flower("Flower 10", R.drawable.p8)); 
    flowers.add(new Flower("Flower 11", R.drawable.p8)); 
    flowers.add(new Flower("Flower 12", R.drawable.p10)); 
} 

UPDATE 2: Guys Tôi cố định hầu hết các độ trễ bằng cách thiết lập adapter.setHasStableIds (true), nhưng ứng dụng vẫn còn lag trên cuộn giấy đầu tiên trong khi hình ảnh không được nạp chưa , cách khắc phục điều đó?

CẬP NHẬT 3: Tôi vừa thử tải hình ảnh từ web và mọi thứ có vẻ trơn tru, có thể có một số vấn đề khi tải hình ảnh từ tài nguyên.

Ok, cảm ơn các bạn, tôi sẽ tải hình ảnh của tôi từ web.

+0

chỉ tụt hậu khi cuộn xuống ?? hoặc làm nó lag cho cả hai di chuyển lên và xuống? –

+0

@LucasCrawford độ trễ của nó chỉ khi cuộn xuống. EDIT: của nó tụt hậu lên và xuống, một lần khi hình ảnh được tải có ít tụt hậu nhưng nó vẫn còn đó. –

+0

bạn có tìm thấy giải pháp này không ?? –

Trả lời

2

Bạn cần nhận được hình ảnh không đồng bộ. Như bây giờ, nó quầy hàng để thực sự tải xuống hình ảnh.

Để trống hình ảnh khi được tạo nhưng có một số loại người nghe để đặt hình ảnh khi nó được tải xuống.

+1

Tôi không tải xuống hình ảnh, tôi đang đặt hình ảnh từ tài nguyên. –

-2

Tôi nghĩ lý do là Picasso lưu trữ hình ảnh của bạn nhưng vì bạn có danh sách các thứ mà bạn gộp cùng với ứng dụng của mình, bạn không cần phải lưu trữ hình ảnh của mình. Lưu vào bộ nhớ đệm chỉ hữu ích khi bạn tải xuống hình ảnh từ internet và bạn không muốn ứng dụng tải xuống lại hình ảnh mỗi khi bạn vuốt lên hoặc xuống trên recyclerview.

tôi sẽ điều chỉnh hoạt động của đường picasso bằng cách thay đổi memorypolicy vì vậy hãy thử này để thay thế:

Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image); 
+0

Cảm ơn bạn, nhưng không có tình trạng bộ nhớ đệm thậm chí còn tồi tệ hơn. Tôi thấy rằng khi sử dụng cách bố trí thay đổi kích thước trở nên tốt hơn một lần khi tất cả hình ảnh được tải, nhưng vẫn bị trễ trong khi cuộn xuống lần đầu tiên.Nhưng cài đặt sửa kích thước không hoạt động trong trường hợp của tôi, tôi muốn hình ảnh lấp đầy thẻ. –

+0

Nếu có thể rút ra được trong bộ nhớ hay không là câu hỏi. Nếu bạn tải các drawables trong RecyclerView thì điều này sẽ gây ra sự cản trở. Các bản vẽ cần được tải vào bộ nhớ trước khi RecyclerView bắt đầu. Tất cả không thể bao gồm drawable có thể cần phải được lưu trữ trước khi RecyclerView bắt đầu.Tôi không chắc chắn nếu RecyclerView (hoặc một số phần khác của bạn sử dụng) đang sử dụng thread UI hoặc BG thread. Nếu đã sử dụng chuỗi BG, bạn có thể cần đảm bảo rằng chúng không cạnh tranh – CmosBattery

+2

Đây là bản trình diễn của dự án https://drive.google.com/file/d/0BypaioeS7MXPNHY3ZUFiNVBtcTg/view?usp=sharing. Tôi đang tải drawables với picasso, làm thế nào tôi có thể tải chúng trước khi recycleView? Tôi đã thử gọi phương thức initializeData() sau khi tạo, nhưng có độ trễ stil trên cuộn đầu tiên. Hãy nhớ rằng, điều này chỉ hapens trên độ phân giải 2k. Trên tất cả mọi thứ hd đều mượt mà. –

8

là RecyclerView.setHasFixedSize() thiết lập là true? Tôi không thể tái sản xuất độ trễ này ... bạn có thể đăng toàn bộ dự án lên git không? Hãy kiểm tra này, có lẽ nó có thể giúp bạn: http://antonioleiva.com/recyclerview/

+0

Có đúng. Đây là dự án studio android. https://drive.google.com/file/d/0BypaioeS7MXPNHY3ZUFiNVBtcTg/view?usp=sharing –

+1

Tôi đang sử dụng vm genymotion và tôi dường như không thể tạo lại độ trễ. Tôi có 3 cải tiến có thể có: 1. trong activity_main.xml, thay đổi RecyclerView.layout_height thành "match_parent" 2. Thử chỉ sử dụng các png trong thư mục drawable của bạn, khi chúng giải nén nhanh hơn 3. Đặt adapter.setHasStableIds (true); và trong CardAdapter thêm: '@Override công khai getItemId dài (vị trí int) { vị trí trả lại; } ' –

+0

Cảm ơn bạn rất nhiều, đã khắc phục hầu hết độ trễ. Bây giờ ứng dụng chỉ bị lag khi cuộn đầu tiên khi hình ảnh vẫn chưa được tải. Khi hình ảnh được tải mọi thứ đều mượt mà. Bất kỳ suy nghĩ về điều này? Bạn đang chạy trình mô phỏng ở độ phân giải 2k, hãy thử chạy n6 hoặc n6p. Độ trễ của nó chỉ ở độ phân giải 2k. –

2

nếu bạn sử dụng Recyclerview trong chế độ dọc và hoạt động của bạn chứa mục khác mà bạn có ScrollView sau đó bạn phải sử dụng NestedScrollView thay vì ScrollView.

như được mô tả trong tài liệu google NestedScrollView giống như ScrollView, nhưng nó hỗ trợ hoạt động như cả phụ huynh cuộn lồng nhau và con trên cả phiên bản Android mới và cũ. Tính năng cuộn lồng nhau được bật theo mặc định.

+1

Điều gì sẽ xảy ra nếu nhiều Chế độ xem Recycler nằm trong ScrollView? –

+0

cho nhiều Chế độ xem Recycler, bạn cũng phải sử dụng "NestedScrollView" để xử lý cuộn – MSH

11

nếu bạn đang sử dụng hai hoặc nhiều quan điểm tái chế như (RecyclerView và NestedView) thử này

recyclerView.setNestedScrollingEnabled(false);

Nguồn: Recyclerview inside Nested Scrollview scroll but does not fast scroll like normal Recyclerview or Nested Scrollview

+1

Không chắc chắn vấn đề của tôi có giống với áp phích gốc hay không, nhưng đây là bản cố định ở đây. – Larpus

+0

Cũng giống như vậy đối với tôi và tìm kiếm đưa tôi đến đây vì vậy khi tôi tìm thấy câu trả lời, tôi thích đăng nó ở đây –

1

Tôi có vấn đề recyclerView lag khi một trong những TextView trong recyclerView đã nhận được giá trị null. Tôi sửa lỗi này và recyclerView của tôi đã dừng trễ.

Các vấn đề liên quan