web-dev-qa-db-fra.com

titre particulier (récupéré depuis l'api) en utilisant searchview?

Je veux quelque chose comme ça ---> Obligatoire

donc, ce que je veux exactement, c'est que lorsque l'utilisateur tape un nom de sujet particulier (s'il est présent dans l'application) dans la vue de recherche, il devrait pouvoir donner des suggestions et s'il le trouve, il devrait ouvrir cette activité de sujet ( juste comme Facebook, Instagram, ... etc recherches ) .. et ces titres proviennent d'API (que j'ai réussi à afficher dans d'autres activités) .. comme ça -> [ entrez la description de l'image ici .. quelle en sera la logique ??? besoin d'aide ... Merci

donc je viens d'inclure searchview en XML comme ceci ->

  <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"

    />

Besoin d'aide..Merci à l'avance ....

voici mon json: pour [ entrez la description de l'image ici

[{"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"}]

voici mon activité: pour [ entrez la description de l'image ici

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);
}

adaptateur: pour [ entrez la description de l'image ici

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);

            }
        });


    }
}

un clic sur l'élément (exemple: affichage de texte)

activité: l'un des éléments (exemple: affichage de texte)

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);
}

}

adaptateur:

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);}}}

regardez cette activité de recherche:

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 recherche:

<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"/>

Adaptateur de recherche:

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);

              }
          });


      }
  }

}

8
Wini

Vous pouvez obtenir des suggestions liées à votre requête de recherche à l'aide de recyclerview et d'adaptateurs.

[1] Créez un nouveau adaptateur et mettez-y setMovieList () et getFilter ().

[2] Définissez cet adaptateur en vue de recyclage des suggestions et informez l'adaptateur lorsque vous obtenez votre liste de suggestions.

vérifier ci-dessous le code

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);*/

                    }
1
Nice umang

Il y a un nouveau composant matériel de puce dans Android. Qui peut être utilisé pour répondre aux exigences. Je crois que vous utilisez actuellement une vue d'ensemble du recyclage pour afficher ces éléments de recherche au lieu d'utiliser cette utilisation ChiGroup pour conserver ces valeurs.

Voici un exemple de code à faire

Ajoutez d'abord ceci à votre gradle pour utiliser la dépendance libarienne externe

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

Ensuite, dans la disposition souhaitée sous la vue de recherche, placez ce code 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"/>

ChipGroup contiendra les éléments Chip qui seront ajoutés dynamiquement.

Alors maintenant, dans votre recherche activité/fragment obtenez simplement une référence de ce groupe de disposition.

        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);
         }
       }
   }

Je ne trouve pas le code approprié dans l'activité de recherche pour donner un exemple. mais l'idée générale est comme ci-dessous.

1) Vous ajoutez un ChipGroup pour contenir les vues de puce qui seront ajoutées dynamiquement dans votre vue de recherche xml. 2) L'utilisateur recherche quelque chose et vous obtenez la réponse api et vous créez une liste basée sur un modèle. 3) vous parcourez ensuite la liste une par une et créez les puces dynamiques.

4) Mais créez d'abord un fichier item_chip.xml avec le contenu ci-dessous.

<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) Maintenant, nous allons simplement gonfler ce fichier de mise en page et l'ajouter à ChipGroup dans la boucle for que nous avons reçue plus tôt.

6) donc l'exemple de code va comme ceci pour ajouter les puces dynamiques à ChipGroup . Ici, en utilisant String comme éléments de recherche pour plus de simplicité, vous pouvez utiliser votre propre modèle ici.

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);
    }
}

maintenant, nous venons d'ajouter les puces dynamiquement à chipGroup que nous avons déclaré plus tôt dans la présentation de la vue de recherche. Mais cela peut également être fait en utilisant Recyclerview au lieu d'utiliser ChipGropup, ajoutez simplement la vue Chip à l'intérieur des éléments recyclerview et obtenez une référence et définissez le texte comme vous le faites avec les vues de texte, rien à changer, sauf dans la disposition des adaptateurs et des éléments.

