web-dev-qa-db-ja.com

searchviewを使用して特定のタイトル(APIから取得)?

このようなものが欲しい---> 必須

つまり、私が正確に求めているのは、ユーザーがsearchviewで特定のトピック名(アプリ内に存在する場合)を入力すると、提案を提供し、見つかった場合はそのトピックアクティビティを開く(だけです) Facebook、Instagramなど... search)のようなものです。これらのタイトルはAPIから来ています(他のアクティビティで正常に表示されています)。このように-> [ ここに画像の説明を入力 ..そのロジックは何ですか???助けが必要...ありがとう

だから私はこのようにXMLにsearchviewを含めました->

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

    />

助けが必要です..事前に感謝します....

ここに私のjsonがあります:[ ここに画像の説明を入力してください

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

ここに私の活動があります:[ 画像の説明をここに入力してください

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

アダプター:[ ここに画像の説明を入力

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

            }
        });


    }
}

アイテムのクリック(例:textview)

アクティビティ:アイテムの1つ(例: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);
}

}

アダプタ:

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

この検索アクティビティを見てください:

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:

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

検索アダプター:

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

Recyclerviewとアダプターを使用して、検索クエリに関連する提案を実現できます。

[1]新しいadapterを作成し、それにsetMovieList()getFilter()を挿入します。

[2]そのアダプターを提案のrecyclerviewに設定します提案の配列リストを取得したらアダプターに通知します

コードの下を確認してください

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

Androidに新しいチップマテリアルコンポーネントがあります。要件を満たすために使用できます。これらの値を保持するためにChiGroupを使用する代わりに、現在いくつかのrecyclerviewを使用してこれらの検索項目を表示していると思います。

以下はいくつかのサンプルコードです

まず、外部ライブラリ依存関係を使用するためにこれをグラドルに追加します

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

次に、検索ビューの下の目的のレイアウトに、この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は、動的に追加されるChipアイテムを保持します。

したがって、検索activity/fragmentでは、このレイアウトグループの参照を取得するだけです。

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

例を示すために、検索アクティビティに関連するコードが見つかりません。しかし、一般的な考え方は以下のとおりです。

1)検索ビューxmlに動的に追加されるチップビューを保持するために、ChipGroupを追加します。 2)ユーザーが何かを検索すると、API応答が返され、モデルベースのリストが作成されます。 3)次に、リストを1つずつ繰り返し、動的チップを作成します。

4)ただし、最初にitem_chip.xmlファイルを以下の内容で作成します。

<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)次に、このレイアウトファイルをinflateにして、先ほど受け取ったforループのChipGroupにこれを追加します。

6)したがって、サンプルコードはこのようになり、動的チップをChipGroupに追加します。ここでは、簡単にするために検索項目としてStringを使用しています。ここでは独自のモデルを使用できます。

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

これで、検索ビューのレイアウトで以前に宣言したチップグループに動的にチップが追加されました。ただし、これは、ChipGropupを使用する代わりにRecyclerviewを使用して行うこともできます。Recyclerviewアイテム内にチップビューを追加して参照を取得し、テキストビューで行うようにテキストを設定して、アダプターとアイテムのレイアウト以外は何も変更しません。

編集:4/1/20

ChipGropを以下に配置します[〜#〜] xml [〜#〜]検索ビュー付きのファイル。アイデアは、検索ビューの入力ボックスが一番上になり、検索からの候補が検索ボックスの真下になり、同じ画面のすぐそこに検索結果の変更が表示されるというものです。 Searchアクティビティ自体で検索関連のAPI呼び出しを呼び出し、結果をサンプルメソッドaddChips( )私は前述した。

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

詳細については、以下のブログをお読みください。

材料設計チップ

Chips Blogの使い方

ChipsGroupにチップを追加する方法

1
vikas kumar

あなたは少しの時間を費やした後、あなたはこのチップビューボタンを実行することができます。

だからこれを試してみてください:

次の行をモジュールレベルのbuild.gradleに追加します。

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

次のように、NachoTextViewをxmlレイアウトに含めます。

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

Githubで全体を見て、この回答を検索ビューで探すこともできます: SearchViewクエリヒントをクリックする前にクリックしてください

0
haresh

この問題の解決策があります。以下に従ってください

  1. 検索ビューのすぐ下にリサイクルビューが必要です。
  2. デフォルトでは、いくつかのデフォルト(ホット、トレンド)提案があります(これには別のapi呼び出しが必要です)。
  3. ユーザーが画面を開いてデフォルトの提案api呼び出しを行うようになりました。この応答を使用して、提案配列リストのプロパティゲートでリサイクルビューと通知アダプターを使用します。
  4. アダプターがアイテムレイアウトを使用する場合、textviewに値を設定し、アダプターに抽象メソッドを追加するように設定できます。

    最初のメソッド-> onItemClick(String value)2番目のメソッド-onCloseBtnClick()

  5. アダプタのバインドビューホルダーのこれらのメソッドにクリックリスナーを設定します。

  6. 親クリックでonItemクリックを設定し、閉じるbtnでonCloseBtnClickを設定します。

  7. アダプタのオブジェクトを作成するこれらのメソッドの機能をオーバーライドします。アダプタは抽象であり、これらのメソッドをオーバーライドする必要があります。

  8. onItemClickメソッドでは、arugmentの要素の値を取得できます。この値を使用して、プログラムで検索ビューの値を変更できます。また、検索ビューに検索テキストリスナーを含める必要があるため、テキストが変更されると、検索API呼び出しのロジックが発生します。 。

  9. 今後ユーザータイプとして、新しい提案を表示したい場合は、リサイクルビューの配列リストを更新して通知するだけです。

したがって、サードパーティのライブラリは必要ありません。

0
Abhishek Garg

このライブラリをgradleに追加します

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

AppThemeの親をTheme.MaterialComponents.Light.NoActionBarvalues/styles.xmlに変更します。

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

次に、edittextchipgroupxmlに追加する必要があります。このように

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

次に、methodを作成し、chipchipgroupに追加します。

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

次に、addTextChangedListeneredittextに追加します

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

これで完了です。

0
frankenstein