título específico (obtido da API) usando o searchview?

8

Eu quero algo assim ---> Necessário

então o que eu quero é que, quando o usuário digite um nome de tópico específico (se presente no aplicativo) no searchview, ele possa dar sugestões e, se encontrado, abrir essa atividade de tópico ( como Facebook, Instagram, etc.) pesquisas ) .. e esses títulos são provenientes da API (que eu exibi com sucesso em outras atividades) .. assim -> [ insira a descrição da imagem aqui .. qual será a lógica para isso ??? preciso de ajuda ... Obrigado

então acabei de incluir o searchview em XML como este ->

  <SearchView
    android:id="@+id/searchView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:queryHint="Search Here"
    android:iconifiedByDefault="false"
    android:layout_alignParentTop="true"
    android:background="@drawable/search_bar"
    android:layout_marginLeft="15dp"
    android:layout_marginRight="15dp"
    android:layout_marginTop="20dp"
    android:pointerIcon="crosshair"
    android:theme="@style/Widget.AppCompat.SearchView"
    android:focusedByDefault="true"

    />

Precisa de ajuda .. obrigado antecipadamente ....

aqui está o meu json: para [ insira a descrição da imagem aqui

[{"id":"11","title":"TextView"},{"id":"10","title":"Edit Text"},{"id":"9","title":"ImageView"},{"id":"8","title":"Button "},{"id":"7","title":"CheckBox"},{"id":"6","title":"RadioButton & RadioGroup"},{"id":"5","title":"DatePicker"},{"id":"4","title":"TimePicker"},{"id":"3","title":"Switch"},{"id":"1","title":"Simple & Custom Toast"}]

aqui está a minha atividade: para [ insira a descrição da imagem aqui

public class StartLearning extends AppCompatActivity {
private RecyclerView recyclerView;
private SLAdapter slAdapter;
ProgressDialog progressDialog;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.startlearning_layout);
    progressDialog = new ProgressDialog(StartLearning.this);
    progressDialog.setMessage("Loading....");
    progressDialog.show();
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        /*Create handle for the RetrofitInstance interface*/
        SLApiSevice service = SLApiClient.getRetrofitInstance().create(SLApiSevice.class);
        Call<List<SlModel>> call = service.getMySlmodel();

        call.enqueue(new Callback<List<SlModel>>() {
            @Override
            public void onResponse(Call<List<SlModel>> call, Response<List<SlModel>> response) {
                progressDialog.dismiss();
                generateDataList(response.body());
                Log.e("hello", String.valueOf(response.body()));

            }

            @Override
            public void onFailure(Call<List<SlModel>> call, Throwable t) {
                progressDialog.dismiss();
                Toast.makeText(getApplicationContext(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();


            }
        });
    }
}
private void generateDataList(List<SlModel> employeeList) {
    recyclerView = findViewById(R.id.SLrecycle);
    LinearLayoutManager manager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(manager);
    recyclerView.setHasFixedSize(true);
    slAdapter = new SLAdapter(getApplicationContext(),employeeList);
    recyclerView.setAdapter(slAdapter);
}

adaptador: para [ insira a descrição da imagem aqui

public class SLAdapter extends RecyclerView.Adapter<SLAdapter.CustomViewHolder> {

List<StartLearning.SlModel> Slmdel;
Context context;

public SLAdapter(Context context,List<StartLearning.SlModel> employees) {
    this.Slmdel = employees;
    this.context=context;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.startlearning_item, parent, false);

    return new CustomViewHolder(itemView);
}

@Override
public void onBindViewHolder(CustomViewHolder holder, int position) {
    // TipsModel employee = employees.get(position);
    //// holder.employeeName.setText(employees.get(position).getTips());
    holder.textView.setText(String.valueOf(position+1)+". ");
    holder.employeeName.setText(Slmdel.get(position).getTitle());


}

@Override
public int getItemCount() {
    return Slmdel.size();
    //return (employees == null) ? 0 : employees.size();

}

public class CustomViewHolder extends RecyclerView.ViewHolder {
    public TextView employeeName;
    TextView textView;

    public CustomViewHolder(View view) {
        super(view);
        employeeName = (TextView) view.findViewById(R.id.Sl2);
        textView=view.findViewById(R.id.Sl1);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =  new Intent(context, NextSLactivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("title", Slmdel.get(getAdapterPosition()).getTitle());
               intent.putExtra("idSLnext", Slmdel.get(getAdapterPosition()).getId());
                //Log.e("ashwini",WAmdel.get(getAdapterPosition()).getId());
                context.startActivity(intent);

            }
        });


    }
}

clique do item (exemplo: textview)

atividade: um dos itens (exemplo: textview)

public class JavaFragment extends Fragment {

private RecyclerView recyclerView;
private NextSLJavaAdapter adapter;
private NextSLModel DescriptList;
ProgressDialog progressDialog;
public JavaFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.nextsl_layout, container, false);

}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) getView().findViewById(R.id. toolbar );
   // setSupportActionBar( toolbar );
    //if (getSupportActionBar() != null) {
      //  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       // getSupportActionBar().setDisplayShowHomeEnabled(true);
    //}
    progressDialog = new ProgressDialog(getContext());
    progressDialog.setMessage("Loading....");
    progressDialog.show();
    Intent intent = getActivity().getIntent();
    String title = intent.getStringExtra("title");
    //getSupportActionBar().setTitle(title);
    String id = intent.getStringExtra("idSLnext");
    Log.e("ashwini", String.valueOf(id));


    /*Create handle for the RetrofitInstance interface*/
    SLApiSevice service = SLApiClient.getRetrofitInstance().create(SLApiSevice.class);
    Call<NextSLModel> call = service.getnextslmodel(id);
    call.enqueue(new Callback<NextSLModel>() {
        @Override
        public void onResponse(Call<NextSLModel> call, Response<NextSLModel> response) {
            progressDialog.dismiss();
            DescriptList=response.body();
            generateDataList(DescriptList);

        }

        @Override
        public void onFailure(Call<NextSLModel> call, Throwable t) {
             progressDialog.dismiss();

            Toast.makeText(getContext(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
        }
    });

}
private void generateDataList(NextSLModel photoList) {
    recyclerView = getView().findViewById(R.id.nextSLrecycle);
    LinearLayoutManager manager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(manager);
    recyclerView.setHasFixedSize(true);
    adapter = new NextSLJavaAdapter(getContext(),photoList);
    recyclerView.setAdapter(adapter);
}

}

