2017-12-04 16 views
1

私はrecyclerviewを実装しており、一度に10個のタスクを読み込みます。すべてのタスクが完了すると、完了したボタンでタスクを削除します。 1つの条件で一番下にスクロールすると、ページに少なくとも1つの未完了のタスクが存在する必要があります。私が10項目全てをクリアすると、アニメーションの読み込みが表示され、何も起こりません。私は、アプリケーションを閉じて、再びタスクを読み込むために再度開く必要があります。Android recyclerviewで1ページずつすべてのアイテムを削除しても、次のデータセットはロードされません。

ページのPaginationActivity、PaginationAdapter、およびスクロールリスナーを実装しました。ページの最後に到達し、読み込むタスクが増えたときはいつでも、ローカルデータベースからデータをロードします。

PaginationActivity.java

public class PaginationActivity extends AppCompatActivity { 

private static final String TAG = "MainActivity"; 

PaginationAdapter adapter; 
LinearLayoutManager linearLayoutManager; 

public static ArrayList<String> reasonsdata = new ArrayList<String>(); 
public static String rslt=""; 
public static String[] reasons; 
public static boolean chk = true; 
public static String payTypeSelected; 
public static String reasonSelected; 
public static HashMap<String, EditText> drivernotesMap = new HashMap<String, EditText>(); 
public static HashMap<String, EditText> paynoteMap = new HashMap<String, EditText>(); 
public static HashMap<String, String> paytypeMap = new HashMap<String, String>(); 


RecyclerView rv; 
ProgressBar progressBar; 

private static final int PAGE_START = 0; 
private boolean isLoading = false; 
private boolean isLastPage = false; 
private int TOTAL_PAGES; 
private int currentPage = PAGE_START; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.pagination_main); 
    fillspinner(); 

    rv = (RecyclerView) findViewById(R.id.main_recycler); 
    progressBar = (ProgressBar) findViewById(R.id.main_progress); 

    adapter = new PaginationAdapter(this); 

    linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); 
    rv.setLayoutManager(linearLayoutManager); 

    rv.setItemAnimator(new DefaultItemAnimator()); 

    rv.setAdapter(adapter); 

    rv.addOnScrollListener(new PaginationScrollListener(linearLayoutManager) { 
     @Override 
     protected void loadMoreItems() { 
      isLoading = true; 
      currentPage += 1; 

      // mocking network delay for API call 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        loadNextPage(); 
       } 
      }, 1000); 
     } 

     @Override 
     public int getTotalPageCount() { 
      return TOTAL_PAGES; 
     } 

     @Override 
     public boolean isLastPage() { 
      return isLastPage; 
     } 

     @Override 
     public boolean isLoading() { 
      return isLoading; 
     } 
    }); 


    // mocking network delay for API call 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      loadFirstPage(); 
     } 
    }, 1000); 

} 

private void fillspinner() { 
    reasonsdata.clear(); 
    try 
    { 
     rslt="START"; 
     CallReasons cr = new CallReasons(); 
     cr.join(); 
     cr.start(); 
     while(rslt=="START") { 
      try { 
       Thread.sleep(10); 
      }catch(Exception ex) { 
      } 
     } 
    } 
    catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    if(rslt == "Success"){ 
     reasonsdata.add("<--- Select Reason --->"); 
     for(int i =0; i< reasons.length;i++){ 
      reasonsdata.add(reasons[i]); 
     } 
    } 
} 

public void loadFirstPage() { 
    Log.d(TAG, "loadFirstPage: "); 
    TOTAL_PAGES = Run.getTotalPages(); 
    //List<Run> runs = Run.createRuns(adapter.getItemCount()); 
    List<Run> runs = Run.createRuns(adapter.getMaxID()); 
    progressBar.setVisibility(View.GONE); 
    adapter.addAll(runs); 

    if (currentPage <= TOTAL_PAGES) adapter.addLoadingFooter(); 
    else isLastPage = true; 
} 

public void loadNextPage() { 
    Log.d(TAG, "loadNextPage: " + currentPage); 
    //List<Run> runs = Run.createRuns(adapter.getItemCount()); 
    List<Run> runs = Run.createRuns(adapter.getMaxID()); 

    adapter.removeLoadingFooter(); 
    isLoading = false; 

    adapter.addAll(runs); 

    if (currentPage != TOTAL_PAGES) adapter.addLoadingFooter(); 
    else isLastPage = true; 
} 

}

PaginationAdapter.java

