GridView上的Android smoothScrollToPosition与ArrayAdapter完全不兼容

时间:2016-11-14 11:49:06

标签: android gridview android-arrayadapter

我试图在屏幕旋转后滚动到所选位置但没有发生任何事情。 我已经尝试了很多建议,但没有一个是有效的(setSelection,自己的平滑滚动......)

public class MovieFragment extends Fragment {

    // The customised movie adapter
    private MovieAdapter mMovieAdapter;

    private GridView mGridView;

    private static final String SELECTED_POSTER = "stored_position";
    private int mPosition = GridView.INVALID_POSITION;

    public interface Callback {
        /**
         * DetailFragmentCallback for when an item has been selected.
         */
        void onItemSelectedNormal (Movie movie);
    }

    public MovieFragment() {
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    /**
     * Function that makes an Async call for the fetch function while passing the sort criteria from the shared preferences.
     */
    public void updateMovies (String sortCriteria) {
        FetchMoviesTask fmt = new FetchMoviesTask(getActivity(), mMovieAdapter);
        fmt.execute(sortCriteria);
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    public void onSortChange () {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String sortCriteria = prefs.getString(getString(R.string.pref_criteria_key), getString(R.string.pref_criteria_default));

        updateMovies(sortCriteria);

    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mMovieAdapter =  new MovieAdapter(getActivity(), new ArrayList<Movie>());

        View rootView = inflater.inflate(R.layout.fragment_movie, container, false);

        mGridView = (GridView) rootView.findViewById(R.id.gridview_movie);


        mGridView.setAdapter(mMovieAdapter);


        // Handle a click on a poster.
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Movie movie = mMovieAdapter.getItem(i); // Get the movie object at the appropriate position.

                ((Callback) getActivity()).onItemSelectedNormal(movie);

                mPosition = i;

            }

        });

        if (savedInstanceState != null && savedInstanceState.containsKey(SELECTED_POSTER)) {
            mPosition = savedInstanceState.getInt(SELECTED_POSTER);
        }

        //onSortChange();

        return rootView;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        if (mPosition != GridView.INVALID_POSITION){
            outState.putInt(SELECTED_POSTER, mPosition);
        }
        super.onSaveInstanceState(outState);
    }


    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        if (mPosition != GridView.INVALID_POSITION) {
            mGridView.smoothScrollToPosition(mPosition);
        }
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        onSortChange();
    }

}

这是我的适配器:

public class MovieAdapter extends ArrayAdapter<Movie> {

private static final String LOG_TAG = MovieAdapter.class.getSimpleName();

public MovieAdapter(Activity context, ArrayList<Movie> movies) {
    super(context, 0, movies);
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // Gets the Movie object from the ArrayAdapter at the appropriate position
    Movie movie = getItem(position);


    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(
                R.layout.movie_poster, parent, false);
    }


    ImageView imageView = (ImageView) convertView.findViewById(R.id.poster_view);


    Picasso.with(convertView.getContext()).load(movie.getImageURL()).into(imageView);

    return convertView;
}

}

我的片段布局:

<RelativeLayout 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">

<!-- TODO: Update blank fragment layout -->

<GridView
    android:id="@+id/gridview_movie"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:verticalSpacing="0dp"
    android:horizontalSpacing="0dp"
    android:numColumns="auto_fit"
    style="@style/MovieGridStyle"
    android:stretchMode="columnWidth" />

<TextView
    android:id="@+id/no_data_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/empty_fav_list"
    android:visibility="invisible"
    android:gravity="center"
    android:textColor="#bfafaf"
    android:textSize="25sp" />



</RelativeLayout>

我的图片布局,名为movie_poster:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10sp"
android:background="@drawable/touch_selector">

<ImageView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="fitXY"
    android:id="@+id/poster_view"
    android:adjustViewBounds="true"/>

</FrameLayout>

0 个答案:

没有答案