segue_segway
segue_segway

Reputation: 1518

RecyclerView not being populated (getItemCount() is returning zero)

I looked at the other questions on SO about this, and matched by code word for word but I must have missed something because nothing is working. getItemCount() is returning zero, but I debugged my data list and it seemed to add all my data properly, so something is going wrong with the communication to the adapter.

Please tell me what's going wrong here!

Below is my code for MainActivity.java:

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseUser;

import java.util.ArrayList;
import java.util.List;


public class Profile_Page extends ActionBarActivity {
    UserLocalStore userLocalStore;
    private RecyclerView recyclerView;
    private DataAdapter adapter;
    private Context context;
    final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    public List<Information> data = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile__page);
        ParseUser currentUser = ParseUser.getCurrentUser();
        String struser = currentUser.getUsername();
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 

        Button logoutBtn = (Button) findViewById(R.id.logOutBtn);



        adapter = new DataAdapter(getApplicationContext(), getData()); 
        recyclerView.setAdapter(adapter); 
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

   public List<Information> getData()
{
    ParseQuery <ParseObject> query = ParseQuery.getQuery("ParseClassName");
        query.whereEqualTo("author", ParseUser.getCurrentUser());
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> list, ParseException e) { 
                if (e == null) {
                    for (ParseObject getData : list) { 
                        Information current = new Information();
                        current.thing= getData.getString("Thing");                                           
                        data.add(current); 
                        adapter.notifyDataSetChanged();
                        //for some reason, data isn't getting transferred to adapter


                    }

                } else {
                    //something went wrong
                }

            }


        });
return data;
    }


    public void logOut(View view)
    {
        // Logout current user
        ParseUser.logOut();
        finish();
    }
}

Code for DataAdapter:

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.EditText;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class DataAdapter extends RecyclerView.Adapter<DataAdapter.MyViewHolder>
{
    private LayoutInflater inflater;
    List<Information> data = Collections.emptyList();



    public DataAdapter(Context context, List<Information> data) 
    {
        inflater = LayoutInflater.from(context);
        this.data= data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = inflater.inflate(R.layout.recycler_view_layout, parent, false); 
        MyViewHolder holder = new MyViewHolder(view); 
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position)
    {
        Information current = data.get(position);
        holder.tv.setText(current.thing);

    }

    @Override
    public int getItemCount()
    {   Log.d("datasize", String.valueOf(data.size()));
        return data.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder
    {    TextView tv;




        public MyViewHolder(View itemView) {
            super(itemView);
            tv= (TextView) itemView.findViewById(R.id.thingID);


        }
    }
}

Information.java

public class Information
{
    public String thing;


}

Recycler_view_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dummy Text"
        android:id="@+id/thingID"/>


</LinearLayout>

Activity in which the RecyclerView is added:

<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.android.blah.Profile_Page"
    >


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        android:id="@+id/button3"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/recyclerView"
        android:layout_alignEnd="@+id/recyclerView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Log out"
        android:id="@+id/logOutBtn"
        android:layout_below="@+id/button3"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="logOut"
        android:layout_marginTop="85dp" />


    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height = "wrap_content"
        android:id="@+id/recyclerView"
        android:layout_alignTop="@id/logOutBtn" />

</RelativeLayout>

Upvotes: 3

Views: 5977

Answers (4)

DomonLee
DomonLee

Reputation: 193

I think you should do like this:

mXxxData.clear();  
mXxxData.addAll(reqForInternetData);  
mRecyclerViewAdapter.notifyItemInserted(0);

That is worked for me.

Upvotes: 1

Jenison Gracious
Jenison Gracious

Reputation: 545

Try setting the adapter only after setting the layout manager

recyclerView.setLayoutManager(new  
LinearLayoutManager(getApplicationContext()));
adapter = new DataAdapter(getApplicationContext(), data); 
recyclerView.setAdapter(adapter); 

Upvotes: 0

user3307005
user3307005

Reputation: 216

Maybe if u set adapter inside done method it will work. Insert bottom for loop.

adapter = new DataAdapter(getApplicationContext(), data); 
recyclerView.setAdapter(adapter); 
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

Upvotes: 2

Al Wang
Al Wang

Reputation: 354

You need to make a call to RecyclerView.Adapter.notifyDataSetChanged() whenever the relevant dataset has changed.

Upvotes: 1

Related Questions