Android 底部带有Progressbar的无尽回收视图

Android 底部带有Progressbar的无尽回收视图,android,android-recyclerview,Android,Android Recyclerview,我想有一个recyclerview来加载更多的滚动数据。它可以完美地加载更多数据。然后我扩展了代码,在末尾显示progressbar,以显示加载。但它不能正常工作。它一次显示两个多progressbar,而且我的加载数据不正确。在这里,我实现了我的代码。请帮帮我 MainActivity.java public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; MyAdapter adapter;

我想有一个recyclerview来加载更多的滚动数据。它可以完美地加载更多数据。然后我扩展了代码,在末尾显示progressbar,以显示加载。但它不能正常工作。它一次显示两个多progressbar,而且我的加载数据不正确。在这里,我实现了我的代码。请帮帮我

MainActivity.java

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;
MyAdapter adapter;
final ArrayList<String > data = new ArrayList<>();
int end=20;
int start=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    LinearLayoutManager lm = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(lm);

    adapter = new MyAdapter(data);
    recyclerView.setAdapter(adapter);

    load_data();

    recyclerView.setOnScrollListener(new EndLessScroll(lm) {
        @Override
        protected void loadMore(int current_page) {

                start = end + 1;
                end = end + 10;
                load_data();

        }
    });
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}

private void load_data() {
    Handler handler = new Handler();
    data.add(null);
    adapter.notifyItemInserted(data.size()-1);
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            data.remove(data.size() - 1);
            adapter.notifyItemRemoved(data.size());
            //wait
            for (int i = start; i <= end; i++) {
                data.add("Item-" + i);
                adapter.notifyItemInserted(data.size());
            }
            EndLessScroll.setLoaded();
        }
    },2000);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
   }
}
/**
 * Created by nteam on 13/10/15.
 */
public class MyAdapter extends   RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<String> data;
final int VIEW_ITEM=1;
final int VIEW_PROG=0;

public  MyAdapter(ArrayList<String> data){
    this.data = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder vh=null;
    if(viewType == VIEW_ITEM){
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.data_card,parent,false);
        vh = new DataViewHolder(view);
    }else{
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.progress_indicator,parent,false);
        vh = new ProgressViewHolder(view);
    }
    return vh;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if(holder instanceof DataViewHolder) {
        ((DataViewHolder) holder).title.setText(data.get(position));
    }else{
        ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
    }
}

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

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

public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView title;
    public ViewHolder(View itemView) {
        super(itemView);

        title = (TextView) itemView.findViewById(R.id.title);
    }
}

public class DataViewHolder extends RecyclerView.ViewHolder{
    public TextView title;
    public DataViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.title);
    }
}

public class ProgressViewHolder extends RecyclerView.ViewHolder{
    public ProgressBar progressBar;

    public ProgressViewHolder(View itemView) {
        super(itemView);
        progressBar = (ProgressBar) itemView.findViewById(R.id.progress1);
    }
}
/**
 * Created by nteam on 13/10/15.
 */
public abstract class EndLessScroll extends RecyclerView.OnScrollListener {
    public static String TAG = EndLessScroll.class.getSimpleName();

    private int prevTotal = 0;
    public static boolean isLoading = true;
    private int visibleThresold = 10;
    int firstVisisbleItem,visibleItemCount,totalItemCount;

    private int current_page=1;
    private LinearLayoutManager linearLayoutManager;

    public EndLessScroll(LinearLayoutManager linearLayoutManager){
        this.linearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = linearLayoutManager.getItemCount();
        firstVisisbleItem = linearLayoutManager.findFirstVisibleItemPosition();

        if(isLoading){
            if(totalItemCount>prevTotal){
                isLoading=false;
                prevTotal = totalItemCount;
            }

        }else if(!isLoading && (totalItemCount-visibleItemCount)<= (firstVisisbleItem+visibleThresold)) {
            //end reached

            current_page++;
            loadMore(current_page);
            isLoading = true;
        }
    }

    public static void setLoaded(){
        isLoading=false;
    }
    protected abstract void loadMore(int current_page);
}
public类MainActivity扩展了AppCompatActivity{
回收视图回收视图;
MyAdapter适配器;
最终ArrayList数据=新ArrayList();
int end=20;
int start=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
recyclerView=(recyclerView)findViewById(R.id.recyclerView);
LinearLayoutManager lm=新的LinearLayoutManager(本);
recyclerView.setLayoutManager(lm);
适配器=新的MyAdapter(数据);
recyclerView.setAdapter(适配器);
加载_数据();
recyclerView.setOnScrollListener(新EndLessScroll(lm){
@凌驾
受保护的void loadMore(int当前页面){
开始=结束+1;
结束=结束+10;
加载_数据();
}
});
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Snackbar.make(查看“替换为您自己的操作”,Snackbar.LENGTH\u LONG)
.setAction(“Action”,null).show();
}
});
}
私有无效加载_数据(){
Handler=newhandler();
data.add(空);
adapter.notifyItemInserted(data.size()-1);
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
data.remove(data.size()-1);
adapter.notifyItemRemoved(data.size());
//等等
for(int i=开始;i总计){
isLoading=false;
prevTotal=totalItemCount;
}

}否则如果(!isLoading&&(totalItemCount VisibleTimeCount)我还没有实际运行代码,但至少这行代码:

current_page++;
loadMore(current_page);
isLoading = true;
应该是:

isLoading = true;
current_page++;
loadMore(current_page);
当然,这一定会弄乱进度条和项目,因为可以同时启动多个加载