【问题标题】:Original List in adapter not updating once filtered something一旦过滤了某些内容,适配器中的原始列表就不会更新
【发布时间】:2018-07-27 06:46:25
【问题描述】:

当我滚动我的列表时,它会像预期的那样跟随pagination

但是当我打开搜索视图并输入内容并重置editText 并尝试加载下一个列表时,它不会在adapter 中更新,除非我滑动我的fragments 或隐藏searchview

在这两种情况下,我都将我的edittext 设置为null,因此它会在我认为但需要您帮助的那个电话上得到更新。

我昨天做了很多搜索,但不幸的是一无所获。希望我能在这里找到帮助。谢谢

MainActivity

public class MainActivity extends AppCompatActivity {
@BindView(R.id.vp_horizontal_ntb)
ViewPager viewPager;
@BindView(R.id.ntb_horizontal)
TabLayout topNavigationBar;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.appbar)
AppBarLayout mAppBar;
@BindView(R.id.searchIcon)
ImageView search;
@BindView(R.id.searchBoxLinOut)
LinearLayout searchBox;
@BindView(R.id.deleteSearchText)
ImageView deleteText;
@BindView(R.id.searchtext)
EditText et_search;
@BindView(R.id.imageView)
ImageView backButton;
String target = "nothing";
Context context;
Received_Fragment rf = new Received_Fragment();
Given_Fragment gf = new Given_Fragment();
InputMethodManager imm;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //StatusBarCompat.setStatusBarColor(this, 
   getResources().getColor(R.color.md_grey_300));
    setContentView(R.layout.layouot_all_reviews);
    ButterKnife.bind(this);
    context = this;
    viewPager.setOffscreenPageLimit(2);
    viewPager.setCurrentItem(0);
    viewPager.postDelayed(new Runnable() {

        @Override
        public void run() {
            setPosition();
        }
    }, 100);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow(); // in Activity's onCreate() for instance
        w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
      WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }
    setSupportActionBar(toolbar);
    getSupportActionBar().setHomeButtonEnabled(false);
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    imm = (InputMethodManager) 
    context.getSystemService(Context.INPUT_METHOD_SERVICE);
    setUpTabs();
    handleClicks();

}

private void handleClicks() {

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int 
         positionOffsetPixels) {
            et_search.setText(null);
        }

        @Override
            public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {
            et_search.setText(null);
        }
    });

    backButton.setOnClickListener(v -> {
        onBackPressed();
    });
    search.setOnClickListener(v -> {
        searchBox.bringToFront();
        if (searchBox.getVisibility() == View.VISIBLE) {
            hideSearch(searchBox);
        } else {
            showSearch(searchBox);
        }

    });
    deleteText.setOnClickListener(v -> {
        if (et_search.getText().length() > 1) {
            et_search.setText(null);
        } else hideSearch(searchBox);
    });

        et_search.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int 
             count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, 
            int count) {
                if (s.toString().trim().length() == 0) {
                    rf.update();
                    gf.update();
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (viewPager.getCurrentItem() == 0) {
                    rf.filter(s.toString());
                } else
                    gf.filter(s.toString());

            }
        });
    }


private void showSearch(View view) {
    TranslateAnimation animate = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            -view.getHeight() * 2,              // fromYDelta
            0);                // toYDelta
    animate.setDuration(500);
    animate.setFillAfter(false);
    view.startAnimation(animate);
    view.requestFocus();
    imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    view.setVisibility(View.VISIBLE);
    backButton.setEnabled(false);
}

private void hideSearch(View view) {
    TranslateAnimation animate = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            0,                 // fromYDelta
            -view.getHeight() * 3); // toYDelta
    animate.setDuration(500);
    animate.setFillAfter(false);
    view.startAnimation(animate);
    view.setVisibility(View.INVISIBLE);
    backButton.setEnabled(true);
    et_search.setText(null);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
     finish();
}

private void setPosition() {
    target = getIntent().getStringExtra("WHERE");
    if (target.equals("given")) {
        switchFragment(1);
    } else {
        viewPager.setCurrentItem(0);
    }
}

