OkHttp和RecyclerView结合使用,包含添加,删除,分割线

来源:互联网 发布:免费淘宝模板代码 编辑:程序博客网 时间:2024/05/27 14:13

第一,先导入依赖包

compile 'com.squareup.okio:okio:1.5.0'
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    compile 'com.google.code.gson:gson:2.8.2'

第二,导入utils包

   五个类(GsonArrayCallback.java,GsonObjectCallback.java,NetWorkUtils.java,OkHttp3Utils.java,MyApp.java)

  注意:如果使用ImageLoader加载图片时,下面两行代码写到MyApp中

         

ImageLoaderConfiguration de=ImageLoaderConfiguration.createDefault(getApplicationContext());ImageLoader.getInstance().init(de);

第三,添加权限

 

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

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:id="@+id/activity_main"    android:layout_width="match_parent" android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.bwie.okhttp.MainActivity">    <Button        android:id="@+id/add"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="添加"        />    <android.support.v7.widget.RecyclerView        android:id="@+id/id_recyclerview"        android:layout_below="@id/add"        android:divider="#ffff0000"        android:dividerHeight="10dp"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>

item_home中:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content" >    <ImageView        android:id="@+id/image"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/id_num"        android:layout_width="match_parent"        android:layout_height="50dp"        android:gravity="center"        android:text="1" /></FrameLayout>

MainActivity中:

public class MainActivity extends AppCompatActivity {    String  mpath="http://api.tianapi.com/social/?key=71e58b5b2f930eaf1f937407acde08fe&num=20";    private RecyclerView mRecyclerView;    private List<NewBean.NewslistBean> mDatas;    private HomeAdapter mAdapter;    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);       boolean netWorkAvailable = NetWorkUtils.isNetWorkAvailable(this);        if (!netWorkAvailable) {            Toast.makeText(MainActivity.this, "联网:" + netWorkAvailable, Toast.LENGTH_SHORT).show();        }        mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);        //添加分割线        mRecyclerView.addItemDecoration(new DividerItemDecoration(               MainActivity.this, DividerItemDecoration.VERTICAL));        mRecyclerView.addItemDecoration(new DividerItemDecoration(                MainActivity.this, DividerItemDecoration.HORIZONTAL));        button= (Button) findViewById(R.id.add);//点击按钮添加    button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                mAdapter.addData(1);            }        });        getData();    }    private void getData()    {        OkHttp3Utils.getInstance().doGet(mpath, new GsonObjectCallback<NewBean>() {            @Override            public void onUi(NewBean newBean) {                //tv.setText(newBean.getNewslist().get(0).getTitle());               mDatas=newBean.getNewslist();                mAdapter = new HomeAdapter();//点击时删除      mAdapter.setOnItemClickLitener(new OnItemClickLitener()                {                    @Override                    public void onItemClick(View view, int position)                    {                        Toast.makeText(MainActivity.this, position + " click",                                Toast.LENGTH_SHORT).show();                        mAdapter.removeData(position);                    }                    @Override                    public void onItemLongClick(View view, int position)                    {                        Toast.makeText(MainActivity.this, position + " long click",                                Toast.LENGTH_SHORT).show();                       // mAdapter.removeData(position);                    }                });                mRecyclerView.setAdapter(mAdapter);               mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));//list            }            @Override            public void onFailed(Call call, IOException e) {            }        });    }    //RecyclerView   class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>    {        //条目点击        private OnItemClickLitener mOnItemClickLitener;        public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)        {            this.mOnItemClickLitener = mOnItemClickLitener;        }        @Override        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)        {            MyViewHolder holder = new MyViewHolder(LayoutInflater.from(                    MainActivity.this).inflate(R.layout.item_home, parent,                    false));            return holder;        }        @Override        public void onBindViewHolder(final MyViewHolder holder, final int position)        {            holder.tv.setText(mDatas.get(position).getTitle());            //ImageLoader imageLoader=ImageLoader.getInstance();            ImageLoader.getInstance().displayImage(mDatas.get(position).getPicUrl(),holder.imageView);            // 如果设置了回调,则设置点击事件            if (mOnItemClickLitener != null)            {                holder.itemView.setOnClickListener(new View.OnClickListener()                {                    @Override                    public void onClick(View v)                    {                        int pos = holder.getLayoutPosition();                        mOnItemClickLitener.onItemClick(holder.itemView, pos);                    }                });                holder.itemView.setOnLongClickListener(new View.OnLongClickListener()                {                    @Override                    public boolean onLongClick(View v)                    {                        int pos = holder.getLayoutPosition();                        mOnItemClickLitener.onItemLongClick(holder.itemView, pos);                        return false;                    }                });            }        }        @Override        public int getItemCount()        {            return mDatas.size();        }        class MyViewHolder extends RecyclerView.ViewHolder        {            TextView tv;            ImageView imageView;            public MyViewHolder(View view)            {                super(view);                tv = (TextView) view.findViewById(R.id.id_num);                imageView=(ImageView) view.findViewById(R.id.image);            }        }//添加数据时的方法      public void addData(int position) {            mDatas.add(position, new NewBean.NewslistBean("aaaa"));            notifyItemInserted(position);        }//删除数据时的方法        public void removeData(int position) {            mDatas.remove(position);            notifyItemRemoved(position);        }    }}

