Ich möchte so etwas ---> Erforderlich
Die Sache ist also, was ich genau möchte, ist, wenn der Benutzer einen bestimmten Themennamen (falls in der App vorhanden) in die Suchansicht eingibt, sollte er Vorschläge machen können und wenn er gefunden wird, sollte er diese Themenaktivität öffnen ( genau wie Facebook, Instagram usw.) Suchen ) .. und diese Titel stammen von der API (die ich in anderen Aktivitäten erfolgreich angezeigt habe) .. wie folgt -> [ Bildbeschreibung hier eingeben ..Was wird die Logik dafür sein ??? brauche Hilfe ... Danke
Deshalb habe ich gerade die Suchansicht wie folgt in XML aufgenommen ->
<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"
/>
Brauchen Sie Hilfe ... danke im Voraus ...
hier ist mein json: für [ Bildbeschreibung hier eingeben
[{"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"}]
Hier ist meine Aktivität: für [ Bildbeschreibung hier eingeben
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);
}
Adapter: für [ Bildbeschreibung hier eingeben
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);
}
});
}
}
Ein Klick auf das Element (Beispiel: Textansicht)
Aktivität: eines der Elemente (Beispiel: Textansicht)
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);
}
}}
Adapter:
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);}}}
Schauen Sie sich diese Suchaktivität an:
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 der Suche:
<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"/>
Suchadapter:
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);
}
});
}
}
}}
Antworten:
Mit recyclerview und Adaptern können Sie Vorschläge zu Ihrer Suchanfrage erhalten.
[1] Erstellen Sie einen neuen Adapter und fügen Sie Ihre setMovieList () und getFilter () ein .
[2] Setzen Sie diesen Adapter in die Recycling- Ansicht von Vorschlägen und benachrichtigen Sie den Adapter, wenn Sie eine Liste mit Vorschlägen erhalten .
Überprüfen Sie den folgenden Code
quelle
Es gibt eine neue Chip-Material-Komponente in Android. Welches kann verwendet werden, um die Anforderungen zu erfüllen. Ich glaube, Sie verwenden derzeit eine Recycling-Ansicht, um diese Suchelemente anzuzeigen, anstatt diese zu verwenden. Verwenden Sie ChiGroup, um diese Werte zu speichern
Unten finden Sie einen Beispielcode
Fügen Sie dies zunächst Ihrem Gradle hinzu, um die externe Bibliotheksabhängigkeit zu verwenden
Platzieren Sie dann in Ihrem gewünschten Layout unterhalb der Suchansicht diesen XML-Code.
Das enthält
ChipGroup
dieChip
Elemente, die dynamisch hinzugefügt werden.Holen Sie sich jetzt in Ihrer Suchaktivität / Ihrem Fragment nur eine Referenz dieser Layoutgruppe.
Ich kann den relevanten Code in der Suchaktivität nicht finden, um ein Beispiel zu nennen. aber die allgemeine Idee ist wie folgt.
1) Sie fügen eine ChipGroup hinzu, um die Chip-Ansichten aufzunehmen, die dynamisch in Ihrer Suchansicht-XML hinzugefügt werden. 2) Benutzer Suchen Sie etwas und Sie erhalten die API-Antwort und erstellen eine modellbasierte Liste. 3) Anschließend durchlaufen Sie die Liste nacheinander und erstellen die dynamischen Chips.
4) Erstellen Sie jedoch zuerst eine Datei item_chip.xml mit dem folgenden Inhalt.
5) Jetzt werden wir diese Layoutdatei einfach aufblasen und sie zu ChipGroup in for-Schleife hinzufügen, die wir zuvor erhalten haben.
6) Der Beispielcode lautet also wie folgt , um die dynamischen Chips zu ChipGroup hinzuzufügen . Hier verwende ich String der Einfachheit halber als Suchelemente. Hier können Sie Ihr eigenes Modell verwenden.
Jetzt haben wir gerade die Chips dynamisch zu chipGroup hinzugefügt, die wir zuvor im Layout der Suchansicht deklariert haben. Dies kann aber auch mit Recyclerview anstelle von ChipGropup erfolgen. Fügen Sie einfach die Chipansicht in die Recyclerview-Elemente ein, rufen Sie eine Referenz ab und legen Sie den Text wie bei Textansichten fest. Es ändert sich nichts, außer im Adapter- und Elementlayout.
Bearbeiten: 4/1/20
Platzieren Sie den ChipGrop in der folgenden XML- Datei mit Suchansicht . Die Idee ist, dass das Eingabefeld für die Suchansicht oben angezeigt wird und die Vorschläge aus der Suche direkt unter dem Suchfeld angezeigt werden, damit sich die Suchergebnisse genau dort auf demselben Bildschirm ändern. Rufen Sie daher den suchbezogenen API-Aufruf in der auf Suche nach Aktivität selbst und die Ergebnisse an die Probe - Methode übergeben addChips () ich oben erwähnt habe.
Für weitere Informationen lesen Sie unten Blogs:
Material Design Chips
So verwenden Sie Chips Blog
So fügen Sie Chips zu ChipsGroup hinzu
quelle
Sie können diese Chip-Ansicht-Schaltfläche ausführen, nachdem Sie wenig Zeit damit verbracht haben, dass diese Bibliothek für Ihren Fall besser geeignet ist, da Sie versuchen, sie mit der Suchansicht zu erreichen.
Probieren Sie es aus:
Fügen Sie diese Zeile Ihrer Modulebene build.gradle hinzu:
Fügen Sie eine NachoTextView wie folgt in Ihr XML-Layout ein:
Sie können das Ganze auf github auch so anzeigen, wie Sie es über die Suchansicht erreichen möchten. Suchen Sie nach dieser Antwort: SearchView-Abfragehinweis, bevor Sie darauf klicken
quelle
Fügen Sie diese Bibliothek in Ihre
gradle
Ändern Sie das übergeordnete Element
AppTheme
inTheme.MaterialComponents.Light.NoActionBar
in.values/styles.xml
Einfach soJetzt müssen Sie hinzufügen
edittext
undchipgroup
zu Ihrerxml
.Nur soErstellen Sie nun
method
Addchip
tochipgroup
Fügen Sie nun
addTextChangedListener
zu Ihrem hinzuedittext
Und das getan.
quelle
Für dieses Problem habe ich eine Lösung, folgen Sie unten
Ihr Adapter verwendet ein Elementlayout. Sie können den Wert in der Textansicht festlegen und jetzt abstrakte Methoden in Ihrem Adapter hinzufügen.
erste Methode -> onItemClick (String value) zweite Methode - onCloseBtnClick ()
Stellen Sie den Klick-Listener für diese Methoden in Ihrem Bindungsansichtshalter des Adapters ein.
set onItem click on parent click und set onCloseBtnClick on close btn
Überschreiben Sie jetzt die Funktionalität dieser Methoden, wenn Sie ein Objekt des Adapters erstellen. Der Adapter ist abstrakt. Sie müssen diese Methoden überschreiben.
Mit der onItemClick-Methode können Sie den Wert des Elements in arugment übernehmen. Mit diesem Wert können Sie den Wert Ihrer Suchansicht programmgesteuert ändern. Natürlich sollte Ihre Suchansicht den Suchtextlistener enthalten, damit bei Änderungen des Texts Ihre Logik des Such-API-Aufrufs ausgeführt wird .
Wenn Sie in Zukunft als Benutzertyp neue Vorschläge anzeigen möchten, können Sie einfach Ihre Array-Liste der Recycling-Ansicht aktualisieren und benachrichtigen.
quelle