2017-10-11 33 views
1

Ich habe eine benutzerdefinierte 'ArrayAdapter' in einer 'ListView', mein Problem ist ein Menü 'SearchView'. Es funktioniert nicht richtig. Ich weiß nicht, ob das Problem die Ergebnisse sucht oder zeigt, weil nichts erscheint. Und wenn möglich, möchte ich eine benutzerdefinierte Liste der Ergebnisse anzeigen. Vielen Dank!Suchansicht in benutzerdefinierten ArrayAdapter

Fragment mit dem Adapter

ArrayList<Favoritos> favorites; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    View rootView = inflater.inflate(R.layout.list_item, container, false); 
    favorites = new ArrayList<Favoritos>(); 
    favorites.add(new Favorites("Title", "addres", 5, false, 7, 22, 4.5f)); 
    favorites.add(new Favorites("Title", "addres", 3.5 , true, 7, 22, 3.0f)); 
    favorites.add(new Favorites("Title", "addres", 2, false, 7, 22, 4.0f)); 
    favorites.add(new Favorites("Titleo", "addres", 4.5, true, 7, 22, 5.0f)); 

    FavoritesAdapter adapter = new FavoritesAdapter(getActivity(), favorites); 

    ListView listView = (ListView) rootView.findViewById(R.id.list_item); 

    listView.setAdapter(adapter); 
} 


@Override 
public boolean onQueryTextSubmit(String s) { 
    return false; 
} 

@Override 
public boolean onQueryTextChange(String string) { 
    search(string); 
    return true; 
} 

//This is the search method 
public void search(String s) { 
    if (s == null || s.trim().equals("")) { 
     cleanSearch(); //In this method I just "reset" the adapter when the user "give up" 
     return; 
    } 

    ArrayList<Favoritos> estacionamentosEncontrados = new ArrayList<Favoritos>(favoritos); 

    for (int i = estacionamentosEncontrados.size() - 1; i >= 0; i--) { 
     Favoritos estacionamento = estacionamentosEncontrados.get(i); 
     Favoritos nenhumResultado = new Favoritos("Nenhum resultado encontrado"); 
     if (!estacionamento.mIndicacao.toUpperCase().contains(s.toUpperCase())) { 
      estacionamentosEncontrados.remove(estacionamento); 
     } else { 
      estacionamentosEncontrados.add(nenhumResultado); 
     } 
    } 

    adapter = new EncontradosAdapter(getActivity(), estacionamentosEncontrados); 
    ListView listView = (ListView) getActivity().findViewById(R.id.list_item); 
    listView.setAdapter(adapter); 
} 

Favorites.java

public String mIndicacao; 
    public String mEndereco; 
    private double mPreco; 
    public boolean mDisponibilidade; 
    private double mHoraAbre; 
    private double mHoraFecha; 
    private float mAvaliacao; 

    public Favoritos(){ 

    } 

    public Favoritos(String indicacao, String endereco, double preco, boolean disponibilidade, double horaAbre, double horaFecha, float avaliacao){ 
    mIndicacao = indicacao; 
    mEndereco = endereco; 
    mPreco = preco; 
    mDisponibilidade = disponibilidade; 
    mHoraAbre = horaAbre; 
    mHoraFecha = horaFecha; 
    mAvaliacao = avaliacao; 
} 

//Getters and Setters 

und dem benutzerdefinierten Adapter

public class FavoritesAdapter extends ArrayAdapter<Favorites> { 


public FavoritesAdapter(Context context, ArrayList<Favorites> favorites){ 
    super(context, 0, favoritos); 
} 

public static class ItemViewHolder{ 
    TextView indicadorTextView; 
    TextView enderecoTextView; 
    TextView precoTextView; 
    TextView horaAbreTextView; 
    TextView horaFechaTextView; 
    RatingBar notaEstacionamento; 
    ImageView disponivelImg; 
    TextView disponivelTextView; 
    ImageView esconderView; 