public class PaginationAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private static final int ITEM = 0; 
    private static final int LOADING = 1; 

    private List<Run> runs = new ArrayList<>(); 
    private Context context; 

    private boolean isLoadingAdded = false; 

    private String cash = "CASH"; 
    private String cheque = "CHEQUE"; 

    SQLiteDatabase db; 
    //PaginationActivity func_call; 

    public PaginationAdapter(Context context) { 
     this.context = context; 
     runs = new ArrayList<>(); 
     //func_call = new PaginationActivity(); 
    } 

    public List<Run> getRuns() { 
     return runs; 
    } 

    public void setRuns(List<Run> runs) { 
     this.runs = runs; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder viewHolder = null; 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

     switch (viewType) { 
      case ITEM: 
       viewHolder = getViewHolder(parent, inflater); 
       break; 
      case LOADING: 
       View v2 = inflater.inflate(R.layout.item_progress, parent, false); 
       viewHolder = new LoadingVH(v2); 
       //viewHolder = getViewHolder(parent, inflater); 
       //func_call.loadNextPage(); 
       break; 
     } 
     return viewHolder; 
    } 

    @NonNull 
    private RecyclerView.ViewHolder getViewHolder(ViewGroup parent, LayoutInflater inflater) { 
     RecyclerView.ViewHolder viewHolder; 
     View v1 = inflater.inflate(R.layout.activity_main, parent, false); 
     viewHolder = new RunVH(v1); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

     final Run run = runs.get(position); 

     switch (getItemViewType(position)) { 
      case ITEM: 
       final RunVH runVH = (RunVH) holder; 
       //adding text areas to show data 
       //Completed task button 
       runVH.btnSave.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         Toast.makeText(context, "Mark as Completed", Toast.LENGTH_LONG).show(); 
            remove(run); 

           } 

          } 
         } catch (Exception ex) { 
          //pbbar.setVisibility(View.GONE); 
          ex.printStackTrace(); 
         } 
        } 
       }); 
       break; 
      case LOADING: 
       break; 
     } 

    } 

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

    //@Override 
    public int getMaxID() { 
     if(runs == null || runs.size() == 0){ 
      return 0; 
     }else{ 
      Run test = runs.get(runs.size()-2); 
      int maxid = (int) test.getProperty(0); 
      return maxid; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return (position == runs.size() - 1 && isLoadingAdded) ? LOADING : ITEM; 
    } 

    public void add(Run run) { 
     runs.add(run); 
     notifyItemInserted(runs.size() - 1); 
    } 

    public void addAll(List<Run> runList) { 
     for (Run run : runList) { 
      add(run); 
     } 
    } 

    public void remove(Run run) { 
     int position = runs.indexOf(run); 
     if (position > -1) { 
      runs.remove(position); 
      notifyItemRemoved(position); 
      notifyItemRangeChanged(position, runs.size()); 
     } 
     /*if(runs.size() < 0){ 
      clear(); 
      func_call.loadNextPage(); 
     }*/ 
    } 

    public void clear() { 
     isLoadingAdded = false; 
     while (getItemCount() > 0) { 
      remove(getItem(0)); 
     } 
    } 

    public boolean isEmpty() { 
     return getItemCount() == 0; 
    } 


    public void addLoadingFooter() { 
     isLoadingAdded = true; 
     add(new Run()); 
    } 

    public void removeLoadingFooter() { 
     isLoadingAdded = false; 

     int position = runs.size() - 1; 
     Run item = getItem(position); 

     if (item != null) { 
      runs.remove(position); 
      notifyItemRemoved(position); 
     } 
    } 

    public Run getItem(int position) { 
     return runs.get(position); 
    } 

    protected class RunVH extends RecyclerView.ViewHolder { 
     private TextView textEsky; 
     private TextView textAdjusted; 
     private TextView textAddress; 
     private TextView textNew; 
     private TextView textTrusted; 
     private TextView textName; 
     private TextView textMobile; 
     private TextView textHome; 
     private TextView textWork; 
     private TextView payType; 
     private EditText textPayNote; 
     private EditText textDeliveryInst; 
     private EditText textDriverNotes; 
     private final Spinner reasons; 
     private RadioGroup rg; 
     private Button btnSave; 
     private CheckBox IsDriverData; 

     public RunVH(View itemView) { 
      super(itemView); 

      textEsky = (TextView) itemView.findViewById(R.id.idEsky); 
      textAdjusted = (TextView) itemView.findViewById(R.id.idAdjusted); 
      textAddress = (TextView) itemView.findViewById(R.id.idAddress); 
      textNew = (TextView) itemView.findViewById(R.id.idNew); 
      textTrusted = (TextView) itemView.findViewById(R.id.idTrusted); 
      textName = (TextView) itemView.findViewById(R.id.idName); 
      textMobile = (TextView) itemView.findViewById(R.id.idMobile); 
      textHome = (TextView) itemView.findViewById(R.id.idHome); 
      textWork = (TextView) itemView.findViewById(R.id.idWork); 
      payType = (TextView) itemView.findViewById(R.id.idPayType); 
      textPayNote = (EditText) itemView.findViewById(R.id.idPayNoteText); 
      textDeliveryInst = (EditText) itemView.findViewById(R.id.idDeliInsText); 
      textDriverNotes = (EditText) itemView.findViewById(R.id.idDriverNotesText); 
      IsDriverData = (CheckBox) itemView.findViewById(R.id.idCheckBox); 
      reasons = (Spinner) itemView.findViewById(R.id.idReason); 
      rg = (RadioGroup) itemView.findViewById(R.id.Radiogroup); 
      btnSave = (Button) itemView.findViewById(R.id.button); 
     } 
    } 


    protected class LoadingVH extends RecyclerView.ViewHolder { 

     public LoadingVH(View itemView) { 
      super(itemView); 
     } 
    } 


} 

