简体   繁体   English

当我在 RecyclerView 项目中单击时,片段加载数据错误数据

[英]Fragment loading data wrong data when I click in RecyclerView item

So I've been trying to fix this issue for so many hours but can't find the cause behind it.所以我一直试图解决这个问题好几个小时,但找不到背后的原因。

Issue: My app shows data from my API into recyclerView, a standard feature.问题:我的应用程序将来自我的 API 的数据显示到标准功能 recyclerView 中。 The issue comes when I use the search function.当我使用搜索 function 时出现问题。 When I search for something, my search adapter shows the query data but going back to my Main fragment again, the view loader shows content fine but when I click on it, search items are actually being loaded instead.当我搜索某些内容时,我的搜索适配器显示了查询数据,但又回到了我的主片段,视图加载器显示内容很好,但是当我单击它时,实际上正在加载搜索项。

Check my app to find out what I'm talking about: https://play.google.com/store/apps/details?id=envision.apps.newsextra检查我的应用程序以了解我在说什么: https://play.google.com/store/apps/details?id=envision.apps.newsextra

To reproduce, search for something, click on any article from search results, then go back and click any article from main feed, search items are actually being loaded instead.要复制,搜索某些内容,单击搜索结果中的任何文章,然后返回 go 并单击主要提要中的任何文章,实际上正在加载搜索项目。

Here's my main fragment:这是我的主要片段:

public class FeedsFragment extends Fragment implements ArticleListener, LocalMessageCallback {

    private PullRefreshLayout pullRefreshLayout;
    private RecyclerView recyclerView;
    private FeedsAdapter adapter;
    private View layout;
    private ArrayList<Object> data = new ArrayList<>();
    private List<Favorites> favorites = new ArrayList<>();
    private List<Articles> articles = new ArrayList<>();
    private boolean init = true;

    private DataViewModel dataViewModel;

    private NativeAdsManager mNativeAdsManager;
    private String sort_date = SharedPrefernces.getFeedSortDate();

    public static FeedsFragment newInstance() {
        return new FeedsFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        layout = inflater.inflate(R.layout.feeds_fragment_layout, container, false);
        init_views();
        setRecyclerView();
        initNativeAds();
        dataViewModel = ViewModelProviders.of(this).get(DataViewModel.class);
        dataViewModel.getFavorites().observe(this, favorites -> {

            if(favorites!=null){
                this.favorites = favorites;
            }
        });

        dataViewModel.getArticles().observe(this, articles -> {
            this.articles = articles;
            if(init) {
                if (articles!= null && articles.size() > 0) {
                    //this.articles = articles;
                    data = new ArrayList<>();
                    if(SharedPrefernces.getActiveInterest().equalsIgnoreCase(getString(R.string.all_stories))){
                        data.add(new Info("Showing stories based on all your interests"));
                    }else{
                        data.add(new Info("Showing stories on "+SharedPrefernces.getActiveInterest()));
                    }

                    data.addAll(articles);
                    adapter.setData(data);
                }
                init = false;
            }
        });

        new Handler().postDelayed(() -> {
            //we first check if time set to fetch feeds again has elapsed
            pullRefreshLayout.setRefreshing(true);
            fetchFeeds();
            SharedPrefernces.setReloadArticles(false);
        }, 1000);
        return layout;
    }

    //init view layouts
    private void init_views(){
        pullRefreshLayout = layout.findViewById(R.id.pullRefreshLayout);
        int[] colorScheme = getResources().getIntArray(R.array.refresh_color_scheme);
        pullRefreshLayout.setColorSchemeColors(colorScheme);
        pullRefreshLayout.setOnRefreshListener(this::fetchFeeds);
    }

