RecycleView 进阶一

RecycleView可以很轻松的完成在listView和GridView之间的切换,基本上listView和GridView的各种效果也可以实现。这里不说废话,首先提供一个好用gift在线工具http://gif.55.la/
这里进入正题,我这里使用recycleView做一个左图右字的列表示例,左滑删除item的示例,代码如下:

1,先要在app/build.gradle文件中添加如下代码:

compile 'com.android.support:recyclerview-v7:25.2.0'
  • 1

这里说明一点,如果因为这里使用的库版本号和SDK版本不符合,可以直接使用option + enter进行快捷修改;

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.gyq.recyclerviewdelete.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:background="#EEEEEE"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:overScrollMode="never"/>

</RelativeLayout>

layout_item.xml

<?xml version="1.0" encoding="utf-8"?>
<com.gyq.recyclerviewdelete.view.SlidingButtonView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@android:color/white"
    android:layout_marginBottom="1dp"
    >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <TextView
            android:id="@+id/tv_delete"
            android:layout_height="match_parent"
            android:layout_width="80dp"
            android:gravity="center"
            android:layout_toRightOf="@+id/layout_content"
            android:text="删 除"
            android:background="@drawable/btn_click_red_havebackground"
            android:textColor="#DDFFFFFF"
            />
        <LinearLayout
            android:id="@+id/layout_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:layout_gravity="center_vertical"
                android:src="@drawable/dog"/>
            <TextView
                android:id="@+id/text"
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                android:gravity="center_vertical"
                android:textSize="30sp"
                android:textColor="#DD000000"
                android:background="@drawable/btn_click_black_havebackground"
                />
        </LinearLayout>

    </RelativeLayout>
</com.gyq.recyclerviewdelete.view.SlidingButtonView>

注释:布局中用到的drawable文件,如下: 
btn_click_black_havebackground.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true">
        <layer-list >
            <item >
                <shape >
                    <solid android:color="@android:color/white"/>
                </shape>
            </item>
            <item >
                <shape >
                    <solid android:color="#22000000"/>
                </shape>
            </item>
        </layer-list>
    </item>
    <item >
        <shape >
            <solid android:color="@android:color/white"/>
        </shape>
    </item>
</selector>

btn_click_red_havebackground.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true">
        <layer-list >
            <item >
                <shape >
                    <solid android:color="#FF0000"/>
                </shape>
            </item>
            <item >
                <shape >
                    <solid android:color="#22000000"/>
                </shape>
            </item>
        </layer-list>
    </item>
    <item >
        <shape >
            <solid android:color="#FF0000"/>
        </shape>
    </item>
</selector>

2,自定义view

package com.gyq.recyclerviewdelete.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;
import android.widget.TextView;

import com.gyq.recyclerviewdelete.R;

/**
 * Created by gyq on 2017/3/27 17:01
 */
public class SlidingButtonView extends HorizontalScrollView {
    private TextView mTextView_Delete;

    private int mScrollWidth;

    private IonSlidingButtonListener mIonSlidingButtonListener;

    private Boolean isOpen = false;
    private Boolean once = false;


    public SlidingButtonView(Context context) {
        this(context, null);
    }

    public SlidingButtonView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public SlidingButtonView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        this.setOverScrollMode(OVER_SCROLL_NEVER);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        if(!once){
            mTextView_Delete = (TextView) findViewById(R.id.tv_delete);
            once = true;
        }

    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if(changed){
            this.scrollTo(0,0);
            //获取水平滚动条可以滑动的范围,即右侧按钮的宽度
            mScrollWidth = mTextView_Delete.getWidth();
           // Log.i("asd", "mScrollWidth:" + mScrollWidth);
        }

    }


    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                mIonSlidingButtonListener.onDownOrMove(this);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                changeScrollx();
                return true;
            default:
                break;
        }
        return super.onTouchEvent(ev);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        mTextView_Delete.setTranslationX(l - mScrollWidth);
    }

    /**
     * 按滚动条被拖动距离判断关闭或打开菜单
     */
    public void changeScrollx(){
        if(getScrollX() >= (mScrollWidth/2)){
            this.smoothScrollTo(mScrollWidth, 0);
            isOpen = true;
            mIonSlidingButtonListener.onMenuIsOpen(this);
        }else{
            this.smoothScrollTo(0, 0);
            isOpen = false;
        }
    }


    /**
     * 关闭菜单
     */
    public void closeMenu()
    {
        if (!isOpen){
            return;
        }
        this.smoothScrollTo(0, 0);
        isOpen = false;
    }




    public void setSlidingButtonListener(IonSlidingButtonListener listener){
        mIonSlidingButtonListener = listener;
    }

    public interface IonSlidingButtonListener{
        void onMenuIsOpen(View view);
        void onDownOrMove(SlidingButtonView slidingButtonView);
    }
}

4,适配器