adaptador:

public class NextSLJavaAdapter extends RecyclerView.Adapter<NextSLJavaAdapter.CustomViewHolder> {

NextSLModel Slmdel;
Context context;

public NextSLJavaAdapter(Context context, NextSLModel employees) {
    this.Slmdel = employees;
    this.context = context;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.nextsl_item, parent, false);

    return new CustomViewHolder(itemView);
}

@Override
public void onBindViewHolder(CustomViewHolder holder, int position) {
    // TipsModel employee = employees.get(position);
    //// holder.employeeName.setText(employees.get(position).getTips());
 /////////   holder.textView.setText(String.valueOf(position + 1) + ". ");
    holder.employeeName.setText(Slmdel.getJava());
    Log.e("sl",Slmdel.getJava());


}

@Override
public int getItemCount() {
    return 1;
    //return (employees == null) ? 0 : employees.size();

}

public class CustomViewHolder extends RecyclerView.ViewHolder {
    public TextView employeeName;
    TextView textView;

    public CustomViewHolder(View view) {
        super(view);
        employeeName = (TextView) view.findViewById(R.id.detailsStartLearning);
        textView = view.findViewById(R.id.Sl1);}}}

veja esta atividade de pesquisa:

public class Search extends AppCompatActivity {
SearchView searchView;
RecyclerView recyclerView;
SearchAdapter slAdapter;
List<StartLearning.SlModel> movieList;
ChipGroup chipGroup;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    searchView=findViewById(R.id.searchView);

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            searchForResults(newText);
            return false;
        }
    });
    //new code
    chipGroup = findViewById(R.id. chipGroup);

    searchView.onActionViewExpanded();
    searchView.setIconified(true);



}
public void searchForResults(String search){
    //here make an api call to get the results, complete the code here
    SLApiSevice service = SLApiClient.getRetrofitInstance().create(SLApiSevice.class);
    retrofit2.Call<List<StartLearning.SlModel>> call = service.getMySlmodel();

    call.enqueue(new Callback<List<StartLearning.SlModel>>() {
        @Override
        public void onResponse(retrofit2.Call<List<StartLearning.SlModel>> call, Response<List<StartLearning.SlModel>> response) {

            List<StartLearning.SlModel> list = response.body();
            generateDataList(list);
            addChips(list);
            Log.d("TAG","Response = "+movieList);
            slAdapter.setMovieList(getApplicationContext(),movieList);

        }

        @Override
        public void onFailure(retrofit2.Call<List<StartLearning.SlModel>> call, Throwable t) {
            Log.d("TAG","Response = "+t.toString());



        }
    });
}

