RecycleView care afișează doar primul element (Programare, Android)

moonlady16 a intrebat.

Iată care este problema: am creat cel mai simplu RecyclerView din lume, dar acesta afișează doar primul element. Nu reușesc să înțeleg de ce. Mulțumesc pentru orice ajutor.

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns_android="http://schemas.android.com/apk/res/android"
    android_layout_width="match_parent"
    android_layout_height="match_parent">

    <TextView
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_id="@+id/tv_detail"/>
</RelativeLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_tools="http://schemas.android.com/tools"

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_paddingBottom="@dimen/activity_vertical_margin"
    android_paddingLeft="@dimen/activity_horizontal_margin"
    android_paddingRight="@dimen/activity_horizontal_margin"
    android_paddingTop="@dimen/activity_vertical_margin"
    tools_context="com.bcit.moonlady.testrecycler.MainActivity">

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_text="Hello World!"
        android_id="@+id/tv_hello"/>

   <android.support.v7.widget.RecyclerView
        android_layout_width="match_parent"
        android_layout_height="300dp"
        android_id="@+id/rv_details"
        android_layout_below="@+id/tv_hello"/>
</RelativeLayout>

MainActivity.java

package com.bcit.moonlady.testrecycler;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    String[] data = {"test1", "test2", "test3"};

    RecyclerView mRecView;

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

        mRecView = (RecyclerView)findViewById(R.id.rv_details);
        mRecView.setHasFixedSize(true);
        mRecView.setLayoutManager(new    LinearLayoutManager(getApplicationContext()));
        mRecView.setAdapter(new DetailAdapter());
   }

   private class DetailView extends RecyclerView.ViewHolder {
        TextView mTextView;

        public DetailView(View itemView) {
            super(itemView);
            mTextView = (TextView)itemView.findViewById(R.id.tv_detail);
        }

        public void bindView(String string) {
            mTextView.setText(string);
        }
   }

   private class DetailAdapter extends RecyclerView.Adapter<DetailView> {
       @Override
       public DetailView onCreateViewHolder(ViewGroup parent, int viewType)          {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            View v = layoutInflater.inflate(R.layout.item_layout, parent, false);
            return new DetailView(v);
       }

       @Override
       public void onBindViewHolder(DetailView holder, int position) {
           String string = data[position];
           holder.bindView(string);
       }

       @Override
       public int getItemCount() {
           return data.length;
       }
   } 
}

Comentarii

  • mRecView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); de ce transmiteți contextul aplicației către managerul de aspect? –  > Por Bhargav.
  • Cred că layout-ul dvs. de reciclare nu este plin pentru 3 elemente de sus în jos –  > Por GiapLee.
  • javatechig.com/android/android-recyclerview-example vă rugăm să consultați acest link. S-ar putea să vă ajute –  > Por Anand Savjani.
  • Aș putea folosi „this” în loc de „getApplicationContext()”, este adevărat; -.  > Por moonlady16.
  • Acel exemplu de pe javatechig.com este bun; mulțumesc! –  > Por moonlady16.
7 răspunsuri
ramji

Trebuie să vă schimbați item_layout înălțimea ca wrap_contentdacă folosiți Android Support Library v 23.2.0 și mai sus

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns_android="http://schemas.android.com/apk/res/android"
    android_layout_width="match_parent"
    android_layout_height="wrap_content">

    <TextView
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_id="@+id/tv_detail"/>
</RelativeLayout>

Comentarii

  • A funcționat și pentru mine. Folosind Biblioteca de asistență 23.4.0 –  > Por X09.
  • mulțumiri pentru îndrumare Fac aceeași greșeală pe care a făcut-o moonlady16. –  > Por Arpit Patel.
  • Poate că OP ar trebui să marcheze acest lucru ca răspuns acceptat? (FWIW, a funcționat și pentru mine! Mulțumesc mult! Știam că este ceva de genul ăsta, dar sunt în mijlocul unui curs de dezvoltare Android și trimiterea unui e-mail pentru a obține un răspuns ar fi durat, ei bine, mai mult decât am vrut să aștept) 😉 –  > Por Scott Fraley.
  • Completând răspunsul lui @Ramji, dacă elementul inserat în RecycleView are dimensiunea părintelui, algoritmul RecycleView nu va insera niciodată celelalte elemente, deoarece RecycleView adaugă elemente noi doar dacă utilizatorul derulează în sus. Logica RecycleView adaugă elemente pe ecran doar dacă există o ipoteză de afișare a elementului în ui –  > Por Razor.
  • Eu folosesc AndroidX și acest răspuns este încă aplicabil. –  > Por itabdullah.
