0

I tried to follow this answer but no one is giving a clear explanation of how to use FirebaserecyclerOption. Please I request assistance in giving a complete code example.

package com.kevin.postify;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;

import java.io.ByteArrayOutputStream;

import static com.kevin.postify.R.layout.activity_posts_list;

    // activity class

public class PostsListActivity extends AppCompatActivity {

RecyclerView mRecyclerView;
FirebaseDatabase mFirebaseDatabase;
DatabaseReference mRef;

@Override
 protected void onCreate(Bundle savedInstanceState) 
{super.onCreate(savedInstanceState);
 setContentView(activity_posts_list);// activity layout

 //Actionbar
 ActionBar actionBar = getSupportActionBar();
//set title
   actionBar.setTitle("Posts List");

   //RecyclerView
   mRecyclerView = findViewById(R.id.recyclerView);
   mRecyclerView.setHasFixedSize(true);

 //set layout as LinearLayout
  mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

 // Send query to FirebaseDatabase

  mFirebaseDatabase = FirebaseDatabase.getInstance();
    mRef = mFirebaseDatabase.getReference("Data");
  }

  //search data
  private void firebaseSearch(String searchText){

   //convert string entered in SearchView to lowercase
    String query = searchText.toLowerCase();

    Query firebaseSearchQuery = 
  mRef.orderByChild("search").startAt(query).endAt(query + "\uf8ff");

  // here is where I get some errors in implementing firebaserecyclerOptions 
  //and has been myu MAIN issue plaz can someone help here i will apply to 
  //many hanging projects.

  FirebaseRecyclerOptions<PostsListActivity> options =
        new FirebaseRecyclerOptions.Builder<PostsListActivity>()
                .setLayout(R.layout.activity_posts_list)
                .build();

    // here too I get an error
    FirebaseRecyclerAdapter<Model, ViewHolder> firebaseRecyclerAdapter =
        new FirebaseRecyclerAdapter<Model, ViewHolder>(
                Model.class,
                R.layout.row,
                ViewHolder.class,
                firebaseSearchQuery
        ) {
            @Override

  // to populate don't think it work in latest version or maybe onBindView
  protected void populateViewHolder(ViewHolder viewHolder, 
  Model model, int position) {
                viewHolder.setDetails(getApplicationContext(), 
  model.getTitle(), model.getDescription(), model.getImage());
            }
       // viewHolder
            @Override
            public ViewHolder onCreateViewHolder(ViewGroup parent, int 
    viewType) {

                ViewHolder viewHolder = super.onCreateViewHolder(parent, 
   viewType);

                viewHolder.setOnClickListener(new 
   ViewHolder.ClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        //Views
                        TextView mTitleTv = 
  view.findViewById(R.id.rTitleTv);
                        TextView mDescTv = 
        view.findViewById(R.id.rDescriptionTv);
                        ImageView mImageView = 
  view.findViewById(R.id.rImageView);
                        //get data from views
                        String mTitle = mTitleTv.getText().toString();
                        String mDesc = mDescTv.getText().toString();
                        Drawable mDrawable = mImageView.getDrawable();
                        Bitmap mBitmap = 
        ((BitmapDrawable)mDrawable).getBitmap();



//pass this data to new activity
Intent intent = new Intent(view.getContext(), 
  PostDetailActivity.class);
                        ByteArrayOutputStream stream = new 
   ByteArrayOutputStream();
                        mBitmap.compress(Bitmap.CompressFormat.PNG, 100, 
   stream);
                        byte[] bytes = stream.toByteArray();
                        intent.putExtra("image", bytes); //put bitmap image 
       as array of bytes
                        intent.putExtra("title", mTitle); // put title
                        intent.putExtra("description", mDesc); //put 
 description
                        startActivity(intent); //start activity

                    }

                    @Override
                    public void onItemLongClick(View view, int position) {
                        //TODO do your own implementaion on long item click
                    }
                });

                return viewHolder;
            }
        };



  //set adapter to recyclerview
     mRecyclerView.setAdapter(firebaseRecyclerAdapter);}

 //load data into recycler view onStart

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


 //Firebase adapter which causes error