private void generateDataList(List<StartLearning.SlModel> employeeList) {
    recyclerView = findViewById(R.id.recyclerview);
    LinearLayoutManager manager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(manager);
    recyclerView.setHasFixedSize(true);
    slAdapter = new SearchAdapter(getApplicationContext(),employeeList);
    recyclerView.setAdapter(slAdapter);
}
public void addChips(List<StartLearning.SlModel> searchItems){
    for (StartLearning.SlModel item : searchItems) {
        Chip mChip = (Chip) this.getLayoutInflater().inflate(R.layout.item_chips, null, false);
        mChip.setText(item.getTitle());
        int paddingDp = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 10,
                getResources().getDisplayMetrics()
        );
        mChip.setPadding(paddingDp, 0, paddingDp, 0);
        mChip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Handle the click here
            }
        });
        chipGroup.removeAllViews();
        chipGroup.addView(mChip);
    }
}



@Override
public void onBackPressed() {
    super.onBackPressed();
}

}

xml de pesquisa:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" >

</androidx.appcompat.widget.Toolbar>
<SearchView
    android:id="@+id/searchView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:queryHint="Search Here"
    android:iconifiedByDefault="false"
    android:layout_alignParentTop="true"
    android:background="@drawable/search_bar"
    android:layout_marginLeft="15dp"
    android:layout_marginRight="15dp"
    android:layout_marginTop="20dp"
    android:pointerIcon="crosshair"
    android:theme="@style/Widget.AppCompat.SearchView"
    android:focusedByDefault="true"

    />
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">
    </androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
<com.google.android.material.chip.ChipGroup
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:id="@+id/chipGroup"
    app:chipSpacing="25dp"/>

Adaptador de pesquisa:

public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.CustomViewHolder> implements Filterable {

List<StartLearning.SlModel> Slmdel;
List<StartLearning.SlModel> Slmdel1;

Context context;

public SearchAdapter() {
}

public void setMovieList(Context context, final List<StartLearning.SlModel> movieList){
    this.context = context;
    if(this.Slmdel == null){
        this.Slmdel = movieList;
        this.Slmdel1 = movieList;
        notifyItemChanged(0, Slmdel1.size());
    } else {
        final DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
            @Override
            public int getOldListSize() {
                return SearchAdapter.this.Slmdel.size();
            }

            @Override
            public int getNewListSize() {
               // return movieList.size();
                return (movieList == null) ? 0 : movieList.size();

            }

            @Override
            public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
                return SearchAdapter.this.Slmdel.get(oldItemPosition).getTitle() == movieList.get(newItemPosition).getTitle();
            }

            @Override
            public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {

                StartLearning.SlModel newMovie = SearchAdapter.this.Slmdel.get(oldItemPosition);

                StartLearning.SlModel oldMovie = movieList.get(newItemPosition);

                return newMovie.getTitle() == oldMovie.getTitle() ;
            }
        });
        this.Slmdel = movieList;
        this.Slmdel1 = movieList;
        result.dispatchUpdatesTo(this);
    }
}

