2017-02-15 6 views
1

私は、入力した経費をSQLiteデータベースに保存してRecyclerViewに表示するアプリケーションを構築しています。私のアプリは現在、3つのタブを持つビューページャを持っています。各タブは、SQLiteデータベースから異なる期間、具体的にはToday、今週、およびRecyclerViewに表示されるAllを含む費用を引き上げる新しいフラグメントに切り替わります。各リストでは、アイテムを長押しして削除して、SQLiteデータベースと現在のRecyclerViewから削除し、リストを更新します。あるリストのアイテムが他のリストにある可能性があるので、アイテムが削除された残りの2つのフラグメントのリストをチェックしてそこから削除する方法を実装したいと思いますが、これを行う最善の方法を理解することが難しい。同じデータの複数のリストをビューページで同時に更新する

ビュー・ページャーでデータベースをもう一度呼び出すと、完全に新しいリストを作成する各フラグメントを簡単に再作成できますが、これは非効率的です。どのように私はこれを達成することができるかについて誰もが考えている?以下は私の現在のコードです:

ExpensePagerAdapter

class ExpensePagerAdapter extends FragmentPagerAdapter { 
    private String[] tabTitles = {getString(R.string.label_today), 
      getString(R.string.label_week), getString(R.string.label_all)}; 


    ExpensePagerAdapter(FragmentManager fm){ 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return tabTitles.length; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return ExpenseListFragment.newInstance(position); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabTitles[position]; 
    } 

} 

ExpenseListFragment

public class ExpenseListFragment extends Fragment{ 
private static final String LOG_TAG = "ExpenseListFragment"; 
private static final String ARG_TYPE = "viewType"; 
private RecyclerView rv; 
private List<Expense> dayViewExpenses; 
private List<LocalDate> weekViewDay; 
private List<List<Expense>> weekViewExpenses; 
private List<Expense> allExpenses; 

public static ExpenseListFragment newInstance(int viewType){ 
    Bundle bundle = new Bundle(); 
    bundle.putInt(ARG_TYPE, viewType); 
    ExpenseListFragment f = new ExpenseListFragment(); 
    f.setArguments(bundle); 
    return f; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    Log.d(LOG_TAG, "onCreateView"); 
    View v = inflater.inflate(R.layout.fragment_list, container, false); 
    rv = (RecyclerView) v.findViewById(R.id.rv_list); 
    rv.setLayoutManager(new LinearLayoutManager(getActivity())); 
    int viewType = getArguments().getInt(ARG_TYPE); 
    switch(viewType) { 
     case 0: 
      setupDayView(); 
      break; 
     case 1: 
      setupWeekView(); 
      break; 
     case 2: 
      setUpAllView(); 
      break; 
     default: 
    } 
    return v; 
} 

private void setupDayView(){ 
    dayViewExpenses = new ArrayList<>(); 
    LocalDate currentDate = new LocalDate(); 
    for (Expense e : ExpenseDb.getInstance(getActivity()).getAllExpenses()) { 
     if (currentDate.getMonthOfYear() == e.getMonth() 
       && currentDate.getDayOfMonth() == e.getDay() && currentDate.getYear() == e.getYear()) { 
      dayViewExpenses.add(e); 
     } 
    } 
    rv.setAdapter(new ExpenseAdapter(getActivity(), dayViewExpenses)); 
} 

private void setupWeekView(){ 
    weekViewDay = new ArrayList<>(); 
    weekViewExpenses = new ArrayList<>(); 
    LocalDate weekStart = new LocalDate().withDayOfWeek(DateTimeConstants.MONDAY); 
    for (int i = 0; i < 7; i++) { 
     LocalDate dayOfWeek = weekStart.plusDays(i); 
     weekViewDay.add(dayOfWeek); 
     List<Expense> expensesForDay = new ArrayList<>(); 
     for (Expense expense: ExpenseDb.getInstance(getActivity()).getAllExpenses()) { 
      if (expense.getDay() == dayOfWeek.getDayOfMonth() && expense.getMonth() == dayOfWeek.getMonthOfYear() 
        && expense.getYear() == dayOfWeek.getYear()) { 
       expensesForDay.add(expense); 
      } 
     } 
     weekViewExpenses.add(expensesForDay); 
    } 
    rv.setAdapter(new WeekViewAdapter(getActivity(), weekViewDay, weekViewExpenses)); 
} 

private void setUpAllView(){ 
    allExpenses = ExpenseDb.getInstance(getActivity()).getAllExpenses(); 
    rv.setAdapter(new ExpenseAdapter(getActivity(), allExpenses)); 
} 

}

すべてのヘルプは、私が達成するために理想的な方法を考え出すのに苦労してきたとして素晴らしいことですこの。

答えて

1

イベントバスライブラリ(http://square.github.io/otto/)をこの問題に使用できます。 ExpenseListFragmentsにバスを接続して、そのフラグメントに同時にオブジェクトを送信することはできません。アダプターを再作成するのは、デバイスではなく、デバイスのコストです。

+0

返信いただきありがとうございます、私はこれを見て、それがどのように進むのかをご報告します。 – BroccolliBeef

関連する問題