package com.gyq.recyclerviewdelete.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.gyq.recyclerviewdelete.R;
import com.gyq.recyclerviewdelete.utils.Utils;
import com.gyq.recyclerviewdelete.view.SlidingButtonView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by gyq on 2017/3/27 15:44
 */
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.SimpleHolder> implements SlidingButtonView.IonSlidingButtonListener {
    private Context mContext;
    private List<String> mDatas = new ArrayList<>();

    private IonSlidingViewClickListener mIDeleteBtnClickListener;

    private SlidingButtonView mMenu;

    public RecyclerAdapter(Context context) {
        mContext = context;

        for (int i = 0; i < 10; i++) {
            mDatas.add(i+".世界最可爱的小狗");
        }
    }


    @Override
    public SimpleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        /*if (mContext == null) {
            mContext = parent.getContext();
        }*/
        View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item, parent, false);
        return new SimpleHolder(view);
    }

    @Override
    public void onBindViewHolder(final SimpleHolder holder, int position) {
        holder.mText.setText(mDatas.get(position));

        holder.layout_content.getLayoutParams().width = Utils.getScreenWidth(mContext);

        holder.mText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext,",,,,....",Toast.LENGTH_SHORT).show();
                //判断是否有删除菜单打开
                if (menuIsOpen()) {
                    closeMenu();//关闭菜单
                } else {
                    int n = holder.getLayoutPosition();
                    mIDeleteBtnClickListener.onItemClick(view, n);
                }
            }
        });

        holder.tv_Delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext,",,,,....ddddd",Toast.LENGTH_SHORT).show();
                int n = holder.getLayoutPosition();

                mIDeleteBtnClickListener.onDeleteBtnCilck(view,n);
            }
        });
    }

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

    class SimpleHolder extends  RecyclerView.ViewHolder {
        public TextView tv_Delete;
        public TextView mText;
        public LinearLayout layout_content;
        public SimpleHolder(View itemView) {
            super(itemView);

            tv_Delete = (TextView)itemView.findViewById(R.id.tv_delete);

            mText = (TextView)itemView.findViewById(R.id.text);

            layout_content = (LinearLayout)itemView.findViewById(R.id.layout_content);

            ((SlidingButtonView)itemView).setSlidingButtonListener(RecyclerAdapter.this);
        }


    }

    public void addData(int position) {
        mDatas.add(position, "添加项");
        notifyItemInserted(position);
    }

    public void removeData(int position){
        mDatas.remove(position);
        notifyDataSetChanged();

    }

    @Override
    public void onMenuIsOpen(View view) {
        mMenu = (SlidingButtonView) view;
    }

    @Override
    public void onDownOrMove(SlidingButtonView slidingDeleteView) {
        if(menuIsOpen()){
            if(mMenu != slidingDeleteView){
                closeMenu();
            }
        }
    }

    /**
     * 关闭菜单
     */
    public void closeMenu() {
        mMenu.closeMenu();
        mMenu = null;

    }
    /**
     * 判断是否有菜单打开
     */
    public Boolean menuIsOpen() {
        if(mMenu != null){
            return true;
        }
        return false;
    }

    public void setOnSlidListener(IonSlidingViewClickListener listener) {
        mIDeleteBtnClickListener = listener;
    }

    public interface IonSlidingViewClickListener {
        void onItemClick(View view,int position);
        void onDeleteBtnCilck(View view,int position);
    }
}

5,MainActivity.class

package com.gyq.recyclerviewdelete;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;

import com.gyq.recyclerviewdelete.adapter.RecyclerAdapter;

public class MainActivity extends AppCompatActivity implements RecyclerAdapter.IonSlidingViewClickListener {
    private RecyclerView mRecyclerView;
    private RecyclerAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        updateUI();

    }

    private void updateUI() {
        if (mAdapter == null) {
            mAdapter = new RecyclerAdapter(this);
            mRecyclerView.setAdapter(mAdapter);
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        }else {
            mAdapter.notifyDataSetChanged();
        }

       mAdapter.setOnSlidListener(this);
    }

    private void initView() {
        mRecyclerView = (RecyclerView)findViewById(R.id.recycler_view);

    }


    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(MainActivity.this,"......" + position,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDeleteBtnCilck(View view, int position) {
        mAdapter.removeData(position);

    }
}

6,工具类:

package com.gyq.recyclerviewdelete.utils;

import android.content.Context;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.WindowManager;

/**
 * Created by gyq on 2015/7/25.
 */
public class Utils {


    /**
     * dpתpx
     * @param context
     * @param dp
     * @return
     */
    public static int dp2px(Context context,float dp)
    {
        return (int ) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dp, context.getResources().getDisplayMetrics());
    }

    public static int getScreenWidth(Context context)
    {
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE );
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics( outMetrics);
        return outMetrics .widthPixels ;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

整个的代码到这里就完全贴完了。




1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值