FirebaseRecyclerAdapter<Model, ViewHolder> firebaseRecyclerAdapter =
        new FirebaseRecyclerAdapter<Model, ViewHolder>(
                Model.class,
                R.layout.row,
                ViewHolder.class,
                mRef
        ) {
            @Override
            protected void populateViewHolder(ViewHolder viewHolder, Model 
model, int position) {
                viewHolder.setDetails(getApplicationContext(), 
model.getTitle(), model.getDescription(), model.getImage());
            }

            @Override
            public ViewHolder onCreateViewHolder(ViewGroup parent, int 
viewType) {

                ViewHolder viewHolder = super.onCreateViewHolder(parent, 
viewType);

                viewHolder.setOnClickListener(new ViewHolder.ClickListener() 
{
                    @Override
                    public void onItemClick(View view, int position) {
                        //Views
                        TextView mTitleTv = 
view.findViewById(R.id.rTitleTv);
                        TextView mDescTv = 
view.findViewById(R.id.rDescriptionTv);
                        ImageView mImageView = 
view.findViewById(R.id.rImageView);  //image view
                        //get data from views
                        String mTitle = mTitleTv.getText().toString();
                        String mDesc = mDescTv.getText().toString();
                        Drawable mDrawable = mImageView.getDrawable();
         Bitmap mBitmap =((BitmapDrawable)mDrawable).getBitmap();



    //pass this data to new activity

                        Intent intent = new Intent(view.getContext(), 
PostDetailActivity.class);
 ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        mBitmap.compress(Bitmap.CompressFormat.PNG, 100, 
stream);
                        byte[] bytes = stream.toByteArray();
                        intent.putExtra("image", bytes); //put bitmap image 
as array of bytes
                        intent.putExtra("title", mTitle); // put title
                        intent.putExtra("description", mDesc); //put 
description
                        startActivity(intent); //start activity


                    }

                    @Override
                    public void onItemLongClick(View view, int position) {
                        //TODO do your own implementaion on long item click
                    }
                });

                return viewHolder;
            }

        };

   //set adapter to recyclerview
mRecyclerView.setAdapter(firebaseRecyclerAdapter);
}

 @Override
  public boolean onCreateOptionsMenu(Menu menu) {

//inflate the menu; this adds items to the action bar if it present
getMenuInflater().inflate(R.menu.menu, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        firebaseSearch(query);
        return false;
    }
                //query change 

       @Override
    public boolean onQueryTextChange(String newText) {
        //Filter as you type
        firebaseSearch(newText);
        return false;
    }
});
return super.onCreateOptionsMenu(menu);
}

@Override
 public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

//handle other action bar item clicks here

if (id == R.id.action_settings){
    //TODO
    return true;
}

 return super.onOptionsItemSelected(item);
}

}

Here is the error I get in android studio console

Error:(65, 17) error: constructor FirebaseRecyclerAdapter in class FirebaseRecyclerAdapter cannot be applied to given types;
required: FirebaseRecyclerOptions
found: Class,int,Class,Query
reason: actual and formal argument lists differ in length where T,VH are type-variables:

error
T extends Object declared in class FirebaseRecyclerAdapter VH extends android.support.v7.widget.RecyclerView.ViewHolder declared in class FirebaseRecyclerAdapter

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459

1 Answers1

0

The problem in your code is that you are mixing Firebase-UI version 2 and version 3. In the last version, when creating a new instance of FirebaseRecyclerAdapter you need to pass to the constructor a single argument, which is of type FirebaseRecyclerOptions and not four as I see in your code. Because you have asked for a complete example, here is how you can retrieve data from a Firebase Realtime database and display it in a RecyclerView using FirebaseRecyclerAdapter.

Alex Mamo
  • 130,605
  • 17
  • 163
  • 193