public void switchFragment(int target) {
    viewPager.setCurrentItem(target);
}

private void setUpTabs() {
    viewPager.setAdapter(new 
   FragmentPagerAdapter(getSupportFragmentManager()) {
        @Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0:
                    return rrf;
                case 1:
                    return rgf;
                default:
                    return new Default_Fragment();
            }
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Received";
                case 1:
                    return "Given";
                default:
                    return "Error";
            }
        }
    });
    topNavigationBar.setupWithViewPager(viewPager);
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

}

Received_Fragment

public class Received_Fragment extends Fragment {
    @BindView(R.id.recyclerView)
    RecyclerView recyclerView;
    @BindView(R.id.shimmer_view_container)
    ShimmerFrameLayout shimmerLayout;
    @BindView(R.id.msg)
    TextView message;
    //Initialization of Classes
    SessionManager session;
    ApiClient apiClient;
    List<ClassName> List = new ArrayList<>();

    Boolean isScrolling = false;
    boolean isDataLoaded = false;
    int currentItem, totalItem, scrollOutItem;
    //Properties to access
    Context context;
    String email;
    String userId;
    String access_token;
    RecievedAdapter adapter;
    BottomSheetBehavior sheetBehavior;
    LinearLayoutManager linearLayoutManager;
    private boolean isLastPage = false;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
    ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.recycler_view_layout, 
        container, false);
        ButterKnife.bind(this, view);
        context = getContext();
        session = new SessionManager(context);
        HashMap<String, String> user = session.getUserDetails();
        email = user.get(SessionManager.KEY_EMAIL);
        access_token = user.get(SessionManager.KEY_ACCESS_TOKEN);
        userId = user.get(SessionManager.KEY_USER_ID);
        apiClient = ((Common) 
        getActivity().getApplication()).getClient().create(ApiClient.class);
        shimmerLayout.startShimmerAnimation();
        linearLayoutManager = new LinearLayoutManager(getContext());
        adapter = new RecievedAdapter(List, context, 
        recyclerView);
        adapter.setHasStableIds(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(feedsAdapter);
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int 
             newState) {
                super.onScrollStateChanged(recyclerView, newState);

            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                currentItem = linearLayoutManager.getChildCount();
                totalItem = linearLayoutManager.getItemCount();
                scrollOutItem = linearLayoutManager.findFirstVisibleItemPosition();

                if (!isScrolling && !isLastPage) {
                    if ((currentItem + scrollOutItem) >= totalItem && scrollOutItem >= 0) {
                        LoadMoreData();
                    }


                }
            }


        });
        getData();
        return view;



    }




    public void filter(String text) {

        feedsAdapter.notifyDataSetChanged();
        List<Rating> temp = new ArrayList();
        for (Rating d : feedsList) {
            String tempF = "";
            for (int i = 0; i < d.getFeatures().size(); i++) {
                if (d.getFeatures().get(i).getName()!=null) {
                    tempF += d.getFeatures().get(i).getName()+",";
                    Log.d("This is name ", " Feature " + tempF);
                    if (tempF.toLowerCase().contains(text.toLowerCase())){
                        if (!temp.contains(d)){
                            temp.add(d);
                        }
                    }
                }
            }
            if (d.getName().toLowerCase().contains(text.toLowerCase())&& !d.getAnonymous()) {
                if (!temp.contains(d)){
                    temp.add(d);
                }

            }

        }
        //update recyclerview
        feedsAdapter.updateList(temp);

    }

    private void getData() {


                    List.addAll(allRecieved);
                    List.remove(0);
                    adapter = new RecievedAdapter(List, context, recyclerView);
                    shimmerLayout.setVisibility(View.GONE);
                    recyclerView.setAdapter(feedsAdapter);
                    recyclerView.invalidate();


    }

    private void LoadMoreData() {
        //Log.d("LoadMoreData", "Executing");
        isScrolling = true;

                        if (allRecieved.get(0).getSize() == 0) {
                            isLastPage = true;
                            Toast.makeText(context, "That's All", Toast.LENGTH_SHORT).show();
                        } else {
                            isScrolling = false;
                            allGiven.remove(0);
                            if (!List.contains(allRecieved)) {
                               List.addAll(allRecieved);
                                adapter.notifyDataSetChanged();
                            } else {
                                Toast.makeText(context, "Call Repeated", Toast.LENGTH_SHORT).show();
                            }

                        }
                    }

    }



    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (adapter != null) {
            adapter.onActivityResult(requestCode, resultCode, data);
        }
    }

    public void update() {
        adapter.updateOriginalList();
    }
}

