0

У меня возникла проблема с анализом данных с использованием смещения в recyclerview. На данный момент я могу показать первые 30 элементов со смещением 0. Затем я обнаруживаю, когда прокрутка достигает конца элемента списка, а затем снова вызов службы, но на этот раз я не смог прокручивать предыдущие элементы, каждый раз, когда приходит набор из 30 новых предметов, но нет предыдущих элементов. Могу ли я решить это без использования какой-либо третьей части lib?RecyclerView не прокрутка к восходящему изображению показывает предыдущие элементы

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); 
     } 
    } 
} 

ответ

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(); 
+0

Спасибо, позвольте мне проверить его – Mohtashim

+0

привет Сураджа спасибо за ответ, у меня есть включают класс адаптера, а также, по-прежнему, когда прокрутки вниз и службы называют его обновить новый элемент списка и старый список элементов, не показывая, где предел равен 10 с начальным смещением 0. – Mohtashim

+0

не похоже, что вы внесли изменения из ответа. Это обновленные классы? –