    //init recyclerview
    private void setRecyclerView() {
        recyclerView = (RecyclerView) layout.findViewById(R.id.recyclerView);

        GridLayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 1);
        recyclerView.setLayoutManager(mLayoutManager);
        adapter = new FeedsAdapter(getActivity(),recyclerView,this);
        //int index = movies.size() - 1;
        adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
            if(data.size()>0 && data.get(1) instanceof Articles){
                adapter.setLoader();
                loadMoreFeeds();
            }
        }));
        recyclerView.setAdapter(adapter);
    }

    private void initNativeAds(){
        mNativeAdsManager = new NativeAdsManager(getActivity(), getResources().getString(R.string.FACEBOOK_FEED_NATIVE_AD), 10);
        mNativeAdsManager.loadAds();
        mNativeAdsManager.setListener(new NativeAdsManager.Listener() {
            @Override
            public void onAdsLoaded() {

            }

            @Override
            public void onAdError(AdError adError) {

            }
        });
    }

    private void fetchFeeds(){
        if(!NetworkUtil.hasConnection(getActivity())) {
            setNetworkError();
            return;
        }
        NetworkService service = StringApiClient.createServiceWithToken(NetworkService.class);
        try {
            JSONObject jsonData = new JSONObject();
            if(SharedPrefernces.getActiveInterest().equalsIgnoreCase(getString(R.string.all_stories))) {
                jsonData.put("interests", new JSONArray(SharedPrefernces.getUserInterests()));
            }else{
                ArrayList<String> interest = new ArrayList<>();
                interest.add(SharedPrefernces.getActiveInterest());
                jsonData.put("interests", new JSONArray(interest));
            }
            if(SharedPrefernces.getUserUnfollowedFeedSources()!=null  && SharedPrefernces.getUserUnfollowedFeedSources().size()>0) {
                jsonData.put("sources", new JSONArray(SharedPrefernces.getUserUnfollowedFeedSources()));
            }
            jsonData.put("location", Misc.getCurrentCountryCode());
            String requestBody = jsonData.toString();
            Log.e("final requestbody",requestBody);

            Call<String> callAsync = service.getArticles(requestBody);

            callAsync.enqueue(new Callback<String>() {
                @Override
                public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
                    Log.e("response",String.valueOf(response.body()));
                    pullRefreshLayout.setRefreshing(false);
                    if(response.body()==null){
                        setNetworkError();
                        return;
                    }

                    try {
                        JSONObject res = new JSONObject(response.body());
                        // Add Your Logic
                        if(res.getString("status").equalsIgnoreCase("ok")){
                            //create a new object
                            data = new ArrayList<>();
                            if(SharedPrefernces.getActiveInterest().equalsIgnoreCase(getString(R.string.all_stories))){
                                data.add(new Info("Showing stories based on all your interests"));
                            }else{
                                data.add(new Info("Showing Stories on "+SharedPrefernces.getActiveInterest()));
                            }

                            sort_date = res.getString("date");
                            SharedPrefernces.setFeedSortDate(sort_date);

                            ArrayList<Articles> articles = JsonParser.getArticles(res.getJSONArray("feeds"));
                            //delete all previously store articles, and add new items to database
                            dataViewModel.deleteAllArticles();
                            dataViewModel.insertAllArticles(articles);

                            //append interests to our object list
                            data.addAll(articles);
                            //set data to adapter
                            adapter.setData(data);
                            //set last fetched time to sharedpreferences
                            if(articles.size()>0)SharedPrefernces.setArticleLastRefreshTime(System.currentTimeMillis());
                        }

                    }catch (Exception e){
                        e.printStackTrace();
                        Log.e("error",e.getMessage());
                    }
                }

                @Override
                public void onFailure(@NonNull Call<String> call, @NonNull Throwable throwable) {

                    Log.e("error",String.valueOf(throwable.getMessage()));
                    setNetworkError();
                    pullRefreshLayout.setRefreshing(false);
                }
            });

        } catch (JSONException e) {
            Log.e("parse error",e.getMessage());
            e.printStackTrace();
        }
    }

    private void loadMoreFeeds(){
// ToDo
    }

    private void setNetworkError(){

        dataViewModel.deleteAllArticles();
        dataViewModel.insertAllArticles(articles);
        pullRefreshLayout.setRefreshing(false);
        data = new ArrayList<>();
        if(SharedPrefernces.getActiveInterest().equalsIgnoreCase(App.getContext().getString(R.string.all_stories))){
            data.add(new Info("Showing stories based on all your interests"));
        }else{
            data.add(new Info("Showing stories on "+SharedPrefernces.getActiveInterest()));
        }
        data.add(new Error(""));
        adapter.setData(data);
    }

    @Override
    public void OnItemClick(Articles article) {
        //List<Integer> contestWinners = data.subList(0, 5);
        int position = 0;
        for (Articles arts: this.articles) {
            if(arts.getId() == article.getId()){
                position = this.articles.indexOf(arts);
            }
        }
        Gson gson = new Gson();
        String json = gson.toJson(article);
        Intent intent = new Intent(getActivity(), FeedViewerActivity.class);
        intent.putExtra("position", position);
        intent.putExtra("article",json);
        intent.putExtra(FeedViewerActivity.VIEW_TYPE, Constants.ARTICLE_VIEW);
        intent.putExtra(FeedViewerActivity.VIEW_SIZE, get_feeds_view_size(this.articles,position));
        startActivity(intent);
        Objects.requireNonNull(getActivity()).overridePendingTransition(R.anim.slide_left_in, R.anim.still);
    }

    @Override
    public void OnPinClick(Articles articles,String action) {
        if(articles==null)return;
        if(action.equalsIgnoreCase(getResources().getString(R.string.add_pin))){
            dataViewModel.insertFavorites(ObjectMapper.mapFavorites(articles));
        }else {
            dataViewModel.deleteFavorite(ObjectMapper.mapFavorites(articles).getId());
        }
    }


    @Override
    public void OnShareClick(Articles articles) {
        Intent share = new Intent(android.content.Intent.ACTION_SEND);
        share.setType("text/plain");

        share.putExtra(Intent.EXTRA_SUBJECT, articles.getTitle());
        share.putExtra(Intent.EXTRA_TEXT, articles.getLink());

        startActivity(Intent.createChooser(share, "Share Article"));
    }

    @Override
    public boolean IsPinned(Articles articles) {
        for (Favorites fav: favorites) {
            if(fav.getId() == articles.getId()){
                return true;
            }
        }
        return false;
    }

    @Override
    public void requestAds(int position) {
        NativeAd ad = mNativeAdsManager.nextNativeAd();
        if(ad!=null){
            adapter.setAd(ad,position);
        }
    }

    @Override
    public void loadSingleFeedsActivity(Articles articles) {
        Gson gson = new Gson();
        String myJson = gson.toJson(articles);
        Intent intent = new Intent(getActivity(), FeedSourceActivity.class);
        intent.putExtra("article", myJson);
        startActivity(intent);
    }

    @Override
    public boolean isSingleFeedsActivity() {
        return false;
    }

    @Override
    public void onDestroy() {
        LocalMessageManager.getInstance().send(R.id.remove_listener);
        LocalMessageManager.getInstance().removeListener(this);
        super.onDestroy();
    }

    @Override
    public void onStart() {
        super.onStart();
        LocalMessageManager.getInstance().addListener(this);
    }

    @Override
    public void handleMessage(@NonNull LocalMessage localMessage) {
         if(localMessage.getId() == R.id.reload_feeds){
             pullRefreshLayout.setRefreshing(true);
             fetchFeeds();
             SharedPrefernces.setReloadArticles(false);
        }
        if(localMessage.getId() == R.id.scroll_feeds_to_top){
            recyclerView.smoothScrollToPosition(0);
        }
    }
}

