Android 带有Asynctask的无尽RecyclerView

Android 带有Asynctask的无尽RecyclerView,android,android-asynctask,android-recyclerview,notifydatasetchanged,Android,Android Asynctask,Android Recyclerview,Notifydatasetchanged,我有一个应用程序,它有无尽的recyclerView(当到达列表末尾的某个偏移量时,我从recyclerView适配器调用接口方法)。 回收视图适配器 public SearchResultAdapter(ArrayList<String> suggestions) { this.suggestions = suggestions; } public SearchResultAdapter(ArrayList<Word> results, RecyclerVi

我有一个应用程序,它有无尽的recyclerView(当到达列表末尾的某个偏移量时,我从recyclerView适配器调用接口方法)。
回收视图适配器

public SearchResultAdapter(ArrayList<String> suggestions) {
    this.suggestions = suggestions;
}

public SearchResultAdapter(ArrayList<Word> results, RecyclerView recyclerView) {
    words = results;
    this.recyclerView = recyclerView;
    final LinearLayoutManager mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (dy > 0) //check for scroll down
            {
                visibleItemCount = mLayoutManager.getChildCount();
                totalItemCount = mLayoutManager.getItemCount();
                pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();
                if (loading) {
                    if ((visibleItemCount + pastVisiblesItems + 14) >= totalItemCount) {
                        if (mOnLoadMoreListener != null)
                            mOnLoadMoreListener.onLoadMore();
                        loading = false;
                    }
                }
            }
        }
    });
}

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

public void setOnSearchResultClickListener(OnSearchResultClickListener mClickListener) {
    this.mClickListener = mClickListener;
}

public void setLoading() {
    loading = true;
}

@Override
public int getItemViewType(int position) {
   if(words !=null)
       return words.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
    else 
       return VIEW_TYPE_SUGGESTION;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);
    if (suggestions != null) {
        View view = inflater.inflate(R.layout.activity_suggestion_item, parent, false);
        return new SuggestionsViewHolder(view);
    }
    if (words != null) {
        // Inflate the custom layout
        if (viewType == VIEW_TYPE_ITEM) {
            View view = inflater.inflate(R.layout.activity_main_search_result_item, parent, false);
            return new WordViewHolder(view);
        }
        //inflate loading
        else if (viewType == VIEW_TYPE_LOADING) {
            View view = inflater.inflate(R.layout.activity_main_search_result_loading, parent, false);
            return new LoadingViewHolder(view);
        }
    }
    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    Word word=null;
    if(words !=null)
    word = words.get(position);
    if (viewHolder instanceof LoadingViewHolder) {
        LoadingViewHolder holder = (LoadingViewHolder) viewHolder;
        holder.progressBar.setIndeterminate(true);
    } else if (viewHolder instanceof WordViewHolder) {
        WordViewHolder holder = (WordViewHolder) viewHolder;
        holder.wordTextView.setText(word.getTitle());
        holder.sourceTextView.setText(word.getSource().getTitle());
    } else if (viewHolder instanceof SuggestionsViewHolder){
        SuggestionsViewHolder holder = (SuggestionsViewHolder) viewHolder;
        holder.wordTextView.setText(suggestions.get(position));
    }
    //wordTextView.loadDataWithBaseURL(null,result.toString(), "text/html", "utf-8", null);
}

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

public static class LoadingViewHolder extends RecyclerView.ViewHolder {
    public ProgressBar progressBar;
    public LoadingViewHolder(View itemView) {
        super(itemView);
        progressBar = (ProgressBar) itemView.findViewById(R.id.search_item_progressbar);
    }
}

public class WordViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    // public TextView titleTextView;
    private CustomTextView wordTextView;
    private CustomTextView sourceTextView;
    private CardView searchResultItem;
    public WordViewHolder(View itemView) {
        super(itemView);
        searchResultItem = (CardView) itemView.findViewById(R.id.search_result_item_cardview);
        wordTextView = (CustomTextView) itemView.findViewById(R.id.search_result_item_body);
        sourceTextView = (CustomTextView) itemView.findViewById(R.id.search_result_source);
        searchResultItem.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
       mClickListener.onSearchResultClick(getAdapterPosition());
    }
}