public SearchAdapter(Context context,List<StartLearning.SlModel> employees) {
    this.Slmdel = employees;
    this.context=context;
}

@Override
public SearchAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.startlearning_item, parent, false);

    return new SearchAdapter.CustomViewHolder(itemView);
}

@Override
public void onBindViewHolder(SearchAdapter.CustomViewHolder holder, int position) {

    holder.employeeName.setText(Slmdel.get(position).getTitle());


}

@Override
public int getItemCount() {
    if(Slmdel != null){
        return Slmdel1.size();
    } else {
        return 0;
    }

}
   @Override
    public Filter getFilter() {
  return new Filter() {
      @Override
      protected FilterResults performFiltering(CharSequence constraint) {
          final FilterResults oReturn = new FilterResults();
          final List<StartLearning.SlModel> results = new ArrayList<StartLearning.SlModel>();
          if (Slmdel1 == null)
              Slmdel1 = Slmdel;
          if (constraint != null) {
              if (Slmdel1 != null & Slmdel1.size() > 0) {
                  for (final StartLearning.SlModel g : Slmdel1) {
                      if (g.getTitle().toLowerCase().contains(constraint.toString()))
                          results.add(g);
                  }
              }
              oReturn.values = results;
          }
          return oReturn;
      }

      @Override
      protected void publishResults(CharSequence constraint, FilterResults results) {
          Slmdel1 = (ArrayList<StartLearning.SlModel>) results.values;
          notifyDataSetChanged();

      }
  };}


  public class CustomViewHolder extends RecyclerView.ViewHolder {
      public TextView employeeName;
      TextView textView;

      public CustomViewHolder(View view) {
          super(view);
          employeeName = (TextView) view.findViewById(R.id.Sl2);
          textView = view.findViewById(R.id.Sl1);
          view.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  Intent intent = new Intent(context, NextSLactivity.class);
                  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                  intent.putExtra("title", Slmdel.get(getAdapterPosition()).getTitle());
                  intent.putExtra("idSLnext", Slmdel.get(getAdapterPosition()).getId());
                  //Log.e("ashwini",WAmdel.get(getAdapterPosition()).getId());
                  context.startActivity(intent);

              }
          });


      }
  }

}

Wini
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Samuel Liew

Respostas:

1

Você pode obter sugestões relacionadas à sua consulta de pesquisa usando a reciclagem e os adaptadores.

[1] Crie um novo adaptador e coloque seu setMovieList () e getFilter () nele.

[2] Defina esse adaptador na revisão de sugestões e notifique-o quando você receber sua lista de sugestões .

verifique o código abaixo

public void onResponse(retrofit2.Call<List<StartLearning.SlModel>> call, Response<List<StartLearning.SlModel>> response) {

                        movieList = response.body();
                        if(movieList.size()!=0){
                            tvSuggestions.setVisibility(View.VISIBLE);
                            suggestionAdapter=new SuggestionAdapter(Search.this,movieList);
                            recyclerViewSuggestions.setAdapter(suggestionAdapter);
                            Log.e("TAG", "onResponse: size of movielist "+movieList);
                            suggestionAdapter.getFilter().filter(query);
                            suggestionAdapter.notifyDataSetChanged();
                            suggestionAdapter.setMovieList(Search.this,movieList);

                        }
                        else{
                            tvSuggestions.setVisibility(View.VISIBLE);
                            tvSuggestions.setText("No Suggestions Found");
                        }

                        /*generateDataList(movieList);
                        Log.d("TAG","Response = "+movieList);
                        slAdapter.setMovieList(getApplicationContext(),movieList);*/

                    }
