RecyclerView瀑布流式佈局、長按刪除

RecyclerView控件代替listview,比listview具有更多的屬性,比如刪除動畫等等,更有三種佈局任你挑選。因爲RecyclerView並沒自帶的item點擊事件,所以我們需要仿照listview一樣自己寫一個item的點擊事件。首先給出程序運行截圖:

接着開始貼出RecyclerView 的代碼:這個是我在一個項目中運用的RecyclerView控件而不是針對於它的demo,所以 只能貼出源碼,沒有源碼下載連接.

RecyclerView的xml文件的佈局:

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="49dp"
        android:background="#ee105a"
        android:orientation="horizontal">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

        <ImageView
            android:layout_width="109dp"
            android:layout_height="match_parent"
            android:background="@mipmap/siyifu"/>
        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

        <ImageButton
            android:id="@+id/imagebutton_fragmentgame_menu"
            android:layout_width="27dp"
            android:layout_height="match_parent"
            android:layout_marginRight="10dp"
            android:layout_marginTop="3dp"
            android:layout_marginBottom="3dp"
            android:background="@mipmap/maincaidan"/>

    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview_fragmentgame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>

item的佈局:

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

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imageview_item_recyclerviewgame"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"/>

    <!-- 圖片的size等於或者大於view的尺度大小centerCrop  -->
</LinearLayout>

Item_RecyclerViewGame文件是針對與item新建的一個屬性類:用來存放圖片的bitmap

/**
 * item的圖片。gamefragment的圖片。
 * Created by lwp on 2016/8/2.
 */
public class Item_RecyclerViewGame {

    private Bitmap bitmap_up;
    private Bitmap bitmap_back;

    public Bitmap getBitmap_back() {
        return bitmap_back;
    }

    public Bitmap getBitmap_up() {
        return bitmap_up;
    }

    public void setBitmap_back(Bitmap bitmap_back) {
        this.bitmap_back = bitmap_back;
    }

    public void setBitmap_up(Bitmap bitmap_up) {
        this.bitmap_up = bitmap_up;
    }
}

RecyclerViewGameAdapter是Recyclerview的適配器,處理數據並加載:

/**
 * 需求;寫recycleview的適配器
 * Created by lwp on 2016/8/3.
 */
public class RecyclerViewGameAdapter extends RecyclerView.Adapter<RecyclerViewGameAdapter.ViewHodle>{

    private List<Item_RecyclerViewGame> itemRecyclerViewGames;

    public RecyclerViewGameAdapter(List<Item_RecyclerViewGame> item_recyclerViewGames){
        super();
        this.itemRecyclerViewGames = item_recyclerViewGames;
    }

    @Override
    public ViewHodle onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.item_recyclerview_game,parent,false);
        ViewHodle viewHodle = new ViewHodle(view);
        return viewHodle;
    }

    @Override
    public int getItemCount() {
        return itemRecyclerViewGames.size();
    }

    @Override
    public void onBindViewHolder(ViewHodle holder, int position) {
        holder.imageView.setImageBitmap(itemRecyclerViewGames.get(position).getBitmap_up());
    }

    public static class ViewHodle extends RecyclerView.ViewHolder{

        private ImageView imageView;

        public ViewHodle(View view){
            super(view);
            imageView = (ImageView)view.findViewById(R.id.imageview_item_recyclerviewgame);
        }
    }

}

由於Recyclerview自身並沒有自帶item的點擊事件所以我們需要自己去寫一個它的點擊事件,即就產生了RecyclerItemClickListener文件:

/**
 * 需求:設置recyclerview的點擊事件,解決它的item的點擊事件處理問答題
 * Created by lwp on 2016/8/3.
 */
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener{

    public interface OnItemClickListener{
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    private OnItemClickListener mOnItemClickListener;
    private GestureDetector gestureDetector;

    public RecyclerItemClickListener(Context context,final RecyclerView recyclerView,OnItemClickListener onItemClickListener){
        mOnItemClickListener = onItemClickListener;
        gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public void onLongPress(MotionEvent e) {
                View view = recyclerView.findChildViewUnder(e.getX(),e.getY());
                if (view != null && mOnItemClickListener != null)
                    mOnItemClickListener.onItemLongClick(view,recyclerView.getChildPosition(view));
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        View view  = rv.findChildViewUnder(e.getX(),e.getY());
        if (view != null && mOnItemClickListener != null && gestureDetector.onTouchEvent(e)){
            mOnItemClickListener.onItemClick(view,rv.getChildPosition(view));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

}

最後主頁面數據的初始化及其展示即Game文件:

/**
 * Created by lwp on 2016/7/21.
 */
public class Game extends Fragment{

    private View rootView;
    public static ImageButton imageButton_fragmentGame_menu;

    private RecyclerView recyclerView;
    private List<Item_RecyclerViewGame> itemRecyclerViewGames;
    private RecyclerViewGameAdapter recyclerViewGameAdapter;


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

        rootView = (View)inflater.inflate(R.layout.fragment_game,container,false);
        //控件綁定
        isBinDing();
        //設置點擊事件
        isOnClickListener();

        //瀑布流失佈局設置
        StaggeredGridLayoutManager gridLayoutManager = new
                StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(gridLayoutManager);
        initRecyclerView();
        //創建適配器並且設置數據
        recyclerViewGameAdapter = new RecyclerViewGameAdapter(itemRecyclerViewGames);
        //設置adapter
        recyclerView.setAdapter(recyclerViewGameAdapter);
        //設置item增加刪除的動畫
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //設置間距
       // recyclerView.addItemDecoration(new SpaceItemDecoration(5));

//                Intent intent = new Intent(getActivity(), GamePinTuActivity.class);
//                startActivity(intent);

        recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(),recyclerView,
                new RecyclerItemClickListener.OnItemClickListener(){

                    @Override
                    public void onItemClick(View view, int position) {
                        Toast.makeText(getContext(),"您點擊了"+position,Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onItemLongClick(View view, int position) {
                        Toast.makeText(getContext(),"您長刪除了"+position,Toast.LENGTH_SHORT).show();
                        itemRecyclerViewGames.remove(position);
                        recyclerViewGameAdapter.notifyItemRemoved(position);
                        Log.e("長度----->",""+(itemRecyclerViewGames.size()));
                    }
                }));
        return rootView;
    }

    /**
     * 初始化recyclerview的數據設置
     */
    private void initRecyclerView() {
        itemRecyclerViewGames = new ArrayList<Item_RecyclerViewGame>();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.pintu1_up);
        for (int i = 0;i<20;i++) {
            Item_RecyclerViewGame item_recyclerViewGame = new Item_RecyclerViewGame();
            item_recyclerViewGame.setBitmap_up(bitmap);
            itemRecyclerViewGames.add(item_recyclerViewGame);
        }
    }

    /**
     * 控件的綁定
     */
    private void isBinDing(){
        imageButton_fragmentGame_menu = (ImageButton)rootView.findViewById(R.id.imagebutton_fragmentgame_menu);
        recyclerView = (RecyclerView)rootView.findViewById(R.id.recyclerview_fragmentgame);
    }

    /**
     * 控件的點擊事件的設置
     */
    private void isOnClickListener(){
        imageButton_fragmentGame_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

    }

}

到此代碼已經全部貼玩,有什麼意見可以留言指出。

發佈了61 篇原創文章 · 獲贊 43 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章