android – 无法从我的模型类更新RecyclerView?

android – 无法从我的模型类更新RecyclerView?,第1张

概述我正在使用RecyclerView,它必须是Draggable&滑动式.一切都很完美. 数据正在一个名为ExerciseDataProvider&的类中被提取. RV代码是另一个Fragment RecyclerListViewFragment. 问题是我无法通过postExecute方法通知FetchExercise更改的数据.所以数据不会在RV中填充. 请指导我正确的方向. 活动 public 我正在使用RecyclerVIEw,它必须是Draggable&滑动式.一切都很完美.

数据正在一个名为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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1128031.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存