2015-07-27 5 views
2

Я посмотрел на другие вопросы по этому поводу и совпадал с кодовым словом, но я, должно быть, пропустил что-то, потому что ничего не работает. getItemCount() возвращает ноль, но я отлаживал список своих данных и, казалось, правильно добавлял все мои данные, поэтому что-то не так с коммуникацией с адаптером.RecyclerView не заполняется (getItemCount() возвращает ноль)

Пожалуйста, сообщите мне, что здесь происходит неправильно!

Ниже мой код 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(); 
    } 
} 

Код для 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> 

активность, в которой добавляется RecyclerView:

<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> 
+0

Я не являюсь экспертом в Parse API, но я бы предположил, что метод 'findInBackground()' является асинхронным. В этом случае «data» пуст, когда вы создаете свой «DataAdapter». Кроме того, не используйте 'getApplicationContext()' для создания 'LayoutInflater'. Вызовите 'getLayoutInflater()' в 'Деятельности'. В противном случае ваши стили и темы не будут выполнены. – CommonsWare

+0

Чтобы справиться с тем, что данные могут быть пустыми из-за асинхронного вызова, я сделал getData() отдельной функцией и назвал ее следующим: adapter = new DataAdapter (getApplicationContext(), getData()); Все еще ничего не работало. Не могли бы вы немного рассказать о том, что вы имели в виду, используя getApplicationContext() для создания LayoutInflater? Не уверен, что вы имеете в виду – Sunny

+0

«Я создал getData() отдельную функцию» - это не изменяет асинхронное поведение. «Не могли бы вы немного рассказать о том, что вы имели в виду, используя getApplicationContext()» - избавиться от каждого появления 'getApplicationContext()' в вашем коде, показанном выше. – CommonsWare

ответ

1

Вам нужно сделать вызов RecyclerView.Adapter.notifyDataSetChanged() всякий раз, когда соответствующий набор данных изменился.

+0

Добавил это в мой цикл for, но ничего не сделал – Sunny

+0

Можете ли вы добавить это в функцию onClick? Кроме того, адаптер = новый DataAdapter (getApplicationContext(), getData()); не кажется правильным. Ваш адаптер должен указывать на структуру данных, такую ​​как ArrayList. –

2

Может быть, если вы установили адаптер внутри выполненного метода, он будет работать. Вставьте дно для петли.

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

@CommonsWare поставил ту же идею - что данные будут пустыми.Я поместил данные в отдельную функцию и назвал ее так: adapter = new DataAdapter (getApplicationContext(), getData()); Все еще не работает. – Sunny

0

Попробуйте установить адаптер только после установки менеджера компоновки

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

Я думаю, что вы должны сделать так:

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

То есть работал для меня.