java - 如何在多个片段上应用单个搜索视图
问题描述
我正在做一个语言翻译项目。我在其中使用了多个带有 TabLayout 和Viewpager
. 我也使用 aRecyclerView
来显示列表。每个 Fragment 都有自己的 RecyclerViewAdapter 类实例。但我也想在操作中应用搜索视图。我想在其中过滤所有片段的结果。但它不起作用。如果您对我的项目有更多详细信息,请告诉我。
这里我的MainActivity
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import com.fidu.learnchinese.Fragments.ClothesFragment;
import com.fidu.learnchinese.Fragments.ColorFragment;
import com.fidu.learnchinese.Fragments.EatingOutFragment;
import com.fidu.learnchinese.Fragments.FamilyFragment;
import com.fidu.learnchinese.Fragments.GreetingFragment;
import com.fidu.learnchinese.Fragments.NumberFragment;
import com.fidu.learnchinese.Adapters.PagerAdpater;
import com.fidu.learnchinese.R;
import com.google.android.material.tabs.TabLayout;
public class MainActivity extends AppCompatActivity {
private Toolbar mToolbar;
private TabLayout mTabLayout;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar=findViewById(R.id.toolbar);
mTabLayout=findViewById(R.id.tabLayout);
mViewPager=findViewById(R.id.viewPager);
setSupportActionBar(mToolbar);
PagerAdpater adpater=new PagerAdpater(getSupportFragmentManager());
adpater.addFragment(new GreetingFragment(),"Greeting");
adpater.addFragment(new NumberFragment(),"Numbers");
adpater.addFragment(new EatingOutFragment(),"Eating Out");
adpater.addFragment(new ColorFragment(),"Colors");
adpater.addFragment(new ClothesFragment(),"Clothes");
adpater.addFragment(new FamilyFragment(),"Family");
mViewPager.setAdapter(adpater);
mTabLayout.setupWithViewPager(mViewPager);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_search_menu,menu);
MenuItem menuItem=menu.findItem(R.id.action_search);
SearchView searchView=(SearchView) menuItem.getActionView();
searchView.setQueryHint("Type here to search");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//Dont Know what to do now??
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
}
这是我的 RecyclerView 适配器类
import android.content.Context;
import android.media.MediaPlayer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fidu.learnchinese.R;
import com.fidu.learnchinese.models.ChineseLanguage;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class RecyclerViewAdpater extends RecyclerView.Adapter<RecyclerViewAdpater.MyViewHolder> implements Filterable {
private List<ChineseLanguage> mChineseLanguages;
private List<ChineseLanguage> mChineseLanguagesFull;
private Context mContext;
private MediaPlayer mMediaPlayer;
public RecyclerViewAdpater(List<ChineseLanguage> chineseLanguages, Context context) {
mChineseLanguages = chineseLanguages;
mChineseLanguagesFull=new ArrayList<>(mChineseLanguages);
mContext = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
holder.txtEnglishWord.setText(mChineseLanguages.get(position).getEnglishAlphabet());
holder.txtChineseWord.setText(mChineseLanguages.get(position).getChineseAlphabet());
holder.txtPronunciation.setText(mChineseLanguages.get(position).getPronounciation());
holder.btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
releasaMedia();
mMediaPlayer=MediaPlayer.create(mContext,mChineseLanguages.get(position).getSound());
mMediaPlayer.start();
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
releasaMedia();
}
});
}
});
}
private void releasaMedia(){
if (mMediaPlayer!=null){
mMediaPlayer.release();
}
mMediaPlayer=null;
}
@Override
public int getItemCount() {
return mChineseLanguages.size();
}
@Override
public Filter getFilter() {
return filter;
}
private Filter filter=new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<ChineseLanguage> filteredList=new ArrayList<>();
if (constraint.toString().isEmpty()){
filteredList.addAll(mChineseLanguagesFull);
}else {
for(ChineseLanguage item: mChineseLanguagesFull){
if (item.getEnglishAlphabet().toLowerCase().contains(constraint.toString().toLowerCase().trim())){
filteredList.add(item);
}
}
}
FilterResults filterResults=new FilterResults();
filterResults.values=filteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mChineseLanguages.clear();
mChineseLanguages.addAll((Collection<? extends ChineseLanguage>) results.values);
notifyDataSetChanged();
}
};
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView txtEnglishWord,txtChineseWord,txtPronunciation;
ImageButton btnPlay;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
txtEnglishWord=itemView.findViewById(R.id.txtEnglishWord);
txtChineseWord=itemView.findViewById(R.id.txtChineseWord);
txtPronunciation=itemView.findViewById(R.id.txtPronunciation);
btnPlay=itemView.findViewById(R.id.btnPlay);
}
}
}
这是一个片段以便更好地理解
public class ClothesFragment extends Fragment {
private RecyclerView mRecyclerViewClothes;
private List<ChineseLanguage> mClothes;
public ClothesFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClothes=new ArrayList<>();
mClothes.add(new ChineseLanguage("Wear","穿","chuān",R.raw.clothes_wear));
mClothes.add(new ChineseLanguage("Put On","穿","chuān",R.raw.clothes_put_on));
mClothes.add(new ChineseLanguage("Take On","脱下","tuō xià",R.raw.clothes_take_off));
mClothes.add(new ChineseLanguage("Clothes","衣服","yī fú",R.raw.clothes_clothes));
mClothes.add(new ChineseLanguage("Trousers","裤子","kù zi",R.raw.clothes_trousers));
mClothes.add(new ChineseLanguage("Shirt","衬衫","chèn shān",R.raw.clothes_shirt));
mClothes.add(new ChineseLanguage("T-shirt","衬衣","chèn yī",R.raw.clothes_t_shirt));
mClothes.add(new ChineseLanguage("Dress","连衣裙","lián yī qún",R.raw.clothes_dress));
mClothes.add(new ChineseLanguage("Pair of Socks","袜子","wà zi",R.raw.clothes_pair_of_socks));
mClothes.add(new ChineseLanguage("Pair of Shoes","鞋子","xié zi",R.raw.clothes_pair_of_shoes));
mClothes.add(new ChineseLanguage("Sweatshirt","运动衫","yùn dòng shān",R.raw.clothes_sweatshirt));
mClothes.add(new ChineseLanguage("Jacket","夹克","jiá kè",R.raw.clothes_jacket));
mClothes.add(new ChineseLanguage("Skirt","裙子","qún zi",R.raw.clothes_skirt));
mClothes.add(new ChineseLanguage("Suit","套装","tào zhuāng",R.raw.clothes_suit));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.fragment_clothes, container, false);
mRecyclerViewClothes=view.findViewById(R.id.recyclerViewClothes);
mRecyclerViewClothes.setLayoutManager(new LinearLayoutManager(getContext()));
RecyclerViewAdpater adpater=new RecyclerViewAdpater(mClothes,getActivity());
mRecyclerViewClothes.setAdapter(adpater);
return view;
}
}
现在我想要的是。当我在搜索视图栏中输入文本时。应该从所有片段中过滤掉
解决方案
我建议您使用 Realm 数据库并对此进行查询并将结果显示为列表视图。
或者
使用数据绑定并绑定片段的所有项目。
让我知道
推荐阅读
- postgresql - postgresql UPDATE中的运行计数
- azure - 是否可以使用 Azure Active Directory B2C 来保护非 B2C 目录中包含的 API?
- excel - 在子文件夹的指定单元格中添加超链接
- react-native - React Native - 通过转换增加/减少点击时的视图高度
- continuous-integration - GitLab CI 不起作用:缺少自定义执行程序 RunExec
- html - 每页的垫子分页器项目在角度 9 中不起作用
- bash - 在 bash shell 中,将标准错误重定向到标准输出并使用字符串前缀引用错误部分
- sql - 使用 APEX_JSON 生成 JSON 文档
- mysql - 通过heroku将MYSQL从本地机器提供给其他远程用户
- php - 自定义存档缩略图而不是最新帖子的缩略图(Wordpress)