Priya Rajan

Și eu am făcut această greșeală comună. Doar schimbați LinearLayout-ul părinte – înălțimea ar trebui să fie „wrap_content”

<LinearLayout
android_layout_width="match_parent"
android:layout_height = "wrap_content"
..... >
..
..
</LinearLayout>

PK 7

Setați înălțimea la wrap_content a RelativeLayout în item_layout.xml.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns_android="http://schemas.android.com/apk/res/android"
    android_layout_width="match_parent"
    android_layout_height="wrap_content">

    <TextView
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_id="@+id/tv_detail"/>
</RelativeLayout>

ARRR

Am avut aceeași problemă, când RecyclerView a fost înfășurat în ScrollView. Ar trebui să folosiți în schimb NestedScrollView.

    <android.support.v4.widget.NestedScrollView
            android_layout_width="match_parent"
            android_layout_height="match_parent">

        <LinearLayout
                android_layout_width="match_parent"
                android_layout_height="wrap_content"
                android_orientation="vertical">

          <!-- other content -->

                <android.support.v7.widget.RecyclerView
                    android_id="@+id/my_recycler"
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"/>
        </LinearLayout>

 </android.support.v4.widget.NestedScrollView>

Srishti Roy

poate fi de ajutor

customAdapter = new CustomRecycleradapter(arrItems);
recyclerView.setLayoutManager(new LinearLayoutManager(mParentActivity));
recyclerView.setAdapter(customAdapter);

ArrayList<ListofItems> mSource;
// adapter class
public CustomRecycleradapter(ArrayList<ListofItems> source) {
    this.mSource = source;

}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);
    return new CustomHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof CustomHolder) {
        ((CustomHolder) holder).customerName.setText(mSource.get(position).getCustomerNumber());

    }
}

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

public void addItem(ArrayList<ListofItems> itemLists) {
    mSource.addAll(itemLists);

    notifyItemInserted(mSource.size() - 1);
}
public class CustomHolder extends RecyclerView.ViewHolder {
    @Bind(R.id.customer_name)
    TextView customerName;
    @Bind(R.id.time_stamp)
    TextView timeStamp;
    @Bind(R.id.amount)
    TextView amount;

    public CustomHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);

    }
}

Comentarii

  • Mi-a luat ceva timp pentru a face să funcționeze, dar mă bucur că am făcut-o; acum sunt conștient de ButterKnife. Mulțumesc!… –  > Por moonlady16.
Naveen Shriyan

Activitate:

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecycler;
String[] data = {"test1", "test2", "test3"};

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mRecycler = (RecyclerView) findViewById(R.id.rv_details);
    DetailAdapter adapter = new DetailAdapter();
    LinearLayoutManager manager = new LinearLayoutManager(this);
    mRecycler.setHasFixedSize(true);
    mRecycler.setLayoutManager(manager);
    mRecycler.setAdapter(adapter);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private class DetailAdapter extends RecyclerView.Adapter<DetailAdapter.DetailView> {

    @Override
    public void onBindViewHolder(DetailView holder, int position) {
        String string = data[position];
        holder.bindView(string);
    }

    @Override
    public DetailView onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View v = layoutInflater.inflate(R.layout.item_layout, parent, false);
        return new DetailView(v);
    }

    @Override
    public int getItemCount() {
        return data.length;
    }

    class DetailView extends RecyclerView.ViewHolder {
        TextView mTextView;

        public DetailView(View itemView) {
            super(itemView);
            mTextView = (TextView)itemView.findViewById(R.id.tv_detail);
        }

    public void bindView(String string) {
        mTextView.setText(string);
    }
}

    }
}

activity_main.xml

content_main.xml

item_layout.xml

Comentarii

  • Vă mulțumim pentru exemplul dvs.  > Por moonlady16.
  • @moonlady16 mă bucur că te-am ajutat, dacă te-a ajutat pls upvote și marchează ca răspuns corect, pentru că poate ajuta și pe alții. –  > Por Naveen Shriyan.
deefunkt

În primul rând, ar trebui să puneți clasa Recyclerview.veiwholder în interiorul adaptorului pentru a vă asigura că obțineți aceeași instanță.

//replaces contents of a view, invoked by the layout manager 
@Override public void onBindViewHolder(ViewHolder holder, int position) { 
// get the message to display from the array at the specified position 
// replace contents of the view with the new element
holder.mytextview.setText(recieveHistory.get(position)); 
}

Comentarii

  • Practic, nu permiteți recyclerView să își recicleze vizualizările, deoarece atribuiți static ID-ul TextView și apoi doar setați un șir de caractere în el. –  > Por deefunkt.

Tags: