滚动时,Android GridView会留下痕迹

时间:2015-06-14 17:04:01

标签: android android-fragments gridview scroll

我有一个在Activity和Fragment中实现的GridView,并包含自己的Adapter。它工作得很好,直到滚动,当我尝试滚动时,它似乎留下了加载的第一个项目的背景。

Here's a printscreen of the behavior 这是我正在实施的代码:

活动类

    public class FavoriteActivity extends ActionBarActivity {
    private final String LOG_TAG = FavoriteActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_favorite);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new FavoriteListFragment())
                    .commit();
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        FavoriteListFragment fragment = (FavoriteListFragment)getSupportFragmentManager().findFragmentById(R.id.container);
        if ( null != fragment ) {
            fragment.onRestartLoader();
        }
    }
}

片段类

 public class FavoriteListFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
    public static final String LOG_TAG = FavoriteListFragment.class.getSimpleName();
    private static final int LOADER = 0;
    private static final String SELECTED_KEY = "selected_position";
    private ResultListAdapter mAdapter;
    private GridView mGridView;
    private int mPosition = ListView.INVALID_POSITION;

    public static final String[] SMCONTENT_COLUMNS = {
            SMDBContract.SMContentEntry.COLUMN_TITLE,
    };

    static final int COL_TITLE      = 0;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        getLoaderManager().initLoader(LOADER, null, this);
        super.onActivityCreated(savedInstanceState);
    }

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

        mAdapter = new ResultListAdapter(getActivity(), null, 0);
        mAdapter.setIsFavoriteView(true);
        View rootView = inflater.inflate(R.layout.fragment_favorite, container, false);
        mGridView = (GridView) rootView.findViewById(R.id.listview_sm_content_favorite);
        mGridView.setAdapter(mAdapter);
        if (savedInstanceState != null && savedInstanceState.containsKey(SELECTED_KEY)) {
            mPosition = savedInstanceState.getInt(SELECTED_KEY);
        }
        return rootView;
    }

    void onRestartLoader() {
        getLoaderManager().restartLoader(LOADER, null, this);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        // When tablets rotate, the currently selected list item needs to be saved.
        // When no item is selected, mPosition will be set to Listview.INVALID_POSITION,
        if (mPosition != ListView.INVALID_POSITION) {
            outState.putInt(SELECTED_KEY, mPosition);
        }
        super.onSaveInstanceState(outState);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
        String favs = Utility.getFavoritesIds(getActivity());

        Uri resultSearchURI = SMDBContract.SMContentEntry
                .buildSMContentMultiple(SMDBContract.CATEGORY_SERIE, favs);
        Log.d(LOG_TAG,"PREFS URI: "+resultSearchURI);

        return new CursorLoader(getActivity(),
                resultSearchURI,
                SMCONTENT_COLUMNS,
                null,
                null,
                null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        mAdapter.swapCursor(data);
        mAdapter.setCursor(data);
        if (mPosition != ListView.INVALID_POSITION) {
            mGridView.smoothScrollToPosition(mPosition);
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    }
}

适配器

    public class ResultListAdapter extends CursorAdapter {

    private Context mContext;
    private Cursor mCursor;

    public ResultListAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);
        mContext = context;
        mCursor = c;
    }

    public Cursor getCursor() {
        return mCursor;
    }

    public void setCursor(Cursor mCursor) {
        this.mCursor = mCursor;
    }

    public static class ViewHolder {
        public final ImageView iconView;
        public final TextView titleView;

        public ViewHolder(View view) {
            iconView = (ImageView) view.findViewById(R.id.list_item_icon);
            titleView = (TextView) view.findViewById(R.id.list_item_title_textView);
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        view.setTag(viewHolder);

        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        ViewHolder viewHolder = (ViewHolder) view.getTag();
        if (viewHolder.iconView != null) {
            Picasso.with(context)
                    .load(cursor.getString(ResultListFragment.COL_POSTER))
                    .fit()
                    .centerInside()
                    .into(viewHolder.iconView);
        }

        if (viewHolder.titleView != null)
            viewHolder.titleView.setText(cursor.getString(ResultListFragment.COL_TITLE));
    }
}

活动布局

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:name=".FavoriteListFragment"
    tools:context=".FavoriteListFragment"
    tools:layout="@android:layout/list_content" />

片段布局

<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"
    tools:context="![enter image description here][1].FavoriteListFragment">

    <GridView
        android:id="@+id/listview_sm_content_favorite"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="100dp"
        android:numColumns="auto_fit"
        android:verticalSpacing="5dp"
        android:horizontalSpacing="5dp"
        android:stretchMode="columnWidth"
        android:gravity="center"
        />

</FrameLayout>

网格项布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <FrameLayout
        android:layout_width="100dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        >

        <ImageView
            android:id="@+id/list_item_icon"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@mipmap/ic_launcher"/>

    </FrameLayout>
    <TextView
        android:id="@+id/list_item_title_textView"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:fontFamily="sans-serif-light"
        android:layout_gravity="center"
        android:textAppearance="?android:textAppearanceMedium"
        android:text="My Item Title"/>

</LinearLayout>

更新 我刚刚发现,通过从FavoriteActivity.onCreate中删除此代码,错误会停止...但为什么!?有人可以告诉我

   if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new FavoriteListFragment())
                .commit();
    }

1 个答案:

答案 0 :(得分:0)

Grid Item Layout中删除以下行:

来自ImageView删除:

android:src="@mipmap/ic_launcher"

来自TextView删除:

android:text="My Item Title"