Modifier: 01/04/20

Placez le ChipGrop dans le dessous [~ # ~] xml [~ # ~] fichier avec vue de recherche. L'idée est que la zone de saisie de la vue de recherche sera en haut et que les suggestions de la recherche seront juste en dessous de la zone de recherche pour donner des résultats de recherche changeants juste là sur le même écran. appelez donc l'appel d'API lié à la recherche dans l'activité Recherche elle-même et transmettez les résultats à l'exemple de méthode addChips ( ) J'ai mentionné ci-dessus.

<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>

Pour plus d'informations, lisez les blogs ci-dessous:

puces de conception matérielle

Comment utiliser Chips Blog

Comment ajouter des puces à ChipsGroup

1
vikas kumar

Vous pouvez faire ce bouton Chip View après avoir passé peu de temps.J'ai trouvé que cette bibliothèque conviendrait mieux dans votre cas que vous essayez d'atteindre avec la vue de recherche.

Alors essayez ceci:

Ajoutez cette ligne à votre niveau de module build.gradle:

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

Incluez un NachoTextView dans votre mise en page XML comme suit:

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

Vous pouvez également regarder l'ensemble de la chose sur github comme vous le souhaitez grâce à la vue de recherche, recherchez cette réponse: indice de requête SearchView avant de cliquer dessus

0
haresh

Pour ce problème, j'ai une solution, suivez ci-dessous

  1. vous avez besoin d'une vue de recyclage juste en dessous de votre vue de recherche.
  2. par défaut, il y a des suggestions par défaut (Hot, tendances), (il doit y avoir un appel API différent pour cela.)
  3. maintenant que l'utilisateur ouvre votre écran, faites des suggestions par défaut, appelez l'api, utilisez maintenant cette réponse et propagez-la dans votre liste de tableaux suggesstion pour la vue de recyclage et notifiez l'adaptateur.
  4. votre adaptateur utilise une disposition d'élément, vous pouvez définir la valeur dans l'affichage de texte et définir maintenant ajouter des méthodes abstraites dans votre adaptateur,

    première méthode -> onItemClick (valeur de chaîne) deuxième méthode - onCloseBtnClick ()

  5. définissez l'écouteur de clic sur ces méthodes dans votre support d'affichage de l'adaptateur.

  6. définir onItem cliquer sur le parent cliquer et définir onCloseBtnCliquer sur fermer btn

  7. remplacer maintenant la fonctionnalité de ces méthodes lorsque vous créez un objet d'adaptateur, l'adaptateur est abstrait, vous devez remplacer ces méthodes.

  8. maintenant onItemClick méthode, vous pouvez prendre la valeur de l'élément dans l'arugment, en utilisant cette valeur, vous pouvez modifier par programme la valeur de votre vue de recherche, et bien sûr, votre vue de recherche devrait contenir un listeur de texte de recherche, de sorte que le texte change, votre logique d'appel de recherche api se produira .

  9. à l'avenir en tant que type d'utilisateur et que vous souhaitez afficher de nouvelles suggestions, vous pouvez simplement mettre à jour votre liste de tableaux de vue de recyclage et la notifier.

Il n'y a donc pas besoin de bibliothèques tierces.

0
Abhishek Garg

Ajoutez cette bibliothèque dans votre gradle

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

Changer le parent de AppTheme en Theme.MaterialComponents.Light.NoActionBar dans values/styles.xml .juste comme ça

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

Vous devez maintenant ajouter edittext et chipgroup à votre xml. Tout comme ceci

  <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>

Maintenant, créez method ajoutez chip à chipgroup

    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);
    }
}

Maintenant, ajoutez addTextChangedListener à votre edittext

   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);
      }
     });

Et c'est fait.

0
frankenstein