Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save wszdwp/95e8900ea8b5bbb69b11f735b39e63c9 to your computer and use it in GitHub Desktop.
Save wszdwp/95e8900ea8b5bbb69b11f735b39e63c9 to your computer and use it in GitHub Desktop.

Revisions

  1. @skyfishjy skyfishjy revised this gist Dec 24, 2014. 1 changed file with 0 additions and 16 deletions.
    16 changes: 0 additions & 16 deletions CursorRecyclerViewAdapter.java
    Original file line number Diff line number Diff line change
    @@ -1,19 +1,3 @@
    /*
    * Copyright (C) 2013 The Android Open Source Project
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */

    /*
    * Copyright (C) 2014 [email protected]
    *
  2. @skyfishjy skyfishjy revised this gist Oct 31, 2014. 1 changed file with 33 additions and 0 deletions.
    33 changes: 33 additions & 0 deletions CursorRecyclerViewAdapter.java
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,36 @@
    /*
    * Copyright (C) 2013 The Android Open Source Project
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */

    /*
    * Copyright (C) 2014 [email protected]
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    *
    */

    import android.content.Context;
    import android.database.Cursor;
    import android.database.DataSetObserver;
  3. @skyfishjy skyfishjy created this gist Oct 31, 2014.
    128 changes: 128 additions & 0 deletions CursorRecyclerViewAdapter.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,128 @@
    import android.content.Context;
    import android.database.Cursor;
    import android.database.DataSetObserver;
    import android.support.v7.widget.RecyclerView;

    /**
    * Created by skyfishjy on 10/31/14.
    */

    public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {

    private Context mContext;

    private Cursor mCursor;

    private boolean mDataValid;

    private int mRowIdColumn;

    private DataSetObserver mDataSetObserver;

    public CursorRecyclerViewAdapter(Context context, Cursor cursor) {
    mContext = context;
    mCursor = cursor;
    mDataValid = cursor != null;
    mRowIdColumn = mDataValid ? mCursor.getColumnIndex("_id") : -1;
    mDataSetObserver = new NotifyingDataSetObserver();
    if (mCursor != null) {
    mCursor.registerDataSetObserver(mDataSetObserver);
    }
    }

    public Cursor getCursor() {
    return mCursor;
    }

    @Override
    public int getItemCount() {
    if (mDataValid && mCursor != null) {
    return mCursor.getCount();
    }
    return 0;
    }

    @Override
    public long getItemId(int position) {
    if (mDataValid && mCursor != null && mCursor.moveToPosition(position)) {
    return mCursor.getLong(mRowIdColumn);
    }
    return 0;
    }

    @Override
    public void setHasStableIds(boolean hasStableIds) {
    super.setHasStableIds(true);
    }

    public abstract void onBindViewHolder(VH viewHolder, Cursor cursor);

    @Override
    public void onBindViewHolder(VH viewHolder, int position) {
    if (!mDataValid) {
    throw new IllegalStateException("this should only be called when the cursor is valid");
    }
    if (!mCursor.moveToPosition(position)) {
    throw new IllegalStateException("couldn't move cursor to position " + position);
    }
    onBindViewHolder(viewHolder, mCursor);
    }

    /**
    * Change the underlying cursor to a new cursor. If there is an existing cursor it will be
    * closed.
    */
    public void changeCursor(Cursor cursor) {
    Cursor old = swapCursor(cursor);
    if (old != null) {
    old.close();
    }
    }

    /**
    * Swap in a new Cursor, returning the old Cursor. Unlike
    * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em>
    * closed.
    */
    public Cursor swapCursor(Cursor newCursor) {
    if (newCursor == mCursor) {
    return null;
    }
    final Cursor oldCursor = mCursor;
    if (oldCursor != null && mDataSetObserver != null) {
    oldCursor.unregisterDataSetObserver(mDataSetObserver);
    }
    mCursor = newCursor;
    if (mCursor != null) {
    if (mDataSetObserver != null) {
    mCursor.registerDataSetObserver(mDataSetObserver);
    }
    mRowIdColumn = newCursor.getColumnIndexOrThrow("_id");
    mDataValid = true;
    notifyDataSetChanged();
    } else {
    mRowIdColumn = -1;
    mDataValid = false;
    notifyDataSetChanged();
    //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter
    }
    return oldCursor;
    }

    private class NotifyingDataSetObserver extends DataSetObserver {
    @Override
    public void onChanged() {
    super.onChanged();
    mDataValid = true;
    notifyDataSetChanged();
    }

    @Override
    public void onInvalidated() {
    super.onInvalidated();
    mDataValid = false;
    notifyDataSetChanged();
    //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter
    }
    }
    }
    41 changes: 41 additions & 0 deletions MyListCursorAdapter.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,41 @@
    import android.content.Context;
    import android.database.Cursor;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    import java.util.List;

    /**
    * Created by skyfishjy on 10/31/14.
    */
    public class MyListCursorAdapter extends CursorRecyclerViewAdapter<MyListCursorAdapter.ViewHolder>{

    public MyListCursorAdapter(Context context,Cursor cursor){
    super(context,cursor);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView mTextView;
    public ViewHolder(View view) {
    super(view);
    mTextView = view.findViewById(R.id.text);
    }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
    .inflate(R.layout.my_view, parent, false);
    ViewHolder vh = new ViewHolder(itemView);
    return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {
    MyListItem myListItem = MyListItem.fromCursor(cursor);
    viewHolder.mTextView.setText(myListItem.getName());
    }
    }
    14 changes: 14 additions & 0 deletions MyListItem.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,14 @@
    public class MyListItem{
    private String name;

    public void setName(String name){
    this.name=name;
    }
    public String getName(){
    return name;
    }

    public static MyListItem fromCursor(Cursor cursor) {
    //TODO return your MyListItem from cursor.
    }
    }