0

Ich versuche eine SearchView in der ActionBar zu implementieren. Ich verwende notifyDataSetChanged() im Adapter, aber die Fragment wird nicht aktualisiert. Ich benutze den Debugger, es scheint, dass der Fluss funktioniert gut, aber nur die Fragment wird nicht wieder ausgeführt. Hier ist mein Code:notifyDataSetChanged() funktioniert nicht für SearchView

Das ist mein Adapter Klasse:

public class DessertAdapter extends RecyclerView.Adapter<DessertAdapter.DessertVh> { 


private List<Dessert> desserts = new ArrayList<>(); 
OnItemClickListener clickListener; 
private Context context; 

public DessertAdapter(Context context) { 
    this.context = context; 

    desserts = Dessert.prepareDesserts(
      context.getResources().getStringArray(R.array.dessert_names), 
      context.getResources().getStringArray(R.array.dessert_descriptions)); 
} 

public void setFilter(ArrayList<Dessert> newList){ 
    desserts = new ArrayList<>(); 
    desserts.addAll(newList); 
    notifyDataSetChanged(); 
} 

@Override 
public DessertVh onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View view = inflater.inflate(R.layout.item_dessert, parent, false); 
    return new DessertAdapter.DessertVh(view); 
} 

@Override 
public void onBindViewHolder(DessertVh holder, int position) { 
    Dessert dessert = desserts.get(position); 

    holder.mName.setText(dessert.getName()); 
    holder.mDescription.setText(dessert.getDescription()); 
    holder.mFirstLetter.setText(String.valueOf(dessert.getFirstLetter())); 

} 

@Override 
public int getItemCount() { 
    return desserts == null ? 0 : desserts.size(); 
} 

public class DessertVh extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    private TextView mName; 
    private TextView mDescription; 
    private TextView mFirstLetter; 

    public DessertVh(View itemView) { 
     super(itemView); 

     mName = (TextView) itemView.findViewById(R.id.txt_name); 
     mDescription = (TextView) itemView.findViewById(R.id.txt_desc); 
     mFirstLetter = (TextView) itemView.findViewById(R.id.txt_firstletter); 

     itemView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     clickListener.onItemClick(v, getPosition()); 
    } 
} 

public interface OnItemClickListener { 
    public void onItemClick(View view, int position); 
} 

public void SetOnItemClickListener(final OnItemClickListener itemClickListener) { 
    this.clickListener = itemClickListener; 
} 
} 

Dies ist meine Aktivitätsklasse, die von Fragment und FragmentPagerAdapter bestehen auch:

public class TabsHeaderActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{ 
private static final String TAG = TabsHeaderActivity.class.getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tabs_header); 

    final Toolbar toolbar = (Toolbar) findViewById(R.id.htab_toolbar); 
    setSupportActionBar(toolbar); 
    if (getSupportActionBar() != null) getSupportActionBar().setTitle("TECHNOLOGY"); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    final ViewPager viewPager = (ViewPager) findViewById(R.id.htab_viewpager); 
    setupViewPager(viewPager); 


    TabLayout tabLayout = (TabLayout) findViewById(R.id.htab_tabs); 
    tabLayout.setupWithViewPager(viewPager); 

    final CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.htab_collapse_toolbar); 

    try { 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.edtech); 
     Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() { 
      @SuppressWarnings("ResourceType") 
      @Override 
      public void onGenerated(Palette palette) { 

       int vibrantColor = palette.getVibrantColor(R.color.primary_500); 
       int vibrantDarkColor = palette.getDarkVibrantColor(R.color.primary_700); 
       collapsingToolbarLayout.setContentScrimColor(vibrantColor); 
       collapsingToolbarLayout.setStatusBarScrimColor(vibrantDarkColor); 
      } 
     }); 

    } catch (Exception e) { 
     // if Bitmap fetch fails, fallback to primary colors 
     Log.e(TAG, "onCreate: failed to create bitmap from background", e.fillInStackTrace()); 
     collapsingToolbarLayout.setContentScrimColor(
       ContextCompat.getColor(this, R.color.primary_500) 
     ); 
     collapsingToolbarLayout.setStatusBarScrimColor(
       ContextCompat.getColor(this, R.color.primary_700) 
     ); 
    } 

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 

      viewPager.setCurrentItem(tab.getPosition()); 
      Log.d(TAG, "onTabSelected: pos: " + tab.getPosition()); 

      switch (tab.getPosition()) { 
       case 0: 
        // TODO: 31/03/17 
        break; 
      } 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFrag(new DummyFragment(
      ContextCompat.getColor(this, R.color.cyan_50)), "Cyan"); 
    adapter.addFrag(new DummyFragment(
      ContextCompat.getColor(this, R.color.amber_50)), "Amber"); 
    adapter.addFrag(new DummyFragment(
      ContextCompat.getColor(this, R.color.purple_50)), "Purple"); 
    adapter.addFrag(new DummyFragment(
      ContextCompat.getColor(this, R.color.grey)), "Grey"); 
    viewPager.setAdapter(adapter); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 

    MenuItem menuItem = menu.findItem(R.id.menuSearch); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem); 
    searchView.setOnQueryTextListener(this); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); 
      return true; 
     case R.id.menuSearch: 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 
    return false; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 

    newText = newText.toLowerCase(); 
    ArrayList<Dessert> newList = new ArrayList<>(); 

    for(Dessert dessert : Dessert.desserts){ 
     String name = dessert.getName().toLowerCase(); 
     if(name.contains(newText)){ 
      newList.add(dessert); 
     } 
    } 

    new DessertAdapter(getBaseContext()).setFilter(newList); 
    return true; 
} 

private static class ViewPagerAdapter extends FragmentPagerAdapter{ 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFrag(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 
} 

public static class DummyFragment extends Fragment{ 
    int color; 
    Intent intent; 
    DessertAdapter adapter; 

    public DummyFragment() { 
    } 

    @SuppressLint("ValidFragment") 
    public DummyFragment(int color) { 
     this.color = color; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dummy_fragment, container, false); 

     final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.dummyfrag_bg); 
     frameLayout.setBackgroundColor(color); 

     RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dummyfrag_scrollableview); 

     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getBaseContext()); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.setHasFixedSize(true); 

     adapter = new DessertAdapter(getContext()); 
     recyclerView.setAdapter(adapter); 
return view; 
    } 

} 
} 

Antwort

0

Sie rufen Filtern auf eine neue Instanz von DessertAdapter anstelle der Adapter-Instanz, die Sie für Ihre Recycler-Ansicht festgelegt haben.

Sie sollten eine Schnittstelle in DummyFragment definieren, die es der Aktivität ermöglicht, die Suchansichtsabfrage an sie zu senden.

Rufen Sie dann setFilter auf der Instanz von DessertAdapter auf, die bereits im Fragment instanziiert wurde.

+0

Das macht Sinn. Aber wie kann ich die Abfrage der Suchansicht an die Schnittstelle von DummyFragment übergeben? – Achal

+0

Können Sie mir bitte einige Beispiele geben? @ luca992 – Achal

Verwandte Themen