Adapter:适配器:

public class FeedsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {

    private ArrayList<Object> data = new ArrayList<>();
    private Context context;
    private int lastItemPosition = -1;
    private final int VIEW_TYPE_HEADER = 1;
    private final int VIEW_TYPE_LIST = 2;
    private final int VIEW_TYPE_LOADER = 3;
    private final int VIEW_TYPE_NETWORK_ERROR = 4;
    private final int VIEW_TYPE_INFO = 5;
    private final int VIEW_TYPE_AD = 6;
    private boolean isLoading = false;
    private LoadMoreListener loadMoreListener;
    private int visibleThreshold = 2;//visible items before loading next feeds
    private int firstVisibleItem,lastVisibleItem, totalItemCount;

    private ArticleListener articleListener;

    public FeedsAdapter(Context context, RecyclerView mRecyclerView, ArticleListener articleListener) {
      this.context=context;
      this.articleListener = articleListener;
        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LocalMessageManager.getInstance().send(R.id.recyclerview_scroll);
                firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();

                if ((firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD) % Constants.ADS.LOAD_ADS_AT_POSITION == 0){
                    //
                    int pos = firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD;
                    if(pos > lastItemPosition && data.size()>pos && data.get(pos - 1) != null/*dont load ad if we r currently making a request*/) {
                        if (!(data.get(pos) instanceof NativeAd)) {
                            articleListener.requestAds(pos);
                        }
                    }
                }
                if (!isLoading && NetworkUtil.hasConnection(context)) {
                    if (totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        if (loadMoreListener != null) {
                            loadMoreListener.onLoadMore();
                        }
                        isLoading = true;
                    }
                }
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        if(data.get(position) instanceof Error)return VIEW_TYPE_NETWORK_ERROR;
        if(data.get(position) instanceof Info)return VIEW_TYPE_INFO;
        if(data.get(position) instanceof NativeAd)return VIEW_TYPE_AD;
        if(SharedPrefernces.get_feed_images_show()
                && SharedPrefernces.get_feed_type() == 1
                && position==1  && data.get(position) instanceof Articles){
            return VIEW_TYPE_HEADER;
        }
        if(data.get(position) == null)return VIEW_TYPE_LOADER;
        return VIEW_TYPE_LIST;
    }