Nice umang
fonte
quando digito editar para editar texto e clicar em editar texto ... está me levando para a atividade de exibição de texto ...
Wini 15/01
1

Há um novo componente de material de chip no android. Que pode ser usado para atender aos requisitos. Acredito que você esteja atualmente usando uma revisão de exibição para exibir esses itens de pesquisa em vez de usar o ChiGroup para armazenar esses valores.a

Abaixo está um código de exemplo para fazer

Primeiro adicione isso ao seu gradle para usar a dependência externa da biblioteca

implementation 'com.google.android.material:material:1.0.0-alpha1'

Em seguida, no layout desejado abaixo da visualização de pesquisa, coloque esse código xml.

<com.google.android.material.chip.ChipGroup
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:id="@+id/chipGroup"
    app:chipSpacing="25dp"/>

Ele ChipGroupconterá os Chipitens que serão adicionados dinamicamente.

Portanto, agora em sua atividade / fragmento de pesquisa , obtenha uma referência desse grupo de layouts.

        public class Search extends AppCompatActivity {
        SearchView searchView;
        ChipGroup chipGroup;

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.search);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            searchView = findViewById(R.id.searchView);
            //new code 
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    searchForResults(newText);
                    return false;
                }
            });
            //new code
            chipGroup = findViewById(R.id. chipGroup);
            if (getSupportActionBar() != null) {
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                getSupportActionBar().setDisplayShowHomeEnabled(true);
            }
        }
        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) {
            if (item.getItemId() ==android.R.id.home) {
                finish();
            }
            return super.onOptionsItemSelected(item);
        }
        @Override
        public void onBackPressed() {
            super.onBackPressed();
        }

        //new code
        public void searchForResults(String search){
          //here make an api call to get the results, complete the code here
          call.enqueue(new Callback<List<StartLearning.SlModel>>() {
              @Override
              public void onResponse(retrofit2.Call<List<StartLearning.SlModel>> call, Response<List<StartLearning.SlModel>> response) {

                 List<StartLearning.SlModel> list = response.body();
                 //after getting the results pass to addChips()
                 addChips(list)
                 Log.d("TAG","Response = "+movieList);


             }

             @Override
             public void onFailure(retrofit2.Call<List<StartLearning.SlModel>> call, Throwable t) {
                  Log.d("TAG","Response = "+t.toString());

             }
          });
        }

        //just call this when you get the search result from the api with your custom model and where ever it is applicable.
        public void addChips(List<StartLearning.SlModel> searchItems){
          for (StartLearning.SlModel item : searchItems) {
             Chip mChip = (Chip) this.getLayoutInflater().inflate(R.layout.item_chip, null, false);
             mChip.setText(item.title);
             int paddingDp = (int) TypedValue.applyDimension(
                     TypedValue.COMPLEX_UNIT_DIP, 10,
                     getResources().getDisplayMetrics()
             );
             mChip.setPadding(paddingDp, 0, paddingDp, 0);
             mChip.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                // Handle the click here
                }
             });
             chipGroup.removeAllViews();
             chipGroup.addView(mChip);
         }
       }
   }

Não consigo encontrar o código relevante na atividade de pesquisa para dar um exemplo. mas a ideia geral é a seguinte.

1) Você adiciona um ChipGroup para armazenar as Visualizações de Chip, que serão adicionadas dinamicamente no seu xml da visualização de pesquisa. 2) O usuário pesquisa algo e você obtém a resposta da API e cria uma lista baseada em modelo. 3) você itera sobre a lista um por um e cria os chips dinâmicos.

4) Mas primeiro crie um arquivo item_chip.xml com o conteúdo abaixo.

