2017-10-18 1 views
1

누구든지 노드 "foods"에서 데이터를 검색하고 RecyclerView에 넣는 것을 도와 줄 수 있습니까? 이것들은 내가 해왔 던 파일이지만 빈 목록으로 밝혀졌습니다. 필자는 인터넷에서 튜토리얼을 보았지만 대부분은 이전 버전의 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는 중포 기지 쿼리에 대한 변경 사항을 모니터링 할 이벤트 리스너를 사용합니다. 데이터 수신을 시작하려면 startListening() 메소드를 호출하십시오. onStart() 방법으로 전화 해주세요. startListening()을 호출하기 전에 데이터를 읽는 데 필요한 인증을 모두 마쳤 으면 쿼리가 실패합니다.

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

마찬가지로, stopListening() 호출 이벤트 리스너 어댑터 내의 모든 데이터를 제거한다. . Activity 또는 Fragment 정지 포함하는이 방법 전화 : 귀하의 답변에 대한

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

내 DA 타 중포 기지 UI를 사용하여 recyclerview에서 :

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); 
    } 

이 내 중포 기지 구조 :이 당신을 도울 것입니다

structure in firebase

희망.

+0

감사하지만 이것이 중포 기지 UI의 이전 버전 :(그것은 그 않네 문제입니다 것입니다 – hjhk19

0

getItemCount() 방법을 FirebaseRecyclerAdapter으로 대체하십시오. Reference.

+0

이었다 보인다을 응용은 충돌 및 인쇄 java.lang.IndexOutOfBoundsException : 인덱스 0이 잘못되었습니다. 크기는 0입니다. 그러나 도움을 주셔서 감사합니다. – hjhk19

관련 문제