    public void setData(ArrayList<Object> objectList) {
        Log.e("objectList size",String.valueOf(objectList.size()));
        this.data.clear();
        this.data.addAll(objectList);
        Log.e("data size",String.valueOf(data.size()));
        this.notifyDataSetChanged();
    }

    public void setMoreData(ArrayList<Articles> articles) {
        //int start = data.size() + 2;
        data.addAll(articles);
        //this.notifyItemRangeInserted(start, articles.size());
        this.notifyDataSetChanged();
    }

    public void setAd(NativeAd ad, int pos) {
        data.add(pos, ad);
        this.notifyItemInserted(pos);
    }


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

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        lastItemPosition = position;
        //Log.e("view type",String.valueOf(holder.getItemViewType()));
        switch (holder.getItemViewType()) {
            case VIEW_TYPE_LIST: case VIEW_TYPE_HEADER:
                final ArticleViewHolder viewHolder = (ArticleViewHolder) holder;
                viewHolder.bindTo((Articles) data.get(position));
                break;
            case VIEW_TYPE_LOADER:
                final ViewLoader viewLoader = (ViewLoader) holder;
                viewLoader.rotateLoading.start();
                break;
            case VIEW_TYPE_NETWORK_ERROR:
                ViewError viewError = (ViewError) holder;
                if(SharedPrefernces.getUseNightMode()){
                    viewError.img.setColorFilter(App.getContext().getResources().getColor(R.color.white));
                }else{
                    viewError.img.setColorFilter(App.getContext().getResources().getColor(R.color.black));
                }
                break;
            case VIEW_TYPE_INFO:
                final ViewInfo viewInfo = (ViewInfo) holder;
                Info info = (Info)data.get(position);
                viewInfo.body.setText(info.getContent());
                break;
            case VIEW_TYPE_AD:
                final AdsViewHolder adsViewHolder = (AdsViewHolder) holder;
                NativeAd nativeAd = (NativeAd)data.get(position);
                adsViewHolder.bind(nativeAd);
                break;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(context);
        switch (i) {
            case VIEW_TYPE_HEADER:
                View v = inflater.inflate(R.layout.feeds_header, parent, false);
                viewHolder = new ArticleViewHolder(v, articleListener);
                break;
            case VIEW_TYPE_LIST:
                View va;
                if(SharedPrefernces.get_feed_images_show() && SharedPrefernces.get_feed_type()==0){
                    va = inflater.inflate(R.layout.large_image_feeds_list, parent, false);
                }else{
                    va = inflater.inflate(R.layout.feeds_list, parent, false);
                }
                viewHolder = new ArticleViewHolder(va, articleListener);
                break;
            case VIEW_TYPE_LOADER:
                View ld = inflater.inflate(R.layout.loader, parent, false);
                viewHolder = new ViewLoader(ld);
                break;
            case VIEW_TYPE_NETWORK_ERROR:
                View ne = inflater.inflate(R.layout.no_stories, parent, false);
                viewHolder = new ViewError(ne);
                break;
            case VIEW_TYPE_INFO:
                View info = inflater.inflate(R.layout.info, parent, false);
                viewHolder = new ViewInfo(info);
                break;
            case VIEW_TYPE_AD:
                View ads = inflater.inflate(R.layout.ad_item_large, parent, false);
                viewHolder = new AdsViewHolder(ads);
                break;
        }

        return viewHolder;
    }

    @Override
    public void onClick(View view) {
        //int pos = (int) view.getTag();
        switch (view.getId()){
            case R.id.pin:
                break;
            case R.id.share:
                break;
        }
    }

    public class ViewLoader extends RecyclerView.ViewHolder {
        private RotateLoading rotateLoading;