<com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:id=@+id/smallChip
style="@style/Widget.MaterialComponents.Chip.Choice"
android:textAppearance="?android:attr/textAppearance"
android:textColor="@color/secondaryTextColor"
app:chipBackgroundColor="@color/colorAccent" />

5) Agora vamos inflar esse arquivo de layout e adicioná-lo ao loop for do ChipGroup in que recebemos anteriormente.

6) para que o código de exemplo seja assim para adicionar os chips dinâmicos ao ChipGroup . Aqui, estou usando String como itens de pesquisa para simplificar. Você pode usar seu próprio modelo aqui.

public void addChips(ArrayList<String> searchItems){
    for (String item : searchItems) {
        Chip mChip = (Chip) this.getLayoutInflater().inflate(R.layout.item_chip, null, false);
        mChip.setText(item);
        int paddingDp = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 10,
                getResources().getDisplayMetrics()
        );
        mChip.setPadding(paddingDp, 0, paddingDp, 0);
        mChip.setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View view) {
           // Handle the click here
           }
        });
        chipGroup.addView(mChip);
    }
}

agora adicionamos os chips dinamicamente ao chipGroup, que declaramos anteriormente no layout da exibição de pesquisa. Mas isso também pode ser feito usando a Recyclerview em vez de usar o ChipGropup, basta adicionar a Chip View nos itens da recyclerview e obter uma referência e definir o texto como faz com as exibições de texto que nada mudará, exceto no adaptador e no layout do item.

Edição: 1/4/20

Coloque o ChipGrop no arquivo XML abaixo com a visualização de pesquisa. A idéia é que a caixa de entrada da exibição de pesquisa esteja no topo e as sugestões da pesquisa estejam logo abaixo da caixa de pesquisa para fornecer resultados de pesquisa alterados logo na mesma tela. chame a chamada da API relacionada à pesquisa na própria atividade Search e passe os resultados para o método de amostra addChips () que mencionei acima.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

<SearchView
    android:id="@+id/searchView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:queryHint="Search Here"
    android:iconifiedByDefault="false"
    android:layout_alignParentTop="true"
    android:background="@drawable/search_bar"
    android:layout_marginLeft="15dp"
    android:layout_marginRight="15dp"
    android:layout_marginTop="20dp"
    android:pointerIcon="crosshair"
    android:theme="@style/Widget.AppCompat.SearchView"
    android:focusedByDefault="true"/>

<com.google.android.material.chip.ChipGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:id="@+id/chipGroup"
        app:chipSpacing="25dp"/>

</LinearLayout>

Para mais informações, leia abaixo os blogs:

Microplaquetas do projeto material

Como usar o Chips Blog

Como adicionar chips ao ChipsGroup

Vikas Kumar
fonte
Vamos continuar esta discussão no chat .
vikas kumar 6/01
a solução que você forneceu não é a solução ... a parte real "Pesquisa" não foi implementada nisso ... como posso aceitar?
Wini
está tudo bem @Wini, a API de pesquisa está sendo chamada, a única coisa é que você não está passando a chave de pesquisa para a API de consulta e, como é seu projeto, como saberei como implementar a API de pesquisa sem documentação. de qualquer maneira boa sorte
vikas kumar 07/01
0

Você pode usar este botão Chip View depois de passar pouco tempo, e achei que esta biblioteca será mais adequada no seu caso, como você está tentando alcançar com a visualização de pesquisa.

Então, experimente:

Adicione esta linha ao seu build.gradle no nível do módulo:

 dependencies {
   implementation "com.hootsuite.android:nachos:1.1.1"
}

Inclua um NachoTextView no seu layout xml da seguinte maneira:

<com.hootsuite.nachos.NachoTextView
android:id="@+id/nacho_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

Você também pode procurar no Github tudo o que deseja através da visualização de pesquisa. Procure esta resposta: Dica da consulta SearchView antes de clicar nela

