Chế độ xem tái chế hiển thị mục duy nhất


124

Tôi đang đối mặt với một lỗi lạ trong đó recyclerview chỉ hiển thị một mục duy nhất. Dưới đây là mã cho bộ điều hợp tái chế của tôi:

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


List<chat> chats;
String username;
final int My=0,Their=1;

public ChatAdapter(List<chat> chats) {
    this.chats = chats;
    this.username = PushApp.getApp().getSPF().getStringData(Constants.ANAME);
}


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case My:
            View v1 = inflater.inflate(R.layout.my_chat_child, parent, false);
            viewHolder = new MyChatHolder(v1);
            break;
        case Their:
            View v2 = inflater.inflate(R.layout.their_chat_child, parent, false);
            viewHolder = new TheirMessageHolder(v2);
            break;
        default:
            View v = inflater.inflate(R.layout.my_chat_child, parent, false);
            viewHolder = new MyChatHolder(v);
            break;
    }

    return viewHolder;

}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    switch (holder.getItemViewType()) {
        case My:
            MyChatHolder myChatHolder = (MyChatHolder) holder;
            myChatHolder.setMyMessage(chats.get(position).getMessage());
            break;

        case Their:
            TheirMessageHolder theirMessageHolder = (TheirMessageHolder) holder;
            theirMessageHolder.setTheirChat(chats.get(position).getFrom(), chats.get(position).getMessage());
            break;
    }
}

@Override
public int getItemViewType(int position) {
    if(username.equalsIgnoreCase(chats.get(position).getFrom()))
        return My;
    return Their;
}

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

Tôi đã sử dụng mã này trong ứng dụng khác và nó hoạt động hoàn hảo. Tôi đã kiểm tra dữ liệu trò chuyện cũng hoàn hảo.

Đây là liên kết đến tập tin bố trí git repo: tập tin bố trí


@OShiffer Tôi đã thêm liên kết git repo
Rujul1993

4
Cố gắng đặt wrap_contentthay vì match_parentchiều cao và chiều rộng trong bố cục của bạn github.com/revic1993/androidchat/blob/master/app/src/main/res/ tựa github.com/revic1993/androidchat/blob/master/app/src/main / res /
Bắn

@Slavik Cảm ơn nó đã làm việc!
Rujul1993

Câu trả lời:


419

Không sử dụng match_parentchiều cao cho chế độ xem mục của bạn. Một mục lấp đầy toàn bộ màn hình theo chiều dọc để bạn không nhìn thấy một mục khác.


43
Google vui lòng thêm một số cảnh báo Lint, làm cho lint phiền phức của bạn hữu ích lần này!
Chiến tranh neon

1
Oh Cảm ơn, người đàn ông tuyệt vời, trong trường hợp của tôi, tôi đã tạo ra vật phẩm với match_parent là chiều cao. Do đó, tất cả các màn hình được giữ đằng sau mục đầu tiên.
Naveed Ahmad

7
hãy để tôi mua cho bạn một cofee! bạn vừa tiết kiệm sự tỉnh táo của tôi! cảm ơn!
microwth

Không làm việc cho tôi. Tất cả các mục chỉ được hiển thị nếu Buttonđược đặt trước RecyclerView. Bất kỳ đề xuất?
Konstantin Konopko


17

Khi bạn đang tạo row.xml cho recyclerview, hãy làm theo những điều sau:

  1. Luôn sử dụng "quấn_content" cho chiều cao của hàng nếu không trong "match_parent", nó sẽ chiếm toàn bộ màn hình cho một hàng.

  2. Bạn cũng có thể lấy chiều cao trong dp.


1
tôi có cùng một vấn đề đã thử di chuyển và thấy phần còn lại của các mặt hàng
Nixon Kosgei

1

Hãy thử thay đổi bố cục được sử dụng trong chế độ xem mục của bạn thành FrameLayout. Đây là một ví dụ.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item"
    android:layout_width="match_parent"
    android:layout_height="?listPreferredItemHeight"
    android:clickable="true"
    android:focusable="true"
    android:foreground="?selectableItemBackground">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"/>
</FrameLayout>

1

Lỗi của tôi là tôi đã vô tình sử dụng:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

thay vì:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

0

1) nếu recyclerview của bạn thẳng đứng thì hãy đặt chiều cao của recyclerview match_parentrow_item.xmlchiều cao cũngmatch_parent

2) nếu recyclerview của bạn nằm ngang thì hãy đặt Width của recyclerview match_parentrow_item.xmlWidthmatch_parent

ví dụ: - RecyclerView ngang

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="60dp"
        android:layout_marginRight="60dp" />

row_item.xml

<TextView
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:background="@drawable/rect"
android:gravity="center"
android:maxLines="2"
android:padding="10dp"
android:textColor="@color/white"
android:textSize="25sp" />

0

content_main.xml như sau

android:layout_width="match_parent"
android:layout_height="match_parent"

Tệp IN row_list.xml thực hiện các thay đổi sau

android:layout_width="match_parent"
android:layout_height="wrap_content"

Tôi thực hiện các thay đổi ở trên nó chạy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.