        ViewLoader(View view) {
            super(view);
            rotateLoading = (RotateLoading) view.findViewById(R.id.rotateloading);
        }
    }

    public class ViewError extends RecyclerView.ViewHolder {
        private ImageView img;

        ViewError(View view) {
            super(view);
            img = view.findViewById(R.id.img);
        }
    }

    public class ViewInfo extends RecyclerView.ViewHolder {
        private TextView body;

        ViewInfo(View view) {
            super(view);
            body = view.findViewById(R.id.body);
        }
    }

    public void setLoaded(){
        data.remove(data.size()-1);
        this.notifyItemRemoved(data.size()-1);
        isLoading = false;
    }

    public void setLoadMoreListener(LoadMoreListener loadMoreListener) {
        this.loadMoreListener = loadMoreListener;
    }

    public void setLoader(){
        data.add(null);
        this.notifyItemInserted(data.size()-1);
    }
}

Search Adapter:搜索适配器:

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


    private List<Object> items = new ArrayList<>();
    private final int VIEW_TYPE_MEDIA = 0;
    private final int VIEW_TYPE_LOADING = 1;
    private final int VIEW_TYPE_AD = 2;
    private SearchClickListener searchClickListener;
    private LoadMoreListener mOnLoadMoreListener;
    private boolean isLoading;
    private int visibleThreshold = 2;
    public int firstVisibleItem,lastVisibleItem, totalItemCount;
    private int lastItemPosition = -1;


    public SearchAdapter(RecyclerView mRecyclerView, SearchClickListener searchClickListener) {
        this.searchClickListener = searchClickListener;
        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();

                if ((firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD) % Constants.ADS.LOAD_ADS_AT_POSITION == 0){
                    //
                    int pos = firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD;
                    if(pos > lastItemPosition && items.size()>pos && items.get(pos - 1) != null/*dont load ad if we r currently making a request*/) {
                        if (!(items.get(pos) instanceof NativeAd)) {
                            searchClickListener.requestAds(pos);
                        }
                    }
                }
                if (!isLoading && NetworkUtil.hasConnection(App.getContext())) {
                    if (totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        if (items.size() > 1 && mOnLoadMoreListener != null) {
                            mOnLoadMoreListener.onLoadMore();
                        }
                        isLoading = true;
                    }
                }
            }
        });
    }

    public void setMoreAdapter(List<Search> data) {
        items.addAll(data);
        //items.addAll((items.size()-1),data);
        this.notifyDataSetChanged();
    }

public void setAdapter(List<Search> data) {
        items = new ArrayList<>();
        items.addAll(data);
        this.notifyDataSetChanged();
    }

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

    @Override
    public int getItemViewType(int position) {
        if(items.get(position) instanceof NativeAd)return VIEW_TYPE_AD;
       if(items.get(position)==null && position == (items.size()-1)){
            return VIEW_TYPE_LOADING;
        }else{
            return VIEW_TYPE_MEDIA;
        }
    }

    public void setLoader() {
        items.add(null);
        this.notifyItemInserted(items.size() - 1);
    }

    public void setAd(NativeAd ad, int pos) {
        items.add(pos, ad);
        this.notifyItemInserted(pos);
    }


    public void removeLoader() {
        items.remove(items.size() - 1);
        this.notifyItemRemoved(items.size());
    }

    public void setOnLoadMoreListener(LoadMoreListener mOnLoadMoreListener) {
        this.mOnLoadMoreListener = mOnLoadMoreListener;
    }

    @Override
    public  RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        switch (i) {
            case VIEW_TYPE_MEDIA:
                View v = inflater.inflate(R.layout.search_list, viewGroup, false);
                viewHolder = new SearchViewHolder(v,searchClickListener);
                viewHolder.itemView.setClickable(true);
                break;
            case VIEW_TYPE_LOADING:
                View vL = inflater.inflate(R.layout.loader, viewGroup, false);
                viewHolder = new LoadingViewHolder(vL);
                break;
            case VIEW_TYPE_AD:
                View ads = inflater.inflate(R.layout.ad_item_small, viewGroup, false);
                viewHolder = new AdsViewHolder(ads);
                break;
        }

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) {
        lastItemPosition = i;
        switch (holder.getItemViewType()) {
            case VIEW_TYPE_LOADING:
                LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
                loadingViewHolder.progressBar.start();
                break;
            case VIEW_TYPE_MEDIA:
                final SearchViewHolder viewHolder = (SearchViewHolder) holder;
                final Search ci = (Search)items.get(i);
                viewHolder.bindTo(ci);
                break;
            case VIEW_TYPE_AD:
                final AdsViewHolder adsViewHolder = (AdsViewHolder) holder;
                NativeAd nativeAd = (NativeAd)items.get(i);
                adsViewHolder.bind(nativeAd);
                break;
        }
    }


    private static class LoadingViewHolder extends RecyclerView.ViewHolder {
        private RotateLoading progressBar;
        private LoadingViewHolder(View itemView) {
            super(itemView);
            progressBar = itemView.findViewById(R.id.rotateloading);
        }

    }

    public void setLoaded() {
        isLoading = false;
    }

    public interface SearchClickListener {
        void onClick(Search search);
        void requestAds(int position);
    }
}

