对不起,这个网站上已经回答了一个问题,但是我找不到与我相同的情况。
我在RoomDatabase
中将SetText
中的ViewPager
称为多列列表,我的问题是删除记录时如何动态更新ViewPager
。在我检查过的其他问题中,TextView
中只有一个ViewPager
。但就我而言,我将通过捆绑收到的数组分配给TextView
类中的每个ArrayListFragment
。
在删除按钮中搜索“ myAdapter.notifyDataSetChanged()”之后要做什么之后,这真令人沮丧。
非常感谢您的帮助。
public class FragmentStateLibraryPagerSupport extends Fragment {
MyAdapter myAdapter;
ViewPager mPager;
public List<String> head_array;
public List<String> desc_array;
TodoDatabase db;
@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View root = inflater.inflate( R.layout.fragment_pager, null );
Button btn_delete = root.findViewById( R.id.btn_delete );
btn_delete.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayListFragment arrayListFragment = new ArrayListFragment();
String head_array_text = head_array.get( arrayListFragment.return_mNum() );
Log.e( "head_array_text ::" , head_array.get( arrayListFragment.return_mNum() ));
TodoDatabase db = Room.databaseBuilder( getContext(), TodoDatabase.class, "todo-db" ).allowMainThreadQueries().build();
db.todoDao().deleteRecord( head_array_text );
myAdapter.notifyDataSetChanged();
}
} );
return root;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated( view, savedInstanceState );
db = Room.databaseBuilder( getContext(), TodoDatabase.class, "todo-db" ).allowMainThreadQueries().build();
head_array = db.todoDao().getAllHead();
desc_array = db.todoDao().getAllDesc();
myAdapter = new MyAdapter( getChildFragmentManager() );
mPager = (ViewPager) view.findViewById( R.id.pager );
mPager.setAdapter( myAdapter );
}
private class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super( fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT );
}
@NonNull
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance( position, head_array, desc_array );
}
@Override
public int getCount() {
return head_array.size();
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
}
public static class ArrayListFragment extends ListFragment {
int mNum;
ArrayList<String> head_array, desc_array;
Button btn_save;
public int return_mNum(){
return mNum;
}
static ArrayListFragment newInstance(int num, List<String> head_array, List<String> desc_array) {
ArrayListFragment arrayListFragment = new ArrayListFragment();
Bundle bundle = new Bundle();
bundle.putInt( "num", num );
bundle.putStringArrayList( "head_array", (ArrayList<String>) head_array );
bundle.putStringArrayList( "desc_array", (ArrayList<String>) desc_array );
arrayListFragment.setArguments( bundle );
return arrayListFragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
mNum = getArguments() != null ? getArguments().getInt( "num" ) : 1;
head_array = getArguments().getStringArrayList( "head_array" );
desc_array = getArguments().getStringArrayList( "desc_array" );
}
@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate( R.layout.fragment_pager_list, container, false );
btn_save = v.findViewById( R.id.btn_save );
final View head_tv = v.findViewById( R.id.head_tv );
final View desc_tv = v.findViewById( R.id.desc_tv );
if (head_array.size() == 0) {
((TextView) head_tv).setText( R.string.when_no_data_in_DB );
((TextView) desc_tv ).setText( "" );
btn_save.setVisibility( View.INVISIBLE );
} else {
((TextView) head_tv).setText( head_array.get( mNum ) );
((TextView) desc_tv ).setText( getString( Integer.parseInt( desc_array.get( mNum ) ) ) );
}
return v;
}
}
}
FragmentPagerAdapter并非真正旨在支持删除项目的能力(动态片段项目计数)。
为此,您应该使用以下代码,该代码按位置而不是片段来跟踪标识符。
public class DynamicFragmentPagerAdapter extends PagerAdapter {
private static final String TAG = "DynamicFragmentPagerAdapter";
private final FragmentManager fragmentManager;
public static abstract class FragmentIdentifier implements Parcelable {
private final String fragmentTag;
private final Bundle args;
public FragmentIdentifier(@NonNull String fragmentTag, @Nullable Bundle args) {
this.fragmentTag = fragmentTag;
this.args = args;
}
protected FragmentIdentifier(Parcel in) {
fragmentTag = in.readString();
args = in.readBundle(getClass().getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(fragmentTag);
dest.writeBundle(args);
}
protected final Fragment newFragment() {
Fragment fragment = createFragment();
Bundle oldArgs = fragment.getArguments();
Bundle newArgs = new Bundle();
if(oldArgs != null) {
newArgs.putAll(oldArgs);
}
if(args != null) {
newArgs.putAll(args);
}
fragment.setArguments(newArgs);
return fragment;
}
protected abstract Fragment createFragment();
}
private ArrayList<FragmentIdentifier> fragmentIdentifiers = new ArrayList<>();
private FragmentTransaction currentTransaction = null;
private Fragment currentPrimaryItem = null;
public DynamicFragmentPagerAdapter(FragmentManager fragmentManager) {
this.fragmentManager = fragmentManager;
}
private int findIndexIfAdded(FragmentIdentifier fragmentIdentifier) {
for (int i = 0, size = fragmentIdentifiers.size(); i < size; i++) {
FragmentIdentifier identifier = fragmentIdentifiers.get(i);
if (identifier.fragmentTag.equals(fragmentIdentifier.fragmentTag)) {
return i;
}
}
return -1;
}
public void addFragment(FragmentIdentifier fragmentIdentifier) {
if (findIndexIfAdded(fragmentIdentifier) < 0) {
fragmentIdentifiers.add(fragmentIdentifier);
notifyDataSetChanged();
}
}
public void removeFragment(FragmentIdentifier fragmentIdentifier) {
int index = findIndexIfAdded(fragmentIdentifier);
if (index >= 0) {
fragmentIdentifiers.remove(index);
notifyDataSetChanged();
}
}
@Override
public int getCount() {
return fragmentIdentifiers.size();
}
@Override
public void startUpdate(@NonNull ViewGroup container) {
if (container.getId() == View.NO_ID) {
throw new IllegalStateException("ViewPager with adapter " + this
+ " requires a view id");
}
}
@SuppressWarnings("ReferenceEquality")
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
if (currentTransaction == null) {
currentTransaction = fragmentManager.beginTransaction();
}
final FragmentIdentifier fragmentIdentifier = fragmentIdentifiers.get(position);
// Do we already have this fragment?
final String name = fragmentIdentifier.fragmentTag;
Fragment fragment = fragmentManager.findFragmentByTag(name);
if (fragment != null) {
currentTransaction.attach(fragment);
} else {
fragment = fragmentIdentifier.newFragment();
currentTransaction.add(container.getId(), fragment, fragmentIdentifier.fragmentTag);
}
if (fragment != currentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
if (currentTransaction == null) {
currentTransaction = fragmentManager.beginTransaction();
}
currentTransaction.detach((Fragment) object);
}
@SuppressWarnings("ReferenceEquality")
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
Fragment fragment = (Fragment) object;
if (fragment != currentPrimaryItem) {
if (currentPrimaryItem != null) {
currentPrimaryItem.setMenuVisibility(false);
currentPrimaryItem.setUserVisibleHint(false);
}
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
currentPrimaryItem = fragment;
}
}
@Override
public void finishUpdate(@NonNull ViewGroup container) {
if (currentTransaction != null) {
currentTransaction.commitNowAllowingStateLoss();
currentTransaction = null;
}
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return ((Fragment) object).getView() == view;
}
@Override
public Parcelable saveState() {
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("fragmentIdentifiers", fragmentIdentifiers);
return bundle;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
Bundle bundle = ((Bundle)state);
bundle.setClassLoader(loader);
fragmentIdentifiers = bundle.getParcelableArrayList("fragmentIdentifiers");
}
}