10

私は子供としてFragmentSwipeRefreshLayoutそしてその後を持っています。RecyclerViewFragment がコミットされると、データを取得して RecyclerView にサービスを提供する CustomAdapter を設定するために、サーバーとの通信を開始します。

ユーザーは、下にスワイプするか、ActionBar のボタンを押すことで、コンテンツを更新できます。後者の場合、手動で呼び出しますswipeRefreshLayout.setRefreshing(true)。というわけで今のところトラブルなし。

RecyclerView ( ) の最初の読み込み中に更新状態を手動で呼び出すと、問題が発生しonStart()ます。進行状況インジケーターが表示されません。すべてのデータを取得するのに数秒かかるため、RecyclerView がまだ空であるためだと思います...

コードをいくつか残します。

フラグメント コード:

public class MyFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        View mView = inflater.inflate(R.layout.fragment_stop, container, false);
        mRecyclerView = (RecyclerView) mView.findViewById(R.id.recyclerView1);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),
             DividerItemDecoration.VERTICAL_LIST));
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

       //SwipeRefreshLayout retrieved and  configured
       swipeLayout = (SwipeRefreshLayout) mView.findViewById(R.id.swipe_container);
       swipeLayout.setOnRefreshListener(this);
       swipeLayout.setColorSchemeResources(
            R.color.primaryColor,
            R.color.cyan_500,
            R.color.light_green_500,
            R.color.amber_500);

        return mView;


     }

    ...
    @Override
        public void onStart() {
            super.onStart();
            executeSchedule(); //First execution and data loading.
        }
        ...

    @Override
    public void onRefresh() {
        executeSchedule();
    }
    ...
    public void executeSchedule() {
        new Schedule().execute();
    }



    private class Schedule extends AsyncTask<Void, Void, Void> {

        ...
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if(!swipeLayout.isRefreshing()) {
                swipeLayout.setRefreshing(true); //set refresh state
            }
        }

        @Override
        protected Void doInBackground(Void... params) {
        ...
        }

        @Override
        protected void onPostExecute(Void result) {
            adap = new CustomAdapter(getActivity(), ...);
            mRecyclerView.setAdapter(adap);
            swipeLayout.setRefreshing(false);
        }

}

XML コード:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/section_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <android.support.v4.widget.SwipeRefreshLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/swipe_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="4dp"
                android:paddingRight="4dp"
                android:paddingBottom="2dp"
                android:layout_marginTop="5dp"
                android:divider="#e0e0e0"
                tools:context=".MyFragment" />

        </android.support.v4.widget.SwipeRefreshLayout>
    </RelativeLayout>
</FrameLayout>

この状況に対処するためのベストプラクティスは何ですか? 2 つ目のダミーの SwipeRefreshLayout を追加しますか? すぐに空のアダプタを強制しますか?

4

3 に答える 3

17

空のリサイクラーで作業できないという問題があったSwipeRefreshLayoutため、非常に単純な空のアダプターを作成しました。

public class EmptyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
}
于 2016-01-14T09:01:03.827 に答える
0

call の前に measure メソッドを呼び出す必要がありますsetRefreshing(true)SwipeRefreshLayout no animation on fragment creation
を見てください。多分それは役立つかもしれません。

于 2014-11-02T18:27:54.557 に答える