    public ItemViewHolder(View view){ 
     indicadorTextView = (TextView) view.findViewById(R.id.indicador); 
     enderecoTextView = (TextView) view.findViewById(R.id.endereco); 
     precoTextView = (TextView) view.findViewById(R.id.precoValor); 
     horaAbreTextView = (TextView) view.findViewById(horaAbre); 
     horaFechaTextView = (TextView) view.findViewById(horaFecha); 
     notaEstacionamento = (RatingBar) view.findViewById(R.id.ratingBar); 
     disponivelImg = (ImageView) view.findViewById(R.id.img_disponibilidade); 
     disponivelTextView = (TextView) view.findViewById(R.id.disponivel); 
     esconderView = (ImageView) view.findViewById(R.id.esconder_view_btn); 

    } 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Check if an existing view is being reused, otherwise inflate the view 
    View listItemView = convertView; 
    if (listItemView == null) { 
     listItemView = LayoutInflater.from(getContext()).inflate(
       R.layout.favorites_item, parent, false); 
    } 

    Favorites currentFavorito = getItem(position); 

    final ItemViewHolder holder; 

    if(listItemView.getTag() == null){ 
     holder = new ItemViewHolder(listItemView); 
     listItemView.setTag(holder); 
    } else { 
     holder = (ItemViewHolder) listItemView.getTag(); 
    } 

    if(currentFavorito.getDisponibilidade()){ 
     holder.disponivelTextView.setText(currentFavorito.getIndicacao()); 
    } else { 
     holder.disponivelTextView.setText(currentFavorito.getIndicacao()); 
    } 
    holder.indicadorTextView.setText(currentFavorito.getIndicacao()); 
    holder.enderecoTextView.setText(currentFavorito.getEndereco()); 
    holder.precoTextView.setText(currentFavorito.getPreco()); 
    holder.horaAbreTextView.setText(currentFavorito.getHoraAbre()); 
    holder.horaFechaTextView.setText(currentFavorito.getHoraFecha()); 
    holder.notaEstacionamento.setRating(currentFavorito.getAvaliacao()); 


    if(currentFavorito.getDisponibilidade()){ 
     holder.disponivelImg.setImageResource(R.drawable.ir_img); 
     holder.disponivelTextView.setText(R.string.aberto); 
     holder.disponivelTextView.setTextColor(getContext().getResources().getColor(R.color.verde)); 
    } else { 
     holder.disponivelImg.setImageResource(R.drawable.fechado_img); 
     holder.disponivelTextView.setText(R.string.fechado); 
     holder.disponivelTextView.setTextColor(getContext().getResources().getColor(R.color.vermelho));  } 

    return listItemView; 
} 

}

+0

warum sind Sie nicht Ihre eigene serchview in der Liste –

+0

zu schaffen, weiß ich nicht, ist mein erstes Projekt. Ich dachte, das wäre der beste Weg. Wie kann ich das schaffen? –

+0

https://StackOverflow.com/a/23422665/8648705 –

Antwort

0

Schritt: 1 Erstellen Sie im Optionsmenü in Fragmente für anbraten chview wie

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     //menu.clear(); 
     inflater.inflate(R.menu.ticket_fragment_search_menu, menu); 
     MenuItem actionSearch = menu.findItem(R.id.action_search); 

     SearchView searchView = (SearchView) MenuItemCompat.getActionView(actionSearch); 
     searchView.setMaxWidth(Integer.MAX_VALUE); 
     EditText searchEditText = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); 
     searchEditText.setSingleLine(true); 
     searchEditText.setTextColor(getResources().getColor(R.color.black)); 
     searchEditText.setHintTextColor(getResources().getColor(R.color.black)); 
     searchView.setQueryHint(getResources().getString(R.string.txt_search_here)); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       //apply Filter 
       adapter.setFilter(newText) 
       return false; 
      } 
     }); 

     searchView.setOnSearchClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.e(TAG, "search open"); 
      } 
     }); 

     searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
      @Override 
      public boolean onClose() { 
       Log.e(TAG, "search close"); 
       return false; 
      } 
     }); 

    } 

Schritt 2: Funktion für Filter erstellen oder

in Adapter suchen
public void setFilter(String str) { 
     aList = new ArrayList<>(); 
     if (aListTemp.size() > 0) { 
      for (int i = 0; i < aListTemp.size(); i++) { 
       if (aListTemp.get(i).toLowerCase().contains(str.toLowerCase()) 
         ) { 

        aList.add(aListTemp.get(i)); 
       } 
      } 
     } 
     notifyDataSetChanged(); 
    } 
Verwandte Themen