ListView не обновляется при пролистывании на другую страницу и обратно - PullRequest
0 голосов
/ 01 ноября 2019

Я пишу приложение для хранения заметок. Он имеет ViewPager, который позволяет проводить между категориями заметок. Когда я добавляю заметку на страницу, она отображается в ListView фрагмента.

Но если я проведу пальцем по другой странице и проведу назад, добавьте еще одну заметку, которая не будет отображена в ListView. Я попытался notifyDatasetChanged() адаптера и invalidateViews() ListView, но, похоже, ничего не работает.

Я не знаю, где я допустил ошибку. Я надеюсь, что если вы найдете то, что я сделал неправильно, это будет очень полезно для меня.

Вот мой код фрагмента:

public class MemoListFragment extends Fragment
{
    private MemoAdapter memoAdapter = null;
    private ListView memoListView;
    private Memo memoToEdit = null;
    private List<Memo> userSelected = new ArrayList<>();
    private onDeleteActionSelectedListener 
    deleteActionSelectedListener;
    private String category;
    private List<Memo> memoList;

    public String getCategory()
    {
        return category;
    }

    public void setCategory(String category)
    {
        this.category = category;
    }

    private final int EDIT_MEMO_REQUEST_CODE = 2;

    public void updateMemoList(List<Memo> memoList)
    {
        memoAdapter.clear();
        memoAdapter.addAll(memoList);
    }

    public void setInitData(List<Memo> memoList)
    {
        this.memoList = memoList;
    }

    public void addMemo(Memo m)
    {
        memoAdapter.add(m);
        memoListView.invalidateViews();
    }


    public MemoListFragment()
    {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Context context)
    {
        super.onAttach(context);

        deleteActionSelectedListener = ((MainActivity) 
    context).getMainPresenter();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup 
    container,
                             Bundle savedInstanceState)
    {
        View rootLayout = inflater.inflate(R.layout.memo_list_fragment, 
     container, false);

        memoListView = rootLayout.findViewById(R.id.memo_list_view);
        memoListView.setOnItemClickListener((parent, view, position, 
     id) ->
        {
            {
                Memo selectedMemo = memoAdapter.getItem(position);

                Intent editMemo = new Intent(getActivity(), 
      MemoViewActivity.class);

                editMemo.putExtra("memo_to_edit", selectedMemo);

                memoToEdit = selectedMemo;

                startActivityForResult(editMemo, 
   EDIT_MEMO_REQUEST_CODE);
            }
        });

        memoAdapter = new MemoAdapter(getActivity(), 0, memoList);

        memoListView.setAdapter(memoAdapter);

    memoListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
        memoListView.setMultiChoiceModeListener(modeListener);

        return rootLayout;
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, 
    Intent data)
    {
        if (requestCode == EDIT_MEMO_REQUEST_CODE)
        {
            if (resultCode == Activity.RESULT_OK)
            {
                String title = data.getStringExtra("title").toString();
                String detail = 
    data.getStringExtra("detail").toString();

                if (memoToEdit != null)
                {
                    memoToEdit.setDetail(detail);
                    memoToEdit.setTitle(title);
                    memoToEdit.setLastModified(LocalDate.now());
                    memoToEdit = null;
                }
            }
        }
    }


    AbsListView.MultiChoiceModeListener modeListener = new 
  AbsListView.MultiChoiceModeListener()
    {
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int 
   position, long id, boolean checked)
        {
            Memo m = memoAdapter.getItem(position);

            if (userSelected.contains(m))
            {
                userSelected.remove(m);
                memoAdapter.getSelectedPos().remove(new 
  Integer(position));
            }
            else
            {
                userSelected.add(m);
                memoAdapter.getSelectedPos().add(position);
            }


            memoListView.invalidateViews();

            mode.setTitle(userSelected.size() + " items selected.");
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu)
        {
            mode.getMenuInflater().inflate(R.menu.context_menu, menu);

            memoAdapter.setShowCheckboxes(true);

            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu)
        {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem 
  item)
        {
            switch (item.getItemId())
            {
                case R.id.action_delete:

                    for (Memo m : userSelected)
                        memoAdapter.remove(m);

   deleteActionSelectedListener.onDeleteActionSelected(userSelected);
                    mode.finish();

                    return true;


                default:
                    return false;
            }
        }

        @Override
        public void onDestroyActionMode(ActionMode mode)
        {
            userSelected.clear();

            memoAdapter.getSelectedPos().clear();
            memoAdapter.setShowCheckboxes(false);
        }
    };

    public interface onDeleteActionSelectedListener
    {
        void onDeleteActionSelected(List<Memo> userSelected);
    }


}

Вот код для добавления заметки:

public void addMemo(Memo memo)
    {
        int currentPage = mainView.getCurrentPagePosition();

        if (currentPage == 0)//on page All category
            memo.setCategory("Not categorized");
        else

    memo.setCategory(memoManager.getCategoriesList().get(currentPage));

        MemoListFragment currentFrag = fragmentList.get(currentPage);
        currentFrag.addMemo(memo);

    }

Вот мой код PagerAdapter:

public class MemooPagerAdapter extends FragmentStatePagerAdapter
{
    private FragmentSetupManager fragmentSetupManager;
    private List<String> categoriesList;

    public MemooPagerAdapter(FragmentManager fm, FragmentSetupManager fragmentSetupManager)
    {
        super(fm);
        this.fragmentSetupManager = fragmentSetupManager;
        this.categoriesList = fragmentSetupManager.getCategoriesList();
    }

    @Override
    public Fragment getItem(int position)
    {
        MemoListFragment fragment = new MemoListFragment();

        String cate = categoriesList.get(position);

        fragment.setCategory(cate);
        fragment.setInitData(fragmentSetupManager.getFragmentData(cate));

        fragmentSetupManager.addToFragmentList(fragment);

        return fragment;
    }

    @Override
    public int getCount()
    {
        return categoriesList.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position)
    {
        return categoriesList.get(position);
    }

    public interface FragmentSetupManager
    {
        List<Memo> getFragmentData(String category);

        void addToFragmentList(MemoListFragment fragment);

        List<String> getCategoriesList();
    }
}

Настройка ViewPager:

public MainPresenter(MainView mainView)
    {
        this.mainView = mainView;
        memoManager = new MemoManager(((Activity) mainView).getApplicationContext());

        pagerAdapter = new MemooPagerAdapter(
                ((FragmentActivity) mainView).getSupportFragmentManager(), this);

        mainView.setMainVPagerAdapter(pagerAdapter);
    }

1 Ответ

0 голосов
/ 01 ноября 2019

В идеале вы хотите передать событие от одного фрагмента к другому. Самый простой способ - использовать RXJava. Такой подход является лучшим способом сделать это и легко реализуемым. На мой взгляд, это лучший подход для общения двух или более фрагментов в Android. Настройте свой проект с зависимостями:

  // RxJava2 Dependencies
  implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
  implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

Так что, если вы находитесь во FragmentA и переместитесь во FragmentB и внесли изменение во FragmentB, FragmentA получит это изменение.

Посмотрите, как это было реализованолегко здесь . Дайте мне знать, если этого достаточно.

...