Given_Fragment

  public class Given_Fragment extends Fragment {
        @BindView(R.id.recyclerView)
        RecyclerView recyclerView;
        @BindView(R.id.shimmer_view_container)
        ShimmerFrameLayout shimmerLayout;
        @BindView(R.id.msg)
        TextView message;
        //Initialization of Classes
        SessionManager session;
        ApiClient apiClient;
        List<ClassName> List = new ArrayList<>();

        Boolean isScrolling = false;
        boolean isDataLoaded = false;
        int currentItem, totalItem, scrollOutItem;
        //Properties to access
        Context context;
        String email;
        String userId;
        String access_token;
        GivenAdapter adapter;
        BottomSheetBehavior sheetBehavior;
        LinearLayoutManager linearLayoutManager;
        private boolean isLastPage = false;

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
        ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.recycler_view_layout, 
            container, false);
            ButterKnife.bind(this, view);
            context = getContext();
            session = new SessionManager(context);
            HashMap<String, String> user = session.getUserDetails();
            email = user.get(SessionManager.KEY_EMAIL);
            access_token = user.get(SessionManager.KEY_ACCESS_TOKEN);
            userId = user.get(SessionManager.KEY_USER_ID);
            apiClient = ((Common) 
            getActivity().getApplication()).getClient().create(ApiClient.class);
            shimmerLayout.startShimmerAnimation();
            linearLayoutManager = new LinearLayoutManager(getContext());
            adapter = new GivenAdapter(List, context, 
            recyclerView);
            adapter.setHasStableIds(true);
            recyclerView.setLayoutManager(linearLayoutManager);
            recyclerView.setAdapter(feedsAdapter);
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int 
                 newState) {
                    super.onScrollStateChanged(recyclerView, newState);

                }

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    currentItem = linearLayoutManager.getChildCount();
                    totalItem = linearLayoutManager.getItemCount();
                    scrollOutItem = linearLayoutManager.findFirstVisibleItemPosition();

                    if (!isScrolling && !isLastPage) {
                        if ((currentItem + scrollOutItem) >= totalItem && scrollOutItem >= 0) {
                            LoadMoreData();
                        }


                    }
                }


            });
            getData();
            return view;



        }




        public void filter(String text) {

            feedsAdapter.notifyDataSetChanged();
            List<Rating> temp = new ArrayList();
            for (Rating d : feedsList) {
                String tempF = "";
                for (int i = 0; i < d.getFeatures().size(); i++) {
                    if (d.getFeatures().get(i).getName()!=null) {
                        tempF += d.getFeatures().get(i).getName()+",";
                        Log.d("This is name ", " Feature " + tempF);
                        if (tempF.toLowerCase().contains(text.toLowerCase())){
                            if (!temp.contains(d)){
                                temp.add(d);
                            }
                        }
                    }
                }
                if (d.getName().toLowerCase().contains(text.toLowerCase())&& !d.getAnonymous()) {
                    if (!temp.contains(d)){
                        temp.add(d);
                    }

                }

            }
            //update recyclerview
            feedsAdapter.updateList(temp);

        }

        private void getData() {


                        List.addAll(allgiven);
                        List.remove(0);
                        adapter = new GivenAdapter(List, context, recyclerView);
                        shimmerLayout.setVisibility(View.GONE);
                        recyclerView.setAdapter(feedsAdapter);
                        recyclerView.invalidate();


        }

        private void LoadMoreData() {
            //Log.d("LoadMoreData", "Executing");
            isScrolling = true;

                            if (allgiven.get(0).getSize() == 0) {
                                isLastPage = true;
                                Toast.makeText(context, "That's All", Toast.LENGTH_SHORT).show();
                            } else {
                                isScrolling = false;
                                allGiven.remove(0);
                                if (!List.contains(allgiven)) {
                                   List.addAll(allgiven);
                                    adapter.notifyDataSetChanged();
                                } else {
                                    Toast.makeText(context, "Call Repeated", Toast.LENGTH_SHORT).show();
                                }

                            }
                        }

        }



        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (adapter != null) {
                adapter.onActivityResult(requestCode, resultCode, data);
            }
        }

        public void update() {
            adapter.updateOriginalList();
        }
    }