Seriously any help will be greatly appreciated.认真的任何帮助将不胜感激。

Due to the character limit, I'm posting my viewHolder code here as a comment.由于字数限制,我将我的 viewHolder 代码作为评论发布在这里。

ArticleViewHolder:文章查看持有人:

public class ArticleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, LocalMessageCallback {


    private Articles articles;
    private TextView title,interest,time,source,content;
    private LinearLayout revealView;
    private ImageView thumbnail,pin,source_link;
    private Animation alphaAnimation;
    private float pixelDensity;
    private boolean flag = false;
    private RelativeLayout revealLayout,layoutButtons;
    private ArticleListener articleListener;
    private CardView cardView;
    private String pin_action = "add";

    public ArticleViewHolder(View view, ArticleListener articleListener) {
        super(view);
        this.articleListener = articleListener;
        pixelDensity = App.getContext().getResources().getDisplayMetrics().density;
        alphaAnimation = AnimationUtils.loadAnimation(App.getContext(), R.anim.alpha_anim);
        LocalMessageManager.getInstance().addListener(this);

        FrameLayout source_holder = view.findViewById(R.id.source_holder);
        cardView = view.findViewById(R.id.card_view);
        source_link = view.findViewById(R.id.source_link);
        revealLayout = view.findViewById(R.id.revealLayout);
        revealView = view.findViewById(R.id.revealView);
        layoutButtons = view.findViewById(R.id.layoutButtons);
        title = view.findViewById(R.id.title);
        content = view.findViewById(R.id.content);
        interest = view.findViewById(R.id.interest);
        thumbnail = view.findViewById(R.id.thumbnail);
        time = view.findViewById(R.id.time);
        source = view.findViewById(R.id.source);
        ImageView reveal = view.findViewById(R.id.reveal);
        ImageView close = view.findViewById(R.id.close);
        pin = view.findViewById(R.id.pin);
        ImageView share = view.findViewById(R.id.share);

        reveal.setOnClickListener(this);
        close.setOnClickListener(this);
        pin.setOnClickListener(this);
        share.setOnClickListener(this);
        title.setOnClickListener(this);
        content.setOnClickListener(this);
        thumbnail.setOnClickListener(this);
        source_holder.setOnClickListener(this);
    }

    public void bindTo(Articles articles) {
        this.articles = articles;
        title.setText(articles.getTitle());
        content.setText(articles.getContent().replace("\n", " ").replace("\r", " "));
        interest.setText(articles.getInterest());
        //Log.e("thumbnail",String.valueOf(articles.getThumbnail()));
        if(SharedPrefernces.get_feed_images_show()) {
            thumbnail.setVisibility(View.VISIBLE);
            ImageLoader.loadImage(thumbnail, articles.getThumbnail());
        }else{
            thumbnail.setVisibility(View.GONE);
        }
        time.setText(TimUtil.timeAgo(articles.getTimeStamp()));
        String _source = articles.getSource();
        source.setText(_source.substring(0,1).toUpperCase() + _source.substring(1).toLowerCase());
        if(articleListener.IsPinned(articles)){
            set_pin_view(true);
            pin_action = App.getContext().getResources().getString(R.string.remove_pin);
        }else{
            set_pin_view(false);
            pin_action = App.getContext().getResources().getString(R.string.add_pin);
        }

        if(flag){
            revealView.setVisibility(View.VISIBLE);
            layoutButtons.setVisibility(View.VISIBLE);
        }else{
            revealView.setVisibility(View.GONE);
            layoutButtons.setVisibility(View.GONE);
        }
        if(articleListener.isSingleFeedsActivity()){
            source_link.setVisibility(View.GONE);
        }else{
            source_link.setVisibility(View.VISIBLE);
        }

        if(!SharedPrefernces.getUseNightMode()){
            cardView.setCardBackgroundColor(App.getContext().getResources().getColor(R.color.material_grey_100));
        }
    }

    private void set_pin_view(boolean isPinned){
        Drawable mDrawable;
        if(!isPinned){
            mDrawable = ContextCompat.getDrawable(App.getContext(),R.drawable.pin_outline);
            mDrawable.setColorFilter(new
                    PorterDuffColorFilter(App.getContext().getResources().getColor(R.color.material_grey_200), PorterDuff.Mode.SRC_IN));
        }else{
            mDrawable = ContextCompat.getDrawable(App.getContext(),R.drawable.pin_outline);
            mDrawable.setColorFilter(new
                    PorterDuffColorFilter(App.getContext().getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_IN));
        }
        pin.setImageDrawable(mDrawable);
    }

    @Override
    public void onClick(View view) {
        LocalMessageManager.getInstance().send(R.id.hide_reveal_layout,articles.getId());
        if (articleListener != null) {
            if(view.getId() == R.id.reveal || view.getId() == R.id.close){
                revealLayout();
            }else if(view.getId() == R.id.source_holder){
                articleListener.loadSingleFeedsActivity(articles);
            }else if(view.getId() == R.id.pin){
                articleListener.OnPinClick(articles,pin_action);
                if(pin_action.equalsIgnoreCase(App.getContext().getResources().getString(R.string.add_pin))){
                    pin_action = App.getContext().getResources().getString(R.string.remove_pin);
                    set_pin_view(true);
                }else{
                    pin_action = App.getContext().getResources().getString(R.string.add_pin);
                    set_pin_view(false);
                }
                revealLayout();
            }else if(view.getId() == R.id.share){
                articleListener.OnShareClick(articles);
                revealLayout();
            }else  if(view.getId() == R.id.title || view.getId() == R.id.thumbnail|| view.getId() == R.id.content) {
                articleListener.OnItemClick(articles);
            }
        }
    }

    private void revealLayout() {

        /*
         MARGIN_RIGHT = 16;
         FAB_BUTTON_RADIUS = 28;
         */
        boolean isAttachedToWindow = ViewCompat.isAttachedToWindow(revealView);
        if (isAttachedToWindow) {
            int x = revealLayout.getRight();
            int y = revealLayout.getBottom();
            x -= ((28 * pixelDensity) + (16 * pixelDensity));

            int hypotenuse = (int) Math.hypot(revealLayout.getWidth(), revealLayout.getHeight());

            if (!flag) {
                RelativeLayout.LayoutParams parameters = (RelativeLayout.LayoutParams)
                        revealView.getLayoutParams();
                parameters.height = revealLayout.getHeight();
                revealView.setLayoutParams(parameters);

                Animator anim = ViewAnimationUtils.createCircularReveal(revealView, x, y, 0, hypotenuse);
                anim.setDuration(200);

                anim.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animator) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animator) {
                        layoutButtons.setVisibility(View.VISIBLE);
                        layoutButtons.startAnimation(alphaAnimation);
                    }

                    @Override
                    public void onAnimationCancel(Animator animator) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animator) {

                    }
                });

                revealView.setVisibility(View.VISIBLE);
                anim.start();

                flag = true;
            } else {
                Animator anim = ViewAnimationUtils.createCircularReveal(revealView, x, y, hypotenuse, 0);
                anim.setDuration(200);

                anim.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animator) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animator) {
                        revealView.setVisibility(View.GONE);
                        layoutButtons.setVisibility(View.GONE);
                    }

                    @Override
                    public void onAnimationCancel(Animator animator) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animator) {

                    }
                });

                anim.start();
                flag = false;
            }
        }
    }

    @Override
    public void handleMessage(@NonNull LocalMessage localMessage) {
        switch (localMessage.getId()){
            case R.id.hide_reveal_layout:
                int id = localMessage.getArg1();
                if(flag && id != articles.getId()){
                    revealLayout();
                }
                break;
            case R.id.recyclerview_scroll:
                if(flag){
                    revealLayout();
                }
                break;

        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM