2017-10-18 13 views
1

誰も "食品"というノードからデータを取得してRecyclerViewに入れてもらうことはできますか?これらは私が取り組んできたファイルですが、空のリストであることが分かります。私はインターネットでのチュートリアルを見てきましたが、それらのほとんどはFirebaseの古いバージョンでした。最近、Firebase UIが更新され、データバインディングプロセスは、これは私のデータベース構造であるFirebase UI 3.0.0:リサイクルビューにデータを取得

彼らの新しいFirebaseRecyclerAdapter構造に変更されました:

private RecyclerView mRecycleView; 
    private Query query; 
    private FirebaseRecyclerOptions<Meal> options; 
    private DatabaseReference mDatabase; 

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

     mDatabase = FirebaseDatabase.getInstance().getReference().child("foods"); 

     //Recycle View 
     mRecycleView = (RecyclerView) findViewById(R.id.meal_items); 
     mRecycleView.setHasFixedSize(true); 
     mRecycleView.setLayoutManager(new LinearLayoutManager(this)); 
    } 


    @Override 
    protected void onStart() { 
     super.onStart(); 

     query = FirebaseDatabase.getInstance().getReferenceFromUrl("https://mealplanner-ec8ca.firebaseio.com/foods/AntipastoSalad"); 

     options = new FirebaseRecyclerOptions.Builder<Meal>() 
       .setQuery(query, Meal.class) 
       .build(); 

     FirebaseRecyclerAdapter<Meal, FoodListRowActivity.MealRowHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Meal, FoodListRowActivity.MealRowHolder>(
       options) { 
      @Override 
      public FoodListRowActivity.MealRowHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
       View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.food_row, parent, false); 
       return new FoodListRowActivity.MealRowHolder(v); 
      } 

      @Override 
      protected void onBindViewHolder(FoodListRowActivity.MealRowHolder holder, int position, Meal current) { 
       holder.setTitle(current.getName()); 
       String duration = current.getDuration() + "min"; 
       holder.setDuration(duration); 
      } 
     }; 

     //Populate Item into Adapter 
     mRecycleView.setAdapter(firebaseRecyclerAdapter); 

     mRecycleView.addOnItemTouchListener(new RecycleViewItemClickListener(this, mRecycleView, new RecycleViewItemClickListener.OnItemClickListener() { 
      @Override 
      public void onItemClick(View view, int position) { 
       Intent viewMeal = new Intent(FoodListRowActivity.this, CookingInstructionActivity.class); 
       startActivity(viewMeal); 
      } 

      @Override 
      public void onLongItemClick(View view, int position) { 
       //TODO: DELETE 
      } 
     })); 
    } 

    public static class MealRowHolder extends RecyclerView.ViewHolder { 

     View mView; 

     public MealRowHolder(View itemView) { 
      super(itemView); 
      mView = itemView; 

     } 

     public void setTitle(String title) { 
      TextView foodTitle = (TextView) mView.findViewById(R.id.list_item_foodList_name); 
      foodTitle.setText(title); 
     } 


     public void setDuration(String title) { 
      TextView foodDuration = (TextView) mView.findViewById(R.id.list_item_foodList_calories); 
      foodDuration.setText(title); 
     } 
    } 
} 

とクラス:これは私の活動である

