Kamil Radz
Kamil Radz

Reputation: 47

RecyclerView not showing (displaying)

RecyclerView is not showing at all. Only the TextView is displayed. I looked at other questions and used all answers from previous questions. Other answers suggested that recycler's width can't be set wrap content or that setAdapter should be called after setting layout manager and I meet these conditions.

MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = findViewById(R.id.main_recycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        final MainAdapter adapter = new MainAdapter();
        recyclerView.setAdapter(adapter);

        List<FirebaseProduct> firebaseProductList = new ArrayList<>();
        firebaseProductList = getData(); //Here is my Firebase code
        adapter.setList(firebaseProductList);

    }
 }

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/main_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/aktualne_produkty"
        android:gravity="center"
        android:background="@color/colorPrimary"
        android:textAppearance="@style/TextAppearance.AppCompat.Large">
    </TextView>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/main_recycler"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        tools:listitem="@layout/card_main"
        android:layout_below="@id/main_text"/>
</RelativeLayout>

MainAdapter

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainHolder> {
    private List<FirebaseProduct> productList = new ArrayList<>();

    @NonNull
    @Override
    public MainHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_main, parent, false);
        return new MainHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MainHolder holder, int position) {
        FirebaseProduct product = productList.get(position);
        Log.d("Prod holder", "name - " + product.getProductName());
        Log.d("Prod holder", "num - " + product.getProductNumber());
        holder.nameView.setText(product.getProductName());
        holder.numView.setText(product.getProductNumber());
       
    }

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

    public void setProductList(List<FirebaseProduct> productList1){
        this.productList = productList1;
        notifyDataSetChanged();
    }

    public List<FirebaseProduct> getList(){
        return productList;
    }

    public static class MainHolder extends RecyclerView.ViewHolder{
        private TextView nameView;
        private TextView numView;
       

        public MainHolder(View itemView){
            super(itemView);
            nameView = itemView.findViewById(R.id.product_name);
            numView = itemView.findViewById(R.id.product_count);
           
        }
    }
}

card_main

<androidx.cardview.widget.CardView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="8dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
            android:layout_weight="3">
            <TextView
                android:id="@+id/product_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center">
            </TextView>
            <TextView
                android:id="@+id/product_count"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/product_name">
            </TextView>
        </RelativeLayout>
        <ImageView
            android:id="@+id/product_image"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:contentDescription="@string/product_description">
        </ImageView>
    </LinearLayout>
</androidx.cardview.widget.CardView>

Upvotes: 1

Views: 66

Answers (1)

Shikhar Deep
Shikhar Deep

Reputation: 252

You are calling adapter.setList(firebaseProductList); in MainActivity but the function name in MainAdapter is setProductList(). So change it to adapter. setProductList(firebaseProductList)

Also, you want to be sure getData(); in MainActivity should return a non-empty list. you can verify it using debugger or by just adding a log statement before adapter.setList(firebaseProductList). like this:

Log.d("LIST_SIZE", firebaseProductList.size()); //this will print list size
adapter.setList(firebaseProductList); //you have to change it to adapter. setProductList(firebaseProductList)

Upvotes: 1

Related Questions