Hello friends, I have a problem in which I enter after implementing a searchview in my fragment. As you can see there is the list of items and if I click on each one it shows me the detail correctly. When doing a search, it shows me the corresponding filtered items, but when I click on the item I load the data or detail of the unfiltered list, there is my problem. I would like help to solve this problem.
I show example of my custom adapter code
public class TiendaRVAdapter extends RecyclerView.Adapter<TiendaRVAdapter.ViewHolder> implements View.OnClickListener, Filterable{
private List<Tienda> mDataset;
private List<Tienda> mFilteredDataset;
private View.OnClickListener listener;
@Override
public void onClick(View v) {
if(listener != null){
listener.onClick(v);
}
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String charString = constraint.toString();
if(charString.isEmpty()){
mFilteredDataset = mDataset;
} else {
List<Tienda> newFilteredList = new ArrayList<>();
for (Tienda tienda: mDataset){
if(tienda.getNombre().toLowerCase().contains(charString)){
newFilteredList.add(tienda);
}
}
mFilteredDataset = newFilteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredDataset;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mFilteredDataset = (List<Tienda>) results.values;
notifyDataSetChanged();
}
};
}
public class ViewHolder extends RecyclerView.ViewHolder {
Context context;
private TextView txtNombreTienda;
private TextView txtCategoriaTienda;
private TextView txtUbicacionTienda;
private ImageView imageTienda;
private CardView cardTienda;
public ViewHolder(View v) {
super(v);
context = v.getContext();
txtNombreTienda = (TextView) v.findViewById(R.id.txtNombreTienda);
txtCategoriaTienda = (TextView) v.findViewById(R.id.txtCategoriaTienda);
txtUbicacionTienda = (TextView) v.findViewById(R.id.txtUbicacionTienda);
imageTienda = (ImageView) v.findViewById(R.id.imageTienda);
cardTienda = (CardView) v.findViewById(R.id.cardTienda);
}
}
public void add(int position, Tienda item) {
mFilteredDataset.add(position, item);
notifyItemInserted(position);
}
public void remove(Tienda item) {
int position = mDataset.indexOf(item);
mDataset.remove(position);
notifyItemRemoved(position);
}
public TiendaRVAdapter(List<Tienda> myDataset) {
this.mDataset = myDataset;
this.mFilteredDataset = myDataset;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shop, parent, false);
ViewHolder vh = new ViewHolder(v);
v.setOnClickListener(this);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
YoYo.with(Techniques.FlipInX).duration(1500).playOn(holder.cardTienda);
//YoYo.with(Techniques.ZoomInLeft).duration(1500).playOn(holder.imageTienda);
holder.txtNombreTienda.setText(mFilteredDataset.get(position).getNombre());
holder.txtCategoriaTienda.setText(mFilteredDataset.get(position).getCategoria());
holder.txtUbicacionTienda.setText(mFilteredDataset.get(position).getNivel_ubicacion());
Glide.with(holder.imageTienda.getContext()).load(mFilteredDataset.get(position).getLogo()).diskCacheStrategy(DiskCacheStrategy.ALL).into(holder.imageTienda);
}
@Override
public int getItemCount() {
if (mFilteredDataset != null)
return mFilteredDataset.size();
return 0;
}
public void setOnClickListener(View.OnClickListener listener){
this.listener = listener;
}
}
My fragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View vista = inflater.inflate(R.layout.fragment_shops, container, false);
spnCategorias = (Spinner) vista.findViewById(R.id.spnCategorias);
imgSinConexion = (ImageView) vista.findViewById(R.id.imgSinConexion);
imgSinConexion.setVisibility(View.INVISIBLE);
txtSinConexion = (TextView) vista.findViewById(R.id.txtSinConexion);
txtSinConexion.setVisibility(View.INVISIBLE);
textView = (TextView) vista.findViewById(R.id.textView);
ConnectivityManager con = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nInfo = con.getActiveNetworkInfo();
if(nInfo!= null && nInfo.isConnected()){
imgSinConexion.setVisibility(View.INVISIBLE);
txtSinConexion.setVisibility(View.INVISIBLE);
getCategories();
sendRequest();
} else {
imgSinConexion.setVisibility(View.VISIBLE);
txtSinConexion.setVisibility(View.VISIBLE);
spnCategorias.setVisibility(View.GONE);
textView.setVisibility(View.GONE);
Toast.makeText(getActivity(), "No se pudo conectar, verifique el acceso a internet e intente nuevamente", Toast.LENGTH_LONG).show();
}
mRecyclerView = (RecyclerView) vista.findViewById(R.id.RecyclerTienda);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);
mRecyclerView.setLayoutManager(mLayoutManager);
return vista;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mAdapter.getFilter().filter(newText);
return false;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
getActivity().getMenuInflater().inflate(R.menu.main, menu);
MenuItem menuItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
searchView.setOnQueryTextListener(this);
return;
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if(context instanceof Activity){
this.activity = (Activity) context;
interfaceShop = (IComunicaFragments) this.activity;
}
}
private void sendRequest(){
JsonObjectRequest solicitud = new JsonObjectRequest(JSON_URL, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
String datos = response.getString("response");
JSONArray array = new JSONArray(datos);
TiendaParse pj = new TiendaParse(""+ array);
pj.parseTienda();
mDataset = pj.getShops();
mAdapter = new TiendaRVAdapter(mDataset);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(getActivity(),"Selecionó "+mDataset.get(mRecyclerView.getChildAdapterPosition(v)), Toast.LENGTH_SHORT).show();
interfaceShop.sendShop(mDataset.get(mRecyclerView.getChildAdapterPosition(v)));
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(),"Error "+ error,Toast.LENGTH_SHORT).show();
}
});
VolleySingleton.getInstanciaVolley(getContext()).addToRequestQueue(solicitud);
}
In my mainactivity I implement the interface to call the fragment of the detail and its elements:
DetailShopFragment detalleTienda;
@Override
public void sendShop(Tienda shop) {
detalleTienda = new DetailShopFragment();
Bundle bundleEnvio = new Bundle();
bundleEnvio.putSerializable("tienda", shop);
detalleTienda.setArguments(bundleEnvio);
getSupportFragmentManager().beginTransaction().replace(R.id.layout_main,detalleTienda).addToBackStack(null).commit();
setTitle(R.string.title_detail_shop);
}
Fragment detail:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View vista = inflater.inflate(R.layout.fragment_detail_shop, container, false);
txtTienda = (TextView) vista.findViewById(R.id.txtTienda);
txtCategoria = (TextView) vista.findViewById(R.id.txtCategoria);
txtUbicacion = (TextView) vista.findViewById(R.id.txtUbicacion);
txtVerMapa = (TextView) vista.findViewById(R.id.txtVerMapa);
txtHorario = (TextView) vista.findViewById(R.id.txtHorario);
txtTelefono = (TextView) vista.findViewById(R.id.txtTelefono);
txtDescripcion = (TextView) vista.findViewById(R.id.txtDescripcion);
imgTienda = (ImageView) vista.findViewById(R.id.imgTienda);
txtSinPromos = (TextView) vista.findViewById(R.id.txtSinPromos);
imgSinPromos = (ImageView) vista.findViewById(R.id.imgSinPromos);
imgSinPromos.setVisibility(View.GONE);
txtSinPromos.setVisibility(View.GONE);
Bundle tienda = getArguments();
Tienda shop= null;
if (tienda != null){
shop= (Tienda) tienda.getSerializable("tienda");
Glide.with(getActivity()).load(shop.getFoto()).centerCrop().into(imgTienda);
txtTienda.setText(shop.getNombre());
txtCategoria.setText(shop.getCategoria());
txtUbicacion.setText(shop.getNivel_ubicacion());
txtHorario.setText(shop.getHorario());
txtTelefono.setText(shop.getTelefono());
txtDescripcion.setText(shop.getDescripcion());
final Tienda finalShop = shop;
MapeoDialog = new Dialog(getActivity());
txtVerMapa.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPopUp(v,finalShop.getFoto_ubicacion());
Toast.makeText(v.getContext(),"Ubicación: "+ finalShop.getNivel_ubicacion(),Toast.LENGTH_SHORT).show();
}
});
mRecyclerView = (RecyclerView) vista.findViewById(R.id.RecyclerPromo);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);
mRecyclerView.setLayoutManager(mLayoutManager);
getPromociones(finalShop.getId());
}
return vista;
}