haresh
fonte
0

Adicione esta biblioteca ao seu gradle

    implementation 'com.google.android.material:material:1.2.0-alpha02'

Mudança pai AppThemepara Theme.MaterialComponents.Light.NoActionBarem values/styles.xml.apenas como este

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">

Agora você precisa adicionar edittexte adicionar chipgroupao seu xml.

  <EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/search_edittext"/>
<com.google.android.material.chip.ChipGroup
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/chipgroup"
    app:singleSelection="true"
    >

</com.google.android.material.chip.ChipGroup>

Agora crie methodadicionar chipachipgroup

    void setChip(List<String> list)
    {
    chipgroup.removeAllViews();
    for (String item : list)
    {
        Chip chip =new Chip(this);
        chip.setText(item);

        // necessary to get single selection working
        chip.setCheckable(true);

        chip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("OnCheckedChangeListener", "Called");

            }
        });

        //on chip click


        chipgroup.addView(chip);
    }
}

Agora adicione addTextChangedListenerao seuedittext

   search_edittext.addTextChangedListener(new TextWatcher() {

     @Override
     public void afterTextChanged(Editable s) {}

     @Override    
     public void beforeTextChanged(CharSequence s, int start,
     int count, int after) {}

     @Override    
     public void onTextChanged(CharSequence s, int start,
     int before, int count) {
           List<String> tem=new ArrayList();
            for (String item : list)
            {
                if (item.toString().toLowerCase().contains(s.toString().toLowerCase()))
                    tem.add(item);
            }
            setChip(tem);
      }
     });

E isso feito.

Frankenstein
fonte
0

Para esse problema, eu tenho uma solução, siga abaixo

  1. você precisa de uma visualização de reciclagem logo abaixo da visualização de pesquisa.
  2. por padrão, existem algumas sugestões padrão (populares, tendências) (deve haver uma chamada de API diferente para isso).
  3. agora, como o usuário abre a tela, faça sugestões padrão pela API, agora use esta resposta e propague na sua lista de sugestões para exibição de reciclagem e notificação do adaptador.
  4. seu adaptador usa um layout de item, você pode definir o valor no textview e definir agora métodos abstratos no adaptador,

    primeiro método -> onItemClick (Valor da string) segundo método - onCloseBtnClick ()

  5. defina o listener de clique nesses métodos em seu suporte de visualização de ligação do adaptador.

  6. set onItem clique no pai clique e defina onCloseBtnClick em close btn

  7. agora substitua a funcionalidade desses métodos em que você cria o objeto do adaptador, o adaptador é abstrato e é necessário substituir esses métodos.

  8. Agora, no método onItemClick, você pode obter o valor do elemento na remessa; usando esse valor, é possível alterar programaticamente o valor da sua exibição de pesquisa e, como Cource, sua exibição de pesquisa deve conter um listner de texto de pesquisa; assim, conforme o texto for alterado, sua lógica de chamada de API de pesquisa ocorrerá .

  9. no futuro, como tipo de usuário, e desejar mostrar novas sugestões, basta atualizar sua lista de matriz de exibição de reciclagem e notificá-la.

Portanto, não há necessidade de bibliotecas de terceiros.

Abhishek Garg
fonte
ver ... no searchview em onTextchanger eu passei minha resposta api .... mas quando eu digito algo a lista permanece a mesma .. ela não combina com o texto digitado com sugestões
Wini
Eu usei getfilter () no adaptador, mas não mostra
Wini 07/01
@Wini dê uma olhada no seguinte: journaldev.com/12478/android-searchview-example-tutorial .
Abhishek Garg
@Wini você precisa adicionar o método onQueryTextChange, exemplo javatpoint.com/android-searchview
Abhishek Garg
Eu também usei esse método ... não funcionou .... veja meu adaptador de pesquisa acima ...
Wini em 7/01