Ad

RecyclerView OnClick Not Working On Search Items

- 1 answer

I have implemented a search function on my application and it displays the results however the results can not be clicked. When not in search the onClick method works fine. Here is the code for my main class where the search takes place

MainActivity.java

public class MainActivity extends AppCompatActivity implements 
RecyclerViewAdapter.OnItemClickListener {

private RecyclerView mRecyclerView;
private RecyclerViewAdapter mAdapter;
private DatabaseReference mDatabaseRef;
private List<Buildings> mUploads;
private FirebaseAuth mAuth;
private FirebaseUser mCurrentUser;
private FirebaseStorage mStorage;
private ValueEventListener mDBListener;
private EditText msearch;
ArrayList<Buildings> arrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mAuth = FirebaseAuth.getInstance();
    mCurrentUser = mAuth.getCurrentUser();
    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mUploads = new ArrayList<>();
    mStorage = FirebaseStorage.getInstance();
    mDatabaseRef = 
    FirebaseDatabase.getInstance().getReference("Buildings");
    mAdapter = new RecyclerViewAdapter(MainActivity.this, mUploads);
    mRecyclerView.setAdapter(mAdapter);
    mAdapter.setOnItemClickListener(MainActivity.this);
    msearch = findViewById(R.id.search);
    arrayList = new ArrayList<>();


  msearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int 
count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, 
int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

            if(!s.toString().isEmpty())
            {
                search(s.toString());
            }
            else{
                search("");
            }

        }
    });

    //GET DATA FROM FIREBASE!!

    mDBListener = mDatabaseRef.addValueEventListener(new 
ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            mUploads.clear();

            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                Buildings upload = postSnapshot.getValue(Buildings.class);
                upload.setKey(postSnapshot.getKey());
                mUploads.add(upload);

            }

            mAdapter.notifyDataSetChanged();

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(MainActivity.this, databaseError.getMessage(), 
Toast.LENGTH_SHORT).show();

        }
    });
}  //end of on create

private void search(String s) {

    Query query = mDatabaseRef.orderByChild("name")
            .startAt(s).endAt(s + "\uf8ff");

    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if(dataSnapshot.hasChildren()){

                arrayList.clear();
                for(DataSnapshot dss: dataSnapshot.getChildren()){
                    final Buildings buildings = dss.getValue(Buildings.class);
                    arrayList.add(buildings);
                }

                RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(getApplicationContext(),arrayList);
                mRecyclerView.setAdapter(myAdapter);
                myAdapter.notifyDataSetChanged();

            }
        }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}


@Override
public void onItemClick(int position) {

    Buildings selectedItem = mUploads.get(position);
    final String name = selectedItem.getName();
    final String address = selectedItem.getAddress();
    final String image_url = selectedItem.getImage_url();
    final double longt = selectedItem.getLongitude();
    final double lat = selectedItem.getLatitude();
    final String uid = selectedItem.getUserID();
    final String desc = selectedItem.getDescription();
    final String categ = selectedItem.getCategorie();

    Intent mainIntent = new Intent(MainActivity.this, ProfileActivity2.class);
    mainIntent.putExtra("b_name", name);
    mainIntent.putExtra("b_address", address);
    mainIntent.putExtra("b_image_url", image_url);
    mainIntent.putExtra("b_userId", uid);
    mainIntent.putExtra("b_desc", desc);
    mainIntent.putExtra("b_categ", categ);

    Bundle b = new Bundle();
    b.putDouble("longt", longt);
    b.putDouble("lat", lat);

    mainIntent.putExtras(b);
    startActivity(mainIntent);
    finish();
}

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ImageViewHolder> {

private Context mContext;
private List<Buildings> mUploads;
private OnItemClickListener mListener;
private FirebaseAuth mAuth;
private FirebaseUser mCurrentUser;
private boolean checkUid;

public RecyclerViewAdapter(Context context, List<Buildings> uploads) {
    mContext = context;
    mUploads = uploads;


}

@Override
public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.buildings_row_item, parent, false);
    return new ImageViewHolder(v);



}

@Override
public void onBindViewHolder(ImageViewHolder holder, int position) {
    Buildings uploadCurrent = mUploads.get(position);
    holder.textViewName.setText(uploadCurrent.getName());
    holder.textViewAddress.setText(uploadCurrent.getAddress());
    Glide.with(mContext).load(mUploads.get(position).getImage_url()).into(holder.imageView);
}


@Override
public int getItemCount() {
    return mUploads.size();
}

public class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
        View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener {

    public TextView textViewName;
    public ImageView imageView;
    public TextView textViewAddress;
    LinearLayout view_container;

    public ImageViewHolder(View itemView) {
        super(itemView);

        textViewName = itemView.findViewById(R.id.building_name);
        imageView = itemView.findViewById(R.id.thumbnail);
        view_container = itemView.findViewById(R.id.container);
        textViewAddress = itemView.findViewById(R.id.address);

        itemView.setOnClickListener(this);
        itemView.setOnCreateContextMenuListener(this);
    }


    @Override
    public boolean onMenuItemClick(MenuItem item) {
        if (mListener != null) {
            int position = getAdapterPosition();
            if (position != RecyclerView.NO_POSITION) {

                switch (item.getItemId()) {
                    case 1:
                        mListener.onDeleteClick(position);
                        return true;
                }
            }
        }
        return false;
    }


    @Override
    public void onClick(View v) {
        if (mListener != null) {
            int position = getAdapterPosition();
            if (position != RecyclerView.NO_POSITION) {
                mListener.onItemClick(position);
            }
        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

        if(checkUid =true && mCurrentUser != null){
            MenuItem delete = menu.add(Menu.NONE, 1, 1, "Delete");
            delete.setOnMenuItemClickListener(this);
        }
        else{
            //do nothing
        }


    }
}

public interface OnItemClickListener {
    void onItemClick(int position);
    void onDeleteClick(int position);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}

}

Should I be adding something to my search function?

Ad

Answer

You are creating new adapter on reponse of your query, which isn't having active interface attached. So instead of creating new adapter, just update the data list and notify adapter.

Refer below code.

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        if(dataSnapshot.hasChildren()){

            arrayList.clear();
            for(DataSnapshot dss: dataSnapshot.getChildren()){
                final Buildings buildings = dss.getValue(Buildings.class);
                arrayList.add(buildings);
            }

            // Remove below two lines, 
            // It is not needed as we only need to notify adapter about the data change.

            // RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(getApplicationContext(),arrayList);
            // mRecyclerView.setAdapter(myAdapter);

            myAdapter.notifyDataSetChanged();

        }
    }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});
Ad
source: stackoverflow.com
Ad