public class SuggestionsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    // public TextView titleTextView;
    private CustomTextView wordTextView;
    private CardView suggestionItem;
    public SuggestionsViewHolder(View itemView) {
        super(itemView);
        suggestionItem = (CardView) itemView.findViewById(R.id.suggestion_item_cardview);
        wordTextView = (CustomTextView) itemView.findViewById(R.id.activity_suggestion_title);
        wordTextView.setTypeface(MainActivity.custom_font);
        suggestionItem.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
            mClickListener.onSuggestionClick(suggestions.get(getAdapterPosition()));
    }
}
@Override
public int getItemViewType(int position) {
   if(words !=null)
       return words.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
    else 
       return VIEW_TYPE_SUGGESTION;
}
publicsearchResultAdapter(ArrayList建议){
这个.建议=建议;
}
公共SearchResultAdapter(ArrayList结果,RecyclerView RecyclerView){
文字=结果;
this.recyclerView=recyclerView;
最终LinearLayoutManager mLayoutManager=(LinearLayoutManager)recyclerView.getLayoutManager();
recyclerView.addOnScrollListener(新的recyclerView.OnScrollListener(){
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
如果(dy>0)//检查是否向下滚动
{
visibleItemCount=mLayoutManager.getChildCount();
totalItemCount=mLayoutManager.getItemCount();
pastVisiblesItems=mLayoutManager.findFirstVisibleItemPosition();
如果(装载){
如果((visibleItemCount+pastVisiblesItems+14)>=totalItemCount){
if(mOnLoadMoreListener!=null)
mOnLoadMoreListener.onLoadMore();
加载=假;
}
}
}
}
});
}
public void setOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener){
this.mOnLoadMoreListener=mOnLoadMoreListener;
}
公共无效设置SearchResultClickListener(OnSearchResultClickListener mClickListener){
this.mClickListener=mClickListener;
}
公共无效设置加载(){
加载=真;
}
@凌驾
public int getItemViewType(int位置){
如果(字!=null)
返回words.get(position)=null?查看类型\u加载:查看类型\u项;
其他的
返回视图\类型\建议;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
Context=parent.getContext();
LayoutFlater充气机=LayoutFlater.from(上下文);
if(建议!=null){
视图=充气机。充气(R.layout.activity\u suggestion\u项,父项,false);
返回新的SuggestionViewHolder(视图);
}
如果(字!=null){
//对自定义布局进行充气
if(视图类型==视图类型项目){
视图=充气机。充气(R.layout.activity\u main\u search\u result\u item,parent,false);
返回新的WordViewHolder(视图);
}
//充气装载
else if(viewType==视图类型加载){
视图=充气机。充气(R.layout.activity\u main\u search\u result\u loading,parent,false);
返回新的LoadingViewHolder(视图);
}
}
返回null;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder ViewHolder,int位置){
Word=null;
如果(字!=null)
word=words.get(位置);
if(加载viewHolder的viewHolder实例){
LoadingViewHolder=(LoadingViewHolder)viewHolder;
holder.progressBar.SetUndeterminate(真);
}else if(viewHolder实例of WordViewHolder){
WordViewHolder=(WordViewHolder)viewHolder;
holder.wordTextView.setText(word.getTitle());
holder.sourceTextView.setText(word.getSource().getTitle());
}else if(建议的viewHolder实例viewHolder){
SuggestionViewHolder=(SuggestionViewHolder)viewHolder;
holder.wordTextView.setText(建议.get(位置));
}
//wordTextView.loadDataWithBaseURL(null,result.toString(),“text/html”,“utf-8”,null);
}
@凌驾
public int getItemCount(){
返回words==null?(建议==null?0:suggestions.size()):words.size();
}
公共静态类LoadingViewHolder扩展了RecyclerView.ViewHolder{
公共ProgressBar ProgressBar;
公共加载视图持有者(视图项视图){
超级(项目视图);
progressBar=(progressBar)itemView.findViewById(R.id.search\u item\u progressBar);
}
}
公共类WordViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
//公共文本视图titleTextView;
私有自定义文本视图wordTextView;
私有CustomTextView sourceTextView;
private CardView searchResultItem;
公共WordViewHolder(查看项目视图){
超级(项目视图);
searchResultItem=(CardView)itemView.findViewById(R.id.search\u result\u item\u CardView);
wordTextView=(CustomTextView)itemView.findViewById(R.id.search\u result\u item\u body);
sourceTextView=(CustomTextView)itemView.findViewById(R.id.search\u result\u source);
searchResultItem.setOnClickListener(此);
}
@凌驾
公共void onClick(视图){
onSearchResultClick(getAdapterPosition());
}
}
公共类SuggestionViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
//公共文本视图titleTextView;
私有自定义文本视图wordTextView;
private CardView建议项;
公共建议视图持有者(查看项目视图){
超级(项目视图);
suggestionItem=(CardView)itemView.findViewById(R.id.suggestion\u item\u CardView);
wordTextView=(CustomTextView)itemView.findViewById(R.id.activity\u suggestion\u title);
wordTextView.setTypeface(MainActivity.custom_字体);
suggestionItem.setOnClickListener(此);
}
@凌驾
公共void onClick(视图){
mClickListener.onSuggestionClick(suggestions.get(getAdapterPosition());
}
}
@凌驾
public int getItemViewType(int位置){
如果(字!=null)
返回words.get(position)=null?查看类型\u加载:查看类型\u项;
其他的
返回视图\类型\建议;
}
OnLoadMore

 @Override
public void onLoadMore() {
    if (request.getPage() < totalPageAmount) {
        request.nextPage();
        LoadMoreTask task = new LoadMoreTask(request, words, adapter);
        task.execute();
    }
}
@覆盖
public void onLoadMore(){
if(request.getPage() public LoadMoreTask(Request request, ArrayList<Word> words, SearchResultAdapter adapter){
    this.request=request;
    this.words=words;
    this.adapter=adapter;
    this.connection = new Connection(request.getUrl());
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    if(words.get(words.size()-1)!=null){
        words.add(null);
        index = words.size() - 1;
        adapter.notifyItemInserted(index);
    }
}

@Override
protected Void doInBackground(Void... params) {
    connection.connect();
    String result = connection.getStringFromServer();
    Respond respond = new Respond(result);
    if(!request.isDetailed())
        words.addAll(respond.handleSimple());
    return null;
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    connection.disconnect();
    if(index!=0 && words.get(index)==null){
        words.remove(index);
        adapter.notifyItemRemoved(index+1);
    }
    adapter.notifyDataSetChanged();
    adapter.setLoading();
}
@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    connection.disconnect();
    adapter.resetLoading();
    if(index!=0 && words.get(index)==null){
        words.remove(index);
        adapter.notifyItemRemoved(index);
    }
    adapter.notifyItemRangeInserted(index,30);
}