tiêu đề cụ thể (lấy từ api) bằng searchview?


8

Tôi muốn một cái gì đó như thế này ---> Bắt buộc

Vì vậy, điều tôi muốn chính xác là khi người dùng nhập tên chủ đề cụ thể (nếu có trong ứng dụng) trong tìm kiếm, nó có thể đưa ra đề xuất và nếu tìm thấy nó sẽ mở hoạt động chủ đề đó ( như Facebook, Instagram, ... vv tìm kiếm ) .. và những tiêu đề đó đến từ API (mà tôi đã hiển thị thành công trong các hoạt động khác) .. như thế này -> [ nhập mô tả hình ảnh ở đây .. logic của nó sẽ như thế nào ??? cần giúp đỡ ... Cảm ơn

vì vậy tôi vừa đưa searchview vào XML như thế này ->

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

    />

Cần giúp đỡ..cảm ơn trước ....

đây là json của tôi: cho [ nhập mô tả hình ảnh ở đây

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

đây là hoạt động của tôi: cho [ nhập mô tả hình ảnh ở đây

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

bộ chuyển đổi: cho [ nhập mô tả hình ảnh ở đây

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 của mục (ví dụ: textview)

hoạt động: một trong các mục (ví dụ: 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);
}

}

bộ chuyển đổi:

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

nhìn vào hoạt động tìm kiếm này:

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 tìm kiếm:

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

Bộ điều hợp tìm kiếm:

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

              }
          });


      }
  }

}


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Samuel Liew

Câu trả lời:


1

Bạn có thể đạt được các đề xuất liên quan đến truy vấn tìm kiếm của mình bằng cách sử dụng recyclerview và bộ điều hợp.

[1] Tạo bộ điều hợp mới và đặt setMovieList ()getFilter () của bạn vào đó.

[2] Đặt bộ điều hợp đó thành tái chế các đề xuất và thông báo cho bộ điều hợp khi bạn nhận được danh sách gợi ý .

kiểm tra mã dưới đây

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

                    }

khi tôi gõ chỉnh sửa để chỉnh sửa văn bản và nhấp vào chỉnh sửa văn bản .. nó đưa tôi đến hoạt động xem văn bản ...
Wini

1

Có một thành phần vật liệu chip mới trong Android. Mà có thể được sử dụng để điền vào các yêu cầu. Tôi tin rằng bạn hiện đang sử dụng một số recyclerview để hiển thị các mục tìm kiếm đó thay vì sử dụng mục này để sử dụng Chigroup để giữ các giá trị đó.

Dưới đây là một số mã mẫu để làm

Trước tiên, thêm điều này vào lớp của bạn để sử dụng phụ thuộc libarary bên ngoài

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

Sau đó, trong bố cục mong muốn của bạn bên dưới chế độ xem tìm kiếm đặt mã xml này.

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

Các ChipGroupsẽ giữ Chipmục đó sẽ được thêm tự động.

Vì vậy, bây giờ trong hoạt động tìm kiếm / đoạn của bạn chỉ cần tham khảo nhóm bố cục này.

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

Tôi không thể tìm thấy mã có liên quan trong hoạt động Tìm kiếm để đưa ra một ví dụ. nhưng ý tưởng chung là như dưới đây.

1) Bạn thêm một Nhóm Chip để giữ Chế độ xem Chip sẽ được thêm động trong chế độ xem tìm kiếm của bạn xml. 2) Người dùng Tìm kiếm thứ gì đó và bạn nhận được phản hồi api và bạn tạo một danh sách dựa trên mô hình. 3) sau đó lần lượt lặp lại danh sách và tạo các chip động.

4) Nhưng trước tiên hãy tạo tệp item_chip.xml có nội dung bên dưới.

<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) Bây giờ chúng ta sẽ chỉ thổi phồng tệp bố cục này và thêm tệp này vào Chipgroup trong vòng lặp mà chúng ta đã nhận được trước đó.

6) vì vậy mã mẫu sẽ như thế này để thêm các chip động vào Chipgroup . Ở đây tôi sử dụng String làm mục tìm kiếm để đơn giản, bạn có thể sử dụng mô hình của riêng mình tại đây.

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

bây giờ chúng tôi vừa thêm các chip động vào chipgroup mà chúng tôi đã khai báo trước đó trong bố cục chế độ xem tìm kiếm. Nhưng điều này cũng có thể được thực hiện bằng Recyclerview thay vì sử dụng ChipGropup, chỉ cần thêm Chế độ xem Chip bên trong các mục tái chế và nhận tham chiếu và đặt văn bản như bạn làm với chế độ xem văn bản không có gì thay đổi ngoại trừ trong bố cục bộ điều hợp và mục.

Chỉnh sửa: 4/1/20