两个适配器相同,只连接一个

AllRecievedAdapter

public class AllRecievedAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    public int layout_feed = R.layout.layout_feed;

    private List<ClassName> list = new ArrayList<>();
    private Context context;
    private SessionManager session;
    private ApiClient apiClient;
    private String email, access_token;
    private UpvotesAdapter adapter;
    private BottomSheetDialog bottomSheetDialog;
    EditText location;
    EditText dateView;
    private Activity activity;

    public AllRecievedAdapter(List<ClassName> listList, Context applicationContext, RecyclerView recyclerView) {
        this.list = listList;
        this.context = applicationContext;
        this.activity = (Activity) context;
        this.templist = listList;
    }


    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        session = new SessionManager(context);
        apiClient = ((Common) ((Activity) context).getApplication()).getClient().create(ApiClient.class);
        HashMap<String, String> user = session.getUserDetails();
        email = user.get(SessionManager.KEY_EMAIL);
        access_token = user.get(SessionManager.KEY_ACCESS_TOKEN);

            View view = LayoutInflater.from(parent.getContext()).inflate(layout_feed, parent, false);
            AllRecievedAdapter.ViewHolderReview listViewHolder = new AllRecievedAdapter.ViewHolderReview(view);
            return listViewHolder;

    }


    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
                        holder.userName.setText(list.get(holder.getAdapterPosition()).getName());
                        GlideApp.with(context).load(list.get(holder.getAdapterPosition()).getImage()).into(holder.userImage);

    }











      @Override
    public int getItemCount() {
        return list.size();
    }


    public void updateList(List<Rating> temp) {
        list = temp;
        notifyDataSetChanged();
    }

    public void updateOriginalList(){
        list = templist;
        notifyDataSetChanged();
    }



    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.userName)
        TextView userName;
        @BindView(R.id.userImage)
        CircleImageView userImage;


        public ViewHolderReview(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

如果您需要任何额外信息,请告诉我。

【问题讨论】:

  • 更新列表后调用feedsAdapter.notifyDataSetChanged();
  • 嗨@DarshanPania,正如您在loadmore 方法中看到的那样,我做了同样的事情。
  • 我说的是filter 方法。当edittext 重置时,您在列表更新之前调用notifyDataSetChanged()
  • 你好,@DarshanPania,你能告诉我更多细节吗?
  • 终于....!!我在MainActivity 中搜索并在fragment 中过滤我的列表并在adapter 类中更新它。但是现在我正在通过适配器中的overridingFilter 方法在adapter 类中进行过滤和更新。现在它的工作。干杯

标签: android android-fragments android-recyclerview android-adapter notifydatasetchanged


【解决方案1】:

更新列表后致电feedsAdapter.notifyDataSetChanged();。当edittext 重置时,您在列表更新之前调用notifyDataSetChanged()。您的 filter 方法会更新适配器中的列表,但您在更新列表之前正在执行 notifyDataSetChanged。之后你需要这样做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2016-06-03
    • 2012-06-05
    • 1970-01-01
    • 2023-03-06
    • 2019-05-01
    相关资源
    最近更新 更多