RecyclerView不滚动到upword显示以前的项目

时间:2017-01-09 05:35:37

标签: android json android-recyclerview offset android-scrollview

我在使用recyclelerview中的偏移量解析数据时遇到问题。此刻,我能够显示前30个项目的偏移0.然后我检测到滚动到达列表项目的末尾,然后再次服务电话,但这次我无法向上滚动查看我以前的项目,每次有一组30个新项目,但没有以前的项目。我可以使用任何第三部分lib来解决这个问题吗?

private boolean loading = true;
int pastVisiblesItems, visibleItemCount, totalItemCount,firstVisibleInListview;

private RecyclerView unitListView;
LinearLayoutManager mLayoutManager;
private NumberOfUnitsAdapter unitsAdapter;
private List<UnitsModel> unitsModelList;
private SessionManager sessionManager;

public static final String KEY_TOKEN = "token";
private String token;

 int offSet = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_number_of_units);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    sessionManager = new SessionManager(getApplicationContext());
    unitListView = (RecyclerView) findViewById(R.id.unitlist);
    unitsModelList = new ArrayList<>();

    unitListView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    unitListView.setLayoutManager( mLayoutManager );
    unitListView.setItemAnimator(new DefaultItemAnimator());
    unitsAdapter = new NumberOfUnitsAdapter(getApplicationContext(),unitsModelList,unitListView);
    unitListView.setAdapter(unitsAdapter);

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

            unitListView.getLayoutManager().canScrollVertically();
            if(dy> 0)
            {
                 visibleItemCount = mLayoutManager.getChildCount();
                 totalItemCount = mLayoutManager.getItemCount();
                 pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

                if (loading)
                {
                    if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount)
                    {
                        loading = false;
                        Log.v("...", "Last Item Wow !");
                        Toast.makeText(getApplicationContext(), "Last Station Agaya hai Bahi",
                                Toast.LENGTH_LONG).show();
                        //Do pagination.. i.e. fetch new data
                        callUnitAPI();
                        loading = true;
                    }
                }
            }
        }
    });

    callUnitAPI();

}

private void callUnitAPI() {

    Map<String, String> jsonParams = new HashMap<>();
    HashMap<String, String> user = sessionManager.getUserDetails();
    token = user.get(SessionManager.TOKEN);
    jsonParams.put(KEY_TOKEN, token);
   String url = createGetWithParams(Constant.BASE_URL+UNITS_API+offSet,jsonParams);
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                private String unitName ,unitNumber;
                private int unitId,unitBedroom,unitBathroom,unitBuildArea,unitPlotArea;
                private float unitPrice;
                @Override
                public void onResponse(JSONObject response) {
                    unitsModelList.clear();
                    if (response.length() > 0) {

                        try {

                            JSONArray ownersData = response.getJSONArray("units");
                            for (int i = 0; i < ownersData.length(); i++) {
                                JSONObject jsonObj = ownersData.getJSONObject(i);
                                unitName = jsonObj.getString("Jhon");
                                unitNumber = jsonObj.getString("unitq");
                                unitId = Integer.parseInt(jsonObj.getString("iden"));
                                unitPlotArea = Integer.parseInt(jsonObj.getString("plan"));
                                unitBuildArea = Integer.parseInt(jsonObj.getString("build"));
                                unitBedroom = Integer.parseInt(jsonObj.getString("bed"));
                                unitBathroom = Integer.parseInt(jsonObj.getString("bath"));
                                unitPrice = BigDecimal.valueOf(jsonObj.getDouble("pro")).floatValue();

                                UnitsModel numUnitModel = new UnitsModel();
                                numUnitModel.setUnitName(unitName);
                                numUnitModel.setUnitNumber(unitNumber);
                                numUnitModel.setUnitId(unitId);
                                numUnitModel.setUnitPlotArea(unitArea);
                                numUnitModel.setUnitBuildArea(uniBArea);
                                numUnitModel.setUnitBedroom(unitBedroom);
                                numUnitModel.setUnitBathroom(unitBathroom);
                                numUnitModel.setUnitPrice(unitPrice);
                                unitsModelList.add(numUnitModel);
                                if(unitId >= offSet)
                                    offSet = unitId;

                            }


                        } catch (Exception e) {
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(),
                                    "Error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        }

                        unitsAdapter.addUnitsModels(unitsModelList);
                        unitsAdapter.notifyDataSetChanged();
                    }
                }

            },

            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError response) {
                    NetworkResponse networkResponse = response.networkResponse;
                    if (networkResponse != null && networkResponse.statusCode == 401) {
                        Toast.makeText(getApplicationContext(), "Token Expire", Toast.LENGTH_LONG).show();
                    }

                }

            });


    AppController.getInstance().addToRequestQueue(request);

}