PaginationScrollListener.java

public abstract class PaginationScrollListener extends RecyclerView.OnScrollListener { 

    LinearLayoutManager layoutManager; 

    public PaginationScrollListener(LinearLayoutManager layoutManager) { 
     this.layoutManager = layoutManager; 
    } 

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

     int visibleItemCount = layoutManager.getChildCount(); 
     int totalItemCount = layoutManager.getItemCount(); 
     int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition(); 

     if (!isLoading() && !isLastPage()) { 
      if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount 
        && firstVisibleItemPosition >= 0) { 
       loadMoreItems(); 
      } 
     } 
    } 

    protected abstract void loadMoreItems(); 

    public abstract int getTotalPageCount(); 

    public abstract boolean isLastPage(); 

    public abstract boolean isLoading(); 
} 

答えて

0

私は間違っているかもしれませんが、loadNextPage()と呼ぶ唯一の時間のように見えます。RecyclerViewがスクロールイベントを取得したときです。 ViewHoldersを削除しても、スクロールイベントiircは発生しません。

PaginationAdapterAdapterDataObserverを登録すると、削除/追加イベントをリッスンし、タスクが残っていないときに負荷をトリガーすることができます。あなたはPaginationActivity.onCreate方法でadapter = new PaginationAdapter(this);と呼ばれる場所を見、ところで

if (runs.isEmpty()) { 
    func_call.loadNextPage(); 
} 

EDIT:あなたはおそらくremove(Run)でそのコメントアウトされたコードにいくつかの小さな変更で同じことを行うだろうか?クラッシュを防止するのに十分であるべき

/** 
* @param context the activity this adapter will appear in 
*/ 
public PaginationAdapter(Context context) { 
    this.context = context; 
    runs = new ArrayList<>(); 
    func_call = (PaginationActivity)context; 
} 

thisはここにあなたがそうのようPaginationAdapterフィールドに割り当てることができることを意味し、あなたのPaginationActivity、です。懸念をより分かりやすくするために、AdapterDataObserverに基づいたロジックに切り替えることをお勧めします(これはopen/closed principle?と思われます)。

+0

私はここで混乱しています。私はまだアンドロイドプログラミングを学んでいます。私はルーキーミスをしているかもしれません。 loadNextPage()は、PaginationActivityクラスの下に記述されています。私はオブジェクトfunc_callを作成してその関数を呼び出そうとしています。しかし、それは完全な新しいインスタンスを作成し、アプリケーションがクラッシュします。いくつかの回避策がありますか?
public PaginationAdapter(コンテキストコンテキスト){this.context = context;ラン=新しいArrayList <>(); // func_call = new PaginationActivity(); } – venutamizh

+0

@venutamizhだから、そのコンテキストはあなたのPaginationActivityです。キャストしてfunc_callフィールドに保存することができます。コンテキストオブジェクトは通常、4つのうちの1つです:1.アクティビティ、2.サービス、3.アプリケーション、4.他の3つのうちの1つを包むラッパー(別のテーマや何かのようなもの)。 – Cliabhach

関連する問題