Đặt ChipGrop vào tệp XML bên dưới với chế độ xem tìm kiếm. Ý tưởng là hộp nhập liệu của chế độ tìm kiếm sẽ ở trên cùng và các đề xuất từ ​​tìm kiếm sẽ ở ngay dưới hộp tìm kiếm để đưa ra kết quả tìm kiếm thay đổi ngay trên cùng một màn hình. vì vậy hãy gọi lệnh gọi API liên quan đến tìm kiếm trong chính hoạt động Tìm kiếm và chuyển kết quả cho phương thức mẫu addChips () mà tôi đã đề cập ở trên.

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

Để biết thêm thông tin đọc bên dưới blog:

Vật liệu thiết kế chip

Cách sử dụng Chips Chips

Cách thêm Chipset vào Chipsgroup



giải pháp mà bạn đã đưa ra không phải là giải pháp ... phần thực tế "Tìm kiếm" chưa được triển khai trong đó..làm sao tôi có thể chấp nhận?
Wini

Không sao đâu @Wini, api tìm kiếm đang được gọi là điều duy nhất là bạn không chuyển khóa tìm kiếm cho api truy vấn và vì đó là dự án của bạn nên tôi sẽ biết cách triển khai api tìm kiếm mà không cần tài liệu. dù sao cũng may mắn
vikas kumar

0

Bạn có thể thực hiện nút Chip View này sau khi dành ít thời gian tôi thấy thư viện này sẽ phù hợp hơn trong trường hợp của bạn vì bạn đang cố gắng đạt được với chế độ xem tìm kiếm.

Vì vậy, hãy thử điều này:

Thêm dòng này vào cấp độ mô-đun build.gradle:

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

Bao gồm một NachoTextView trong bố cục xml của bạn như sau:

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

Bạn cũng có thể xem toàn bộ nội dung trên github như bạn muốn đạt được thông qua chế độ xem tìm kiếm, hãy tìm câu trả lời này: Gợi ý truy vấn SearchView trước khi nhấp vào nó


0

Thêm thư viện này trong của bạn gradle

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

Thay đổi mẹ của AppThemeđể Theme.MaterialComponents.Light.NoActionBartrong values/styles.xml.just như thế này

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

Bây giờ bạn cần thêm edittextchipgroupvào xml.Just như thế này

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

Bây giờ tạo methodthêm chipvàochipgroup

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

Bây giờ thêm addTextChangedListenervào của bạnedittext

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

Và điều này được thực hiện.


0

Đối với vấn đề này, tôi có một giải pháp, hãy làm theo dưới đây

  1. bạn cần một chế độ xem tái chế ngay bên dưới chế độ xem tìm kiếm của bạn.
  2. theo mặc định, có một số đề xuất mặc định (Hot, xu hướng), (phải có một cuộc gọi api khác cho việc này.)
  3. bây giờ, khi người dùng mở màn hình của bạn để thực hiện cuộc gọi api mặc định, bây giờ hãy sử dụng phản hồi này và cổng chính xác trong danh sách mảng suggesstion của bạn để xem tái chế và thông báo bộ điều hợp.
  4. bộ điều hợp của bạn sử dụng bố cục mục, bạn có thể đặt giá trị trong textview và đặt thêm các phương thức trừu tượng trong bộ điều hợp của bạn,

    phương thức thứ nhất -> onItemClick (Giá trị chuỗi) phương thức thứ hai - onCloseBtnClick ()

  5. đặt trình nghe nhấp chuột trên các phương thức này trong trình giữ liên kết của bộ điều hợp.

  6. đặt onItem nhấp vào cha mẹ nhấp và đặt onCloseBtnClick vào đóng btn

  7. bây giờ ghi đè chức năng của các phương thức này nơi bạn tạo đối tượng của bộ điều hợp, bộ điều hợp là trừu tượng bạn cần để ghi đè các phương thức này.

  8. bây giờ phương thức onItemClick bạn có thể lấy giá trị của phần tử trong arugment, bằng cách sử dụng giá trị này, bạn có thể thay đổi giá trị của chế độ xem tìm kiếm của bạn và nguồn của chế độ xem tìm kiếm của bạn sẽ chứa trình nghe văn bản tìm kiếm, do đó, thay đổi văn bản, cuộc gọi api tìm kiếm của bạn sẽ xảy ra .

  9. trong tương lai là loại người dùng và muốn hiển thị các đề xuất mới, bạn chỉ cần cập nhật danh sách mảng của chế độ xem tái chế và thông báo cho nó.

Vì vậy, không cần thư viện bên thứ ba.


xem ... trong searchview dưới onTextchanger tôi đã chuyển phản hồi api của mình .... nhưng khi tôi nhập một cái gì đó thì danh sách vẫn giữ nguyên .. nó không khớp với văn bản đã gõ với các đề xuất
Wini

Tôi đã sử dụng getfilter () trong bộ điều hợp nhưng không hiển thị
Wini


@Wini bạn cần thêm vào phương thức onQueryTextChange, ví dụ javatpoint.com/android-searchview
Abhishek Garg

Tôi cũng đã sử dụng phương pháp này ... không hoạt động .... xem bộ điều hợp tìm kiếm của tôi ở trên ...
Wini
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.