Reputation: 1518
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
Reputation: 193
I think you should do like this:
mXxxData.clear();
mXxxData.addAll(reqForInternetData);
mRecyclerViewAdapter.notifyItemInserted(0);
That is worked for me.
Upvotes: 1
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
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
Reputation: 354
You need to make a call to RecyclerView.Adapter.notifyDataSetChanged() whenever the relevant dataset has changed.
Upvotes: 1