Android 带有Asynctask的无尽RecyclerView
我有一个应用程序,它有无尽的recyclerView(当到达列表末尾的某个偏移量时,我从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
回收视图适配器
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);
}