Tek öğeyi gösteren geri dönüşümcü görünümü


125

Recyclerview'un yalnızca tek bir öğeyi gösterdiği garip bir hatayla karşılaşıyorum. Aşağıda recyclerview adaptörümün kodu:

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();
}}

Bu kodu başka bir uygulamada zaten kullandım ve mükemmel çalışıyor. Ayrıca mükemmel olan sohbet verilerini kontrol ettim.

Git repo düzen dosyalarının bağlantısı: düzen dosyaları


@OShiffer Git repo bağlantısını
ekledim

4
Yerleşimlerinizde yükseklik ve genişlik wrap_contentyerine match_parentyükseklik ve genişlik ayarlamayı deneyin github.com/revic1993/androidchat/blob/master/app/src/main/res/… github.com/revic1993/androidchat/blob/master/app/src/main / res /…
Slavik

@Slavik Teşekkürler işe yaradı!
Rujul1993

Yanıtlar:


420

match_parentÖğe görünümünüz için yükseklik için kullanmayın . Bir öğe tüm ekranı dikey olarak doldurur, böylece bir başkasını görmezsiniz.


43
Google lütfen biraz Lint uyarıları ekleyin, sinir bozucu tüylerinizi bu sefer kullanışlı hale getirin!
Neon Warge

1
Oh Teşekkürler Harika adam, benim durumumda, yüksekliği match_parent ile bir öğe yarattım. Bu nedenle tüm ekran ilk öğenin arkasında tutuldu.
Naveed Ahmad

7
Sana bir kahve alayım! Akıl sağlığımı kurtardın! Teşekkürler!
microwth

Benim için çalışmıyor. Tüm öğeler yalnızca daha Buttonönce yerleştirilirse gösterilir RecyclerView. Baska öneri?
Konstantin Konopko


18

recyclerview için row.xml oluştururken şu şeyleri takip etmelisiniz:

  1. Satırın yüksekliği için her zaman "wrap_content" kullanın, aksi takdirde "match_parent" seçeneğinde tek bir satır için tüm ekranı kaplar.

  2. Yüksekliği dp cinsinden de alabilirsiniz.


1
aynı sorunu kaydırmayı denedim ve öğelerin geri kalanını gördüm
Nixon Kosgei

1

Öğe görünümünüzde kullanılan düzeni olarak değiştirmeyi deneyin FrameLayout. İşte bir örnek.

<?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

Benim hatam şuydu:

LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

onun yerine:

LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

0

1) geri dönüştürücünüzün görünümü dikeyse, geri dönüştürücünün yüksekliğini match_parentve row_item.xmlyüksekliğini de ayarlayınmatch_parent

2) geri dönüştürücünüzün görünümü yataysa, geri dönüşüm görünümünün Genişliğini match_parentve row_item.xmlGenişliği de ayarlayınmatch_parent

örneğin: - Yatay RecyclerView

<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 aşağıdaki gibi

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

IN row_list.xml dosyası aşağıdaki değişiklikleri yapın

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

Yukarıdaki değişiklikleri çalıştırıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.