以下是适配器已更新

  public class NumberOfUnitsAdapter extends RecyclerView.Adapter {

    private final int VIEW_ITEM = 1;
    private final int VIEW_PROG = 0;
    private Activity activity;

    private List<UnitsModel> unitsModelList;

    private OnLoadMoreListener onLoadMoreListener;
    Context mContext;
    public NumberOfUnitsAdapter( Context mContext, List<UnitsModel> unitsModelList,RecyclerView recyclerView) {
        this.mContext = mContext;
        this.unitsModelList = unitsModelList;

    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                      int viewType) {
        RecyclerView.ViewHolder vh;
        if (viewType == VIEW_ITEM) {
            View v = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.numberofunits_items, parent, false);

            vh = new NumberOfUnitsHolder(v);
        } else {
            View v = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.progress_item, parent, false);

            vh = new ProgressViewHolder(v);
        }
        return vh;
    }


    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        UnitsModel unitsModel= unitsModelList.get(position);
        if (holder instanceof NumberOfUnitsHolder) {
            NumberOfUnitsHolder vholder = (NumberOfUnitsHolder) holder;
            vholder.unitName.setText(unitsModel.getUnitNumber());
            vholder.manageBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Bundle bundle = new Bundle();
                    bundle.putString("UNIT_NAME", unitsModelList.get(position).getUnitName());
                    bundle.putString("UNIT_NUMB", unitsModelList.get(position).getUnitNumber());
                    bundle.putFloat("UNIT_PRICE", unitsModelList.get(position).getUnitPrice());
                    bundle.putInt("UNIT_PLOT", unitsModelList.get(position).getUnitPlotArea());
                    bundle.putInt("UNIT_BUILD", unitsModelList.get(position).getUnitBuildArea());
                    bundle.putInt("UNIT_BATH", unitsModelList.get(position).getUnitBathroom());
                    bundle.putInt("UNIT_BED", unitsModelList.get(position).getUnitBedroom());
                    bundle.putInt("UNIT_ID", unitsModelList.get(position).getUnitId());

                    Intent itemClick = new Intent(mContext, NumOfUnitDetail.class);
                    itemClick.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    itemClick.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    itemClick.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    itemClick.putExtras(bundle);
                    mContext.startActivity(itemClick);

                }
            });
        }

        else {
            ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
        }
  }

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


    }

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

    public void addUnitsModels(List<UnitsModel> unitsModelList) {
        this.unitsModelList.addAll(unitsModelList);
    }

    public class NumberOfUnitsHolder extends RecyclerView.ViewHolder {
        public final View mView;
        public final TextView unitName;
        public final Button historyBtn;
        public final Button manageBtn;
        public NumOwnerModel mItem;

        public NumberOfUnitsHolder(View view) {
            super(view);
            mView = view;
            unitName = (TextView)view.findViewById(R.id.unitNo);
            historyBtn= (Button) view.findViewById(R.id.historyBtn);
            manageBtn = (Button) view.findViewById(R.id.manageBtn);

        }
    }


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

        public ProgressViewHolder(View v) {
            super(v);
            progressBar = (ProgressBar) v.findViewById(R.id.progressBar1);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

当您执行callUnitAPI时,您正在设置一个带有新列表的新适配器。 相反,您应该附加到现有适配器中的旧列表并执行notifyDataSetChanged

例如,在unitsAdapter添加方法:

public void addUnitsModels(ArrayList<UnitsModel> list){
this.unitsModeList.addAll(list);
}

callUnitApi()

unitsAdapter.addUnitsModels(unitsModelList);
unitsAdapter.notifyDataSetChanged();

而不是创建和设置新的适配器。 此外,不是使用类变量将项添加到列表并每次清除,而是在响应回调中创建临时列表。

 //unitsModelList.clear();
 ArrayList<>temp = new ArrayList<UnitsModel>();
 // setting object and adding to list
 unitsAdapter.addUnitsModels(temp);
 unitsAdapter.notifyDataSetChanged();
相关问题