从Web服务

时间:2016-02-17 10:45:09

标签: android-recyclerview

我在刷卡刷新布局中使用Recycler视图作为单个子项。最初,在从Web服务向上和向下加载数据时,它不能平滑滚动。但是在第一次滚动之后,它会顺利滚动。如何让它在第一次滚动时顺畅滚动。

    private RecyclerView newsFeedList;
         newsFeedList = (RecyclerView) view.findViewById(R.id.rv_feed_list);
         newsFeedList.setHasFixedSize(true);
                LinearLayoutManager llm = new LinearLayoutManager(getActivity());
                llm.setOrientation(LinearLayoutManager.VERTICAL);
                newsFeedList.setLayoutManager(llm);

                newsFeedAdapter = new NewsFeedAdapter(getActivity(), new ArrayList<NewsFeedParser.NewsFeed>(), newsFeedList);
                newsFeedList.setAdapter(newsFeedAdapter);

并在通过调用以下方法从Web服务获得响应后更新了recyclerview:

    private void parseDataToNewsFeed(String response, boolean isLoadMore) {
            Gson gson = new Gson();
            NewsFeedParser newsFeedParser = gson.fromJson(response, NewsFeedParser.class);
            if (newsFeedParser.data != null && newsFeedParser.data.size() > 0) {
                if (isLoadMore) {
                    newsFeedAdapter.removeProgress(newsFeedAdapter.getItemCount());
                    newsFeedAdapter.addList(newsFeedParser.data);
                } else {
                    currentPageCount = 1;
                    newsFeedAdapter.updateList(newsFeedParser.data);
                }
            } else {
                newsFeedAdapter.updateList(newsFeedParser.data);
                txtNoResult.setText(getString(R.string.no_clubs_socities_subscribed));
                txtNoResult.setVisibility(View.VISIBLE);
            }
        }

