
数据正在一个名为ExerciseDataProvIDer&的类中被提取. RV代码是另一个Fragment RecyclerListVIEwFragment.
问题是我无法通过postExecute方法通知FetchExercise更改的数据.所以数据不会在RV中填充.
请指导我正确的方向.
活动
public class DraggableSwipeableExampleActivity extends AppCompatActivity { private static final String FRAGMENT_TAG_DATA_PROVIDER = "data provIDer"; private static final String FRAGMENT_List_VIEW = "List vIEw"; private static final String FRAGMENT_TAG_ITEM_PINNED_DIALOG = "item pinned dialog"; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_demo); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(new ExampleDataProvIDerFragment(),FRAGMENT_TAG_DATA_PROVIDER) .commit(); getSupportFragmentManager().beginTransaction() .add(R.ID.container,new RecyclerListVIEwFragment(),FRAGMENT_List_VIEW) .commit(); } } public AbstractDataProvIDer getDataProvIDer() { final Fragment fragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG_DATA_PROVIDER); return ((ExampleDataProvIDerFragment) fragment).getDataProvIDer(); } 数据提供者
public class ExerciseDataProvIDer extends AbstractDataProvIDer { private List<ConcreteData> mData; private ConcreteData mLastRemovedData; private int mLastRemovedposition = -1; public ExerciseDataProvIDer() { new FetchExercise().execute(); mData = new linkedList<>(); } class FetchExercise extends AsyncTask<VoID,VoID,VoID> { @OverrIDe protected VoID doInBackground(VoID... params) { final int vIEwType = 0; final int swipeReaction = RecyclerVIEwSwipeManager.REACTION_CAN_SWIPE_UP | RecyclerVIEwSwipeManager.REACTION_CAN_SWIPE_DOWN; String url = "@R_502_6822@s://gist.githubusercontent.com/fake/cb9aa5494e7ee36ac3ca/raw/a4abfd19368063/exercise.JsON"; Log.d("Path",url); try { Ok@R_502_6822@ClIEnt clIEnt = new Ok@R_502_6822@ClIEnt(); Request request = new Request.Builder().url(url).build(); Response response = clIEnt.newCall(request).execute(); String JsonData = response.body().string(); try { JsONArray JsonArray = new JsONArray(JsonData); for (int i = 0; i < JsonArray.length(); i++) { final long ID = i; JsONObject JsonObject = JsonArray.getJsONObject(i); String exercise_name = JsonObject.getString("name"); int exercise_duration = JsonObject.getInt("duration"); mData.add(new ConcreteData(ID,vIEwType,exercise_name,exercise_duration,swipeReaction)); Log.d("exercise_name",exercise_name); } } catch (JsONException e) { e.printstacktrace(); } } catch (IOException e) { e.printstacktrace(); } return null; } @OverrIDe protected voID onPostExecute(VoID aVoID) { super.onPostExecute(aVoID); } } @OverrIDe public int getCount() { return mData.size(); } @OverrIDe public Data getItem(int index) { if (index < 0 || index >= getCount()) { throw new indexoutofboundsexception("index = " + index); } return mData.get(index); } @OverrIDe public int undolastRemoval() { if (mLastRemovedData != null) { int insertedposition; if (mLastRemovedposition >= 0 && mLastRemovedposition < mData.size()) { insertedposition = mLastRemovedposition; } else { insertedposition = mData.size(); } mData.add(insertedposition,mLastRemovedData); mLastRemovedData = null; mLastRemovedposition = -1; return insertedposition; } else { return -1; } } @OverrIDe public voID moveItem(int fromposition,int toposition) { if (fromposition == toposition) { return; } final ConcreteData item = mData.remove(fromposition); mData.add(toposition,item); mLastRemovedposition = -1; } @OverrIDe public voID removeItem(int position) { //noinspection UnnecessaryLocalVariable final ConcreteData removedItem = mData.remove(position); mLastRemovedData = removedItem; mLastRemovedposition = position; } public static final class ConcreteData extends Data { private final long mID; private final String mText; private final int mVIEwType; private final int mDuration; private boolean mPinned; ConcreteData(long ID,int vIEwType,String text,int duration,int swipeReaction) { mID = ID; mVIEwType = vIEwType; mText = text; mDuration = duration; } @OverrIDe public int getVIEwType() { return mVIEwType; } @OverrIDe public int getDuration() { return mDuration; } @OverrIDe public long getID() { return mID; } @OverrIDe public String toString() { return mText; } @OverrIDe public String getText() { return mText; } @OverrIDe public boolean isPinned() { return mPinned; } @OverrIDe public voID setPinned(boolean pinned) { mPinned = pinned; } }} RecyclerListVIEwFragment
public class RecyclerListVIEwFragment extends Fragment { private RecyclerVIEw mRecyclerVIEw; private RecyclerVIEw.LayoutManager mLayoutManager; private RecyclerVIEw.Adapter mAdapter; private RecyclerVIEw.Adapter mWrappedAdapter; private RecyclerVIEwDragDropManager mRecyclerVIEwDragDropManager; private RecyclerVIEwSwipeManager mRecyclerVIEwSwipeManager; private RecyclerVIEwtouchActionGuardManager mRecyclerVIEwtouchActionGuardManager; public RecyclerListVIEwFragment() { super(); } @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater,@Nullable VIEwGroup container,@Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_recycler_List_vIEw,container,false); } @OverrIDe public voID onVIEwCreated(VIEw vIEw,@Nullable Bundle savedInstanceState) { super.onVIEwCreated(vIEw,savedInstanceState); //noinspection ConstantConditions mRecyclerVIEw = (RecyclerVIEw) getVIEw().findVIEwByID(R.ID.recycler_vIEw); mLayoutManager = new linearlayoutmanager(getContext()); // touch guard manager (this class is required to suppress scrolling while swipe-dismiss animation is running) mRecyclerVIEwtouchActionGuardManager = new RecyclerVIEwtouchActionGuardManager(); mRecyclerVIEwtouchActionGuardManager.setInterceptVerticalScrollingWhileAnimationRunning(true); mRecyclerVIEwtouchActionGuardManager.setEnabled(true); // drag & drop manager mRecyclerVIEwDragDropManager = new RecyclerVIEwDragDropManager(); mRecyclerVIEwDragDropManager.setDraggingItemShadowDrawable( (NinePatchDrawable) ContextCompat.getDrawable(getContext(),R.drawable.material_shadow_z3)); // swipe manager mRecyclerVIEwSwipeManager = new RecyclerVIEwSwipeManager(); //adapter final MyDraggableSwipeableItemAdapter myItemAdapter = new MyDraggableSwipeableItemAdapter(getDataProvIDer()); myItemAdapter.setEventListener(new MyDraggableSwipeableItemAdapter.EventListener() { @OverrIDe public voID onItemRemoved(int position) { ((DraggableSwipeableExampleActivity) getActivity()).onItemRemoved(position); } @OverrIDe public voID onItemVIEwClicked(VIEw v,boolean pinned) { onItemVIEwClick(v,pinned); } }); mAdapter = myItemAdapter; mWrappedAdapter = mRecyclerVIEwDragDropManager.createWrappedAdapter(myItemAdapter); // wrap for dragging mWrappedAdapter = mRecyclerVIEwSwipeManager.createWrappedAdapter(mWrappedAdapter); // wrap for swiPing final GeneralitemAnimator animator = new SwipedismissItemAnimator(); animator.setSupportsChangeAnimations(false); mRecyclerVIEw.setLayoutManager(mLayoutManager); mRecyclerVIEw.setAdapter(mWrappedAdapter); // requires *wrapped* adapter mRecyclerVIEw.setItemAnimator(animator); // additional decorations //noinspection StatementWithEmptyBody if (supportsVIEwElevation()) { // Lollipop or later has native drop shadow feature. ItemShadowDecorator is not required. } else { mRecyclerVIEw.addItemdecoration(new ItemShadowDecorator((NinePatchDrawable) ContextCompat.getDrawable(getContext(),R.drawable.material_shadow_z1))); } mRecyclerVIEw.addItemdecoration(new SimpleListdivIDerDecorator(ContextCompat.getDrawable(getContext(),R.drawable.List_divIDer_h),true)); mRecyclerVIEwtouchActionGuardManager.attachRecyclerVIEw(mRecyclerVIEw); mRecyclerVIEwSwipeManager.attachRecyclerVIEw(mRecyclerVIEw); mRecyclerVIEwDragDropManager.attachRecyclerVIEw(mRecyclerVIEw); } @OverrIDe public voID onPause() { mRecyclerVIEwDragDropManager.cancelDrag(); super.onPause(); } @OverrIDe public voID onDestroyVIEw() { if (mRecyclerVIEwDragDropManager != null) { mRecyclerVIEwDragDropManager.release(); mRecyclerVIEwDragDropManager = null; } if (mRecyclerVIEwSwipeManager != null) { mRecyclerVIEwSwipeManager.release(); mRecyclerVIEwSwipeManager = null; } if (mRecyclerVIEwtouchActionGuardManager != null) { mRecyclerVIEwtouchActionGuardManager.release(); mRecyclerVIEwtouchActionGuardManager = null; } if (mRecyclerVIEw != null) { mRecyclerVIEw.setItemAnimator(null); mRecyclerVIEw.setAdapter(null); mRecyclerVIEw = null; } if (mWrappedAdapter != null) { WrapperAdapterUtils.releaseAll(mWrappedAdapter); mWrappedAdapter = null; } mAdapter = null; mLayoutManager = null; super.onDestroyVIEw(); } private voID onItemVIEwClick(VIEw v,boolean pinned) { int position = mRecyclerVIEw.getChildAdapterposition(v); if (position != RecyclerVIEw.NO_position) { ((DraggableSwipeableExampleActivity) getActivity()).onItemClicked(position); } } public AbstractDataProvIDer getDataProvIDer() { return ((DraggableSwipeableExampleActivity) getActivity()).getDataProvIDer(); } public voID notifyItemChanged(int position) { mAdapter.notifyItemChanged(position); } public voID notifyItemInserted(int position) { mAdapter.notifyItemInserted(position); mRecyclerVIEw.scrollToposition(position); }}解决方法 要从数据提供程序类中的onPostExecute更新recyclelerVIEw,您的onPostExecute应该可以访问定义了recyclerVIEw的上下文. 由于您的FetchExercise异步任务是在ExerciseDataProvIDer类中定义的,因此请尝试将活动上下文传递给ExerciseDataProvIDer的构造函数,然后将其传递给FetchExercise异步任务,如下所述:getting context in AsyncTask
public class MyCustomTask extends AsyncTask<VoID,Long> { private Context mContext; public MyCustomTask (Context context){ mContext = context; } protected voID onPostExecute(Long result) { //use mContext to update recycler vIEw } }} 使用上下文更新recyclerVIEw.
UPDATE
步骤1
定义一个接口,该接口将在类中通知您的数据集更改活动,该类初始化数据提供程序类并将活动上下文传递给数据提供程序类的构造函数.
public class ExampleDataProvIDerFragment extends Fragment { private AbstractDataProvIDer mDataProvIDer; //define an interface that will notify your activity of data set change public interface EventListener { voID onNotifyDataSetChanged(); } @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); //Pass activity context to ExerciseDataProvIDer mDataProvIDer = new ExerciseDataProvIDer(getActivity()); } public AbstractDataProvIDer getDataProvIDer() { return mDataProvIDer; }} 第2步
将上下文参数添加到ExerciseDataProvIDer的构造函数,并使用它来通知实现接口的活动以通知数据集更改.
public class ExerciseDataProvIDer extends AbstractDataProvIDer { private List<ConcreteData> mData; private ConcreteData mLastRemovedData; private int mLastRemovedposition = -1; //Add context parameter to constructor public ExerciseDataProvIDer(Context context) { //Pass context to async task new FetchExercise(context).execute(); mData = new linkedList<>(); } class FetchExercise extends AsyncTask<VoID,Integer> { Context mContext; public FetchExercise(Context context) { mContext = context; } @OverrIDe protected Integer doInBackground(VoID... params) { ... return 1; } @OverrIDe protected voID onPostExecute(Integer result) { super.onPostExecute(result); //Typecast context to interface defined above //and notify dataset changes by calling its method ExampleDataProvIDerFragment.EventListener eventListener = (ExampleDataProvIDerFragment.EventListener)mContext; eventListener.onNotifyDataSetChanged(); } }} 第3步
在您的活动类中实现上面定义的接口,并通知其中的recyclervIEw适配器
public class DraggableSwipeableExampleActivity extends AppCompatActivity implements ExampleDataProvIDerFragment.EventListener { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { ... } //implement interface method and notify recyclervIEw of changes @OverrIDe public voID onNotifyDataSetChanged() { Fragment fragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_List_VIEW); // you might need to change visibility of `mWrappedAdapter` in the fragment that defines it or create a getter for it so that you can access it here ((RecyclerListVIEwFragment) fragment).mWrappedAdapter.notifyDataSetChanged(); } ...} 总结 以上是内存溢出为你收集整理的android – 无法从我的模型类更新RecyclerView?全部内容,希望文章能够帮你解决android – 无法从我的模型类更新RecyclerView?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)