particular title(fetched from api) using searchview?

瘦欲@ 提交于 2020-01-18 10:48:26

问题


I want something like this---> Required

so the thing is, what I exactly want is when user type particular topic name(if present in-app) in searchview it should able give suggestions and if found it should open that topic activity (just like Facebook, Instagram,...etc searches)..and those title are coming from API(which I have successfully displayed in other activities)..like this--> [enter image description here..what will the logic for it??? need help... Thanks

so I have just included searchview in XML like this-->

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

    />

Need help..thanks in advance....

here is my json:for [enter image description here

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

here is my activity: for [enter image description here

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:for [enter image description here

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

            }
        });


    }
}

onclick of item(example :textview)

activity:one of the items(example :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);
}

}

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

look at this search activity:

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 of search:

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

Search adapter :

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

              }
          });


      }
  }

}


回答1:


You can achieve suggestions related to your search query using recyclerview and adapters.

[1] Create new adapter and put your setMovieList() and getFilter() into it.

[2] Set that adapter into recyclerview of suggestions and notify adapter when you get your arraylist of suggestions.

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

                    }



回答2:


There is a new Chip Material Component in android. Which can be used to fullfill the requirements. I belive you are currently using some recyclerview to display those search items instead of using this use ChiGroup to hold those values.a

Below is some sample code to do

First add this to your gradle for using the external libarary dependency

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

Then in your desired layout below the search view place this xml code.

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

The ChipGroup will hold the Chip items which will be added dynamically.

So now in your search activity/fragment just get a reference of this layout group.

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

I can't find the relevant code in Search activity to give an example. but the general idea is as below.

1) You add a ChipGroup to hold the Chip Views which will be added dynamically in your search view xml. 2) User Search something and you get the api response and you create a model based list. 3) you then iterate over the list one by one and create the dynamic chips.

4) But first create an item_chip.xml file with below content.

<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) Now we are going to just inflate this layout file and add this to ChipGroup in for loop which we received earlier.

6) so the sample code goes like this to add the dynamic chips to ChipGroup. Here im using String as search items for simplicity you can use your own model here.

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

now we have just added the chips dynamically to chipGroup which we declared earlier in search view layout . But this can also be done using Recyclerview instead of using ChipGropup just add the Chip View inside the recyclerview items and get a reference and set the text as you do with text views nothing to change except in adapter and item layout.

Edit: 4/1/20

Place the ChipGrop into the below XML file with search view. The idea is that the search view input box will be on top and the suggestions from the search will be just below the search box to give changing search results just right there on same screen. so call the search-related API call in the Search activity itself and pass the results to the sample method addChips() I have mentioned above.

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

For more info read below blogs:

Material Design Chips

How to use Chips Blog

How to add Chips to ChipsGroup




回答3:


You can do this Chip View button you after spending little time i found this library will be more suitable in your case as you are trying to achieve with search view.

So Try this out :

Add this line to your module level build.gradle:

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

Include a NachoTextView in your xml layout as follows:

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

You can look entire thing on github also as you want to achieve through search view look for this answer : SearchView query hint before clicking it




回答4:


Add this library in your gradle

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

Change parent of AppTheme to Theme.MaterialComponents.Light.NoActionBar in values/styles.xml .just like this

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

Now You need to add edittext and chipgroup to your xml.Just like this

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

Now create method add chip to 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);
    }
}

Now add addTextChangedListener to your 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);
      }
     });

And this done.




回答5:


For this problem, i have a solution, follow below

  1. you need a recycle view just below you search view.
  2. by default there are some default (Hot , trending) suggestions, (there must be a different api call for this.)
  3. now as, user open your screen do default suggestions api call, now use this response and propergate in your suggesstion array list for recycle view and notify adapter.
  4. your adapter uses a item layout, you can set value in textview and set add now abstract methods in your adapter,

    first method --> onItemClick(String value) second method -- onCloseBtnClick()

  5. set click listener on these methods in your bind view holder of adapter .

  6. set onItem click on parent click and set onCloseBtnClick on close btn

  7. now override the functionality of these methods where you create object of adapter, adapter is abstract you need to overide these methods.

  8. now onItemClick method you can take value of element in arugment, using this value you can programatically change value of your search view, and of cource your search view should contain search text listner, so as text changes, your logic of search api call will happen.

  9. in future as user type, and want to show new suggestions, you can just update your array list of recycle view and notify it.

So there is no need to third party libraries.



来源:https://stackoverflow.com/questions/59532667/particular-titlefetched-from-api-using-searchview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!