"foods" : { 
"AntipastoSalad" : { 
    "duration" : "30", 
    "img" : "https://firebasestorage.googleapis.com/v0/b/mealplanner-ec8ca.appspot.com/o/res%2Fsalad.jpg?alt=media&token=257d4392-8a1f-4fb7-84b5-b63abb4643f4", 
    "name" : "Antipasto salad", 
    "type" : "Salad" 
}, 

構造:

public class Meal{ 

private String img; 
private String duration; 
private String name; 
private String instruction; 

public Meal(){ 

} 

public Meal (String img, String duration, String name, String instruction){ 
    this.img = img; 
    this.name = name; 
    this.duration = duration; 
    this.instruction = instruction; 
} 

public void update(String duration, String name, String instruction) 
{ 
    this.name = name; 
    this.duration = duration; 
    this.instruction = instruction; 
} 
public String getName(){ 
    return name; 
} 

public String getDuration() { 
    return duration; 
} 

public String getInstruction() { 
    return instruction; 
} 

public String getImg(){return img;} 

答えて

3

あなたはRecyclerViewに表示するリストのルートを参照する必要がありますsetQuery()方法で指定query

@Override 
    public int getItemCount() { 
     return 1; 
    } 

、このようなので:また

query = FirebaseDatabase.getInstance().getReference().child("foods"); 

ますアダプター上でstartListening()を呼び出して、データベースからのデータ検索の開始を指示する必要があります。 FirebaseRecyclerAdapter lifecycle documentationから

FirebaseRecyclerAdapterはFirebaseクエリへの変更を監視するためのイベントリスナーを使用しています。データの受信を開始するには、startListening()メソッドを呼び出します。 onStart()メソッドでこれを呼び出すことができます。 startListening()を呼び出す前にデータを読み取るために必要な認証が完了していることを確認するか、クエリが失敗します。

@Override protected void onStart() { 
    super.onStart(); 
    adapter.startListening(); 
} 

同様に、stopListening()コールは、イベントリスナとアダプタ内のすべてのデータが削除されます。 ActivityまたはFragment停止含むときに、このメソッドを呼び出します。あなたの答えのための

@Override protected void onStop() { 
    super.onStop(); 
    adapter.stopListening(); 
} 
0

これは私がdaを取得している方法ですTA recyclerviewでFirebase UIを使用して:

private FirebaseRecyclerAdapter<TaskPOJO, TaskViewHolder> adapter; 
private void loadTasks() { 


     database = FirebaseDatabase.getInstance(); 
     tasks = database.getReference("Tasks"); 
     adapter = new FirebaseRecyclerAdapter<TaskPOJO, TaskViewHolder>(TaskPOJO.class, R.layout.task_item, TaskViewHolder.class, tasks) { 
      @Override 
      protected void populateViewHolder(TaskViewHolder viewHolder, final TaskPOJO model, int position) { 


       Log.wtf("valueTEst", "populateViewHolder: "+model.toString()); 
       Log.wtf("TEstScript1", "populateViewHolder: "+model.getTitle()); 
       viewHolder.title.setText(model.getTitle()); 
       viewHolder.desc.setText(model.getDescripttion()+"\n"); 
       viewHolder.remaining.setText(model.getRemaining()+"/"+model.getPoint()); 
       viewHolder.points.setText("Points "+model.getRemaining()); 
       Glide.with(viewHolder.title.getContext()) 
         .load(model.getImage()) 
         .into(viewHolder.image); 


       viewHolder.setClickListener(new ItemClickListener() { 
        @Override 
        public void onClick(View view, int position, boolean isLongClick) { 
         Toast.makeText(getActivity(), "" /*+ model.getTitle()*/, Toast.LENGTH_SHORT).show(); 

         Intent TaskPOJODetail = new Intent(getActivity(), Main.class); 
         TaskPOJODetail.putExtra("value","detail"); 
         TaskPOJODetail.putExtra("taskId",adapter.getRef(position).getKey()); 
         startActivity(TaskPOJODetail); 
        } 
       }); 
      } 
     }; 
     progressBar.setVisibility(View.GONE); 
     recyclerViewTasks.setAdapter(adapter); 
    } 

これは私のfirebase構造です:

structure in firebase

が、これはあなたを助けることを願っています。

+0

感謝しますが、Firebase UIの古いバージョンだったようです:( – hjhk19

0

getItemCount()メソッドをFirebaseRecyclerAdapterに上書きしてください。 Reference.

+0

それは波平問題だように見えるのAppは、単にクラッシュして印刷。 java.lang.IndexOutOfBoundsException:無効なインデックス0、サイズは0ですが、ご協力いただきありがとうございます。 – hjhk19

関連する問題