定义接口需要用到的类

public interface OnItemClickLitener {    void onItemClick(View view, int position);    void onItemLongClick(View view , int position);}

要添加分割线时,要先建个xml和class类:

divider_bgXML

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle"    android:layout_width="match_parent"    android:layout_height="match_parent">    <gradient        android:centerColor="#ff00ff00"        android:endColor="#ff0000ff"        android:startColor="#ffff0000"        android:type="linear" />    <size android:height="4dp"/></shape>

DividerGridItemDecoration类中

public class DividerGridItemDecoration extends RecyclerView.ItemDecoration{    private static final int[] ATTRS = new int[] { android.R.attr.listDivider };    private Drawable mDivider;    public DividerGridItemDecoration(Context context)    {        final TypedArray a = context.obtainStyledAttributes(ATTRS);        mDivider = a.getDrawable(0);        a.recycle();    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)    {        drawHorizontal(c, parent);        drawVertical(c, parent);    }    private int getSpanCount(RecyclerView parent)    {        // 列数        int spanCount = -1;        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();        if (layoutManager instanceof GridLayoutManager)        {            spanCount = ((GridLayoutManager) layoutManager).getSpanCount();        } else if (layoutManager instanceof StaggeredGridLayoutManager)        {            spanCount = ((StaggeredGridLayoutManager) layoutManager)                    .getSpanCount();        }        return spanCount;    }    public void drawHorizontal(Canvas c, RecyclerView parent)    {        int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++)        {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int left = child.getLeft() - params.leftMargin;            final int right = child.getRight() + params.rightMargin                    + mDivider.getIntrinsicWidth();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    public void drawVertical(Canvas c, RecyclerView parent)    {        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++)        {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                    .getLayoutParams();            final int top = child.getTop() - params.topMargin;            final int bottom = child.getBottom() + params.bottomMargin;            final int left = child.getRight() + params.rightMargin;            final int right = left + mDivider.getIntrinsicWidth();            mDivider.setBounds(left, top, right, bottom);            mDivider.draw(c);        }    }    private boolean isLastColum(RecyclerView parent, int pos, int spanCount,                                int childCount)    {        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();        if (layoutManager instanceof GridLayoutManager)        {            if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边            {                return true;            }        } else if (layoutManager instanceof StaggeredGridLayoutManager)        {            int orientation = ((StaggeredGridLayoutManager) layoutManager)                    .getOrientation();            if (orientation == StaggeredGridLayoutManager.VERTICAL)            {                if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边                {                    return true;                }            } else            {                childCount = childCount - childCount % spanCount;                if (pos >= childCount)// 如果是最后一列,则不需要绘制右边                    return true;            }        }        return false;    }    private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,                              int childCount)    {        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();        if (layoutManager instanceof GridLayoutManager)        {            childCount = childCount - childCount % spanCount;            if (pos >= childCount)// 如果是最后一行,则不需要绘制底部                return true;        } else if (layoutManager instanceof StaggeredGridLayoutManager)        {            int orientation = ((StaggeredGridLayoutManager) layoutManager)                    .getOrientation();            // StaggeredGridLayoutManager 且纵向滚动            if (orientation == StaggeredGridLayoutManager.VERTICAL)            {                childCount = childCount - childCount % spanCount;                // 如果是最后一行,则不需要绘制底部                if (pos >= childCount)                    return true;            } else            // StaggeredGridLayoutManager 且横向滚动            {                // 如果是最后一行,则不需要绘制底部                if ((pos + 1) % spanCount == 0)                {                    return true;                }            }        }        return false;    }    @Override    public void getItemOffsets(Rect outRect, int itemPosition,                               RecyclerView parent)    {        int spanCount = getSpanCount(parent);        int childCount = parent.getAdapter().getItemCount();        if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部        {            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);        } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边        {            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());        } else        {            outRect.set(0, 0, mDivider.getIntrinsicWidth(),                    mDivider.getIntrinsicHeight());        }    }}



原创粉丝点击