Adaper课程:

    public class NewsFeedAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
                private final DisplayImageOptions options;
                private Context context;
                private ArrayList<NewsFeedParser.NewsFeed> itemList;
                private int lastVisibleItem, totalItemCount, visibleThreshold = 2;
                private boolean loading;
                public OnLoadMoreListener onLoadMoreListener;
                private OnItemClickListener itemClickListener;
                //    private ImageLoader mImageLoader;
                private final int VIEW_ITEM = 1;
                private final int VIEW_PROG = 0;
                private long mLastClickTimeListViewItem = 0;

                public NewsFeedAdapter(Context context, ArrayList<NewsFeedParser.NewsFeed> itemList, RecyclerView recyclerView) {
                    this.context = context;
                    this.itemList = itemList;

                    options = new DisplayImageOptions.Builder()
                            .showImageOnLoading(R.drawable.ic_default_news)
                            .showImageForEmptyUri(R.drawable.ic_default_news)
                            .showImageOnFail(R.drawable.ic_default_news)
                            .cacheInMemory(true)
                            .cacheOnDisk(true)
                            .considerExifParams(true)
                            .bitmapConfig(Bitmap.Config.RGB_565)
                            .build();

                    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
                        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                            @Override
                            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                                super.onScrolled(recyclerView, dx, dy);
                                totalItemCount = linearLayoutManager.getItemCount();
                                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                                if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                                    if (onLoadMoreListener != null) {
                                        onLoadMoreListener.onLoadMore();
                                    }
                                    loading = true;
                                }
                            }
                        });
                    }
                }

                @Override
                public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    RecyclerView.ViewHolder vh;
                    if (viewType == VIEW_ITEM) {
                        View itemView = LayoutInflater.from(context).inflate(R.layout.fragment_news_feed_trending_list_item, parent, false);
                        vh = new NewsFeedViewHolder(itemView);
                    } else {
                        View progView = LayoutInflater.from(context).inflate(R.layout.view_refresh_footer, parent, false);
                        vh = new ProgressViewHolder(progView);
                    }
                    return vh;
                }

                @Override
                public int getItemViewType(int position) {
                    return itemList.get(position) != null ? VIEW_ITEM : VIEW_PROG;
                }

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

                @Override
                public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
                    if (holder instanceof NewsFeedViewHolder) {
                        final NewsFeedParser.NewsFeed singleItem = itemList.get(position);
                        ((NewsFeedViewHolder) holder).txtNews.setText(Html.fromHtml(singleItem.title));
                        ((NewsFeedViewHolder) holder).txtDays.setText(DateConversion.getStatusTiming(context, singleItem.modified));

                        ((NewsFeedViewHolder) holder).imgNewsPhoto.setImageResource(R.drawable.ic_default_news);
                        if (singleItem.featured_image != null) {
                            if (singleItem.featured_image.attachment_meta != null) {
                                if (singleItem.featured_image.attachment_meta.sizes != null) {
                                    if (singleItem.featured_image.attachment_meta.sizes.thumbnail != null) {
                                        if (!TextUtils.isNullOrEmpty(singleItem.featured_image.attachment_meta.sizes.thumbnail.url)) {
                                            ImageLoader.getInstance().displayImage(singleItem.featured_image.attachment_meta.sizes.thumbnail.url, ((NewsFeedViewHolder) holder).imgNewsPhoto, options);
                                        } else {
                                            if (!TextUtils.isNullOrEmpty(singleItem.featured_image.source)) {
                                                ImageLoader.getInstance().displayImage(singleItem.featured_image.source, ((NewsFeedViewHolder) holder).imgNewsPhoto, options);
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        if (singleItem.read_status == 0) {
                            ((NewsFeedViewHolder) holder).rlFeedItem.setBackgroundColor(ContextCompat.getColor(context, R.color.clr_news_feed_item_bg));
                        } else {
                            ((NewsFeedViewHolder) holder).rlFeedItem.setBackgroundColor(ContextCompat.getColor(context, R.color.transparent));
                        }

                        holder.itemView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (SystemClock.elapsedRealtime() - mLastClickTimeListViewItem < 1000) {
                                    return;
                                }
                                mLastClickTimeListViewItem = SystemClock.elapsedRealtime();
                                if (itemClickListener != null) {
                                    itemClickListener.onItemClick(singleItem);
                                    singleItem.read_status = 1;
                                    notifyItemChanged(position);
                                }
                            }
                        });
                    } else {
                        ((ProgressViewHolder) holder).progressBar.setLinearProgress(true);
                    }
                }

                public void addList(ArrayList<NewsFeedParser.NewsFeed> items) {
                    if (items == null) {
                        this.itemList.add(null);
                    } else {
                        for (NewsFeedParser.NewsFeed item : items) {
                            this.itemList.add(item);
                        }
                    }
                    notifyDataSetChanged();
                }

                public void updateList(ArrayList<NewsFeedParser.NewsFeed> items) {
                    if (items != null) {
                        this.itemList = items;
                    }
                    notifyDataSetChanged();
                }

                public void removeProgress(int itemCount) {
                    this.itemList.remove(itemCount - 1);
                    notifyItemRemoved(itemCount);
                }

                public static class NewsFeedViewHolder extends RecyclerView.ViewHolder {

                    USUTextView txtNews, txtDays;
                    ImageView imgNewsPhoto;
                    RelativeLayout rlFeedItem;

                    public NewsFeedViewHolder(View itemView) {
                        super(itemView);
                        txtNews = (USUTextView) itemView.findViewById(R.id.txt_news);
                        txtDays = (USUTextView) itemView.findViewById(R.id.txt_days);
                        imgNewsPhoto = (ImageView) itemView.findViewById(R.id.img_news_photo);
                        rlFeedItem = (RelativeLayout) itemView.findViewById(R.id.rl_feed_list_item);
                    }
                }

                public static class ProgressViewHolder extends RecyclerView.ViewHolder {
                    public ProgressWheel progressBar;

                    public ProgressViewHolder(View progView) {
                        super(progView);
                        progressBar = (ProgressWheel) progView.findViewById(R.id.progress_bar);
                    }
                }

                public void setLoaded() {
                    loading = false;
                }

                public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
                    this.onLoadMoreListener = onLoadMoreListener;
                }

                public interface OnLoadMoreListener {
                    void onLoadMore();
                }

                public void setOnItemClickListener(OnItemClickListener recyclerClickListener) {
                    this.itemClickListener = recyclerClickListener;
                }

                public interface OnItemClickListener {
                    void onItemClick(NewsFeedParser.NewsFeed item);
                }
            }

请建议我任何想法.....

0 个答案:

没有答案