梯形+动画+ok请求数据+数据库缓存+

本文介绍了一个使用OkHttp进行网络请求并结合RecyclerView展示数据的安卓应用案例。文章详细描述了如何配置OkHttp依赖、实现RecyclerView的数据加载及刷新功能,同时展示了自定义ViewGroup和适配器的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

okhttp依赖:implementation 'com.squareup.okhttp3:okhttp:3.10.0'

RecyclerView依赖:
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'


权限:

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

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.example.com.yuekaomoni.MainActivity">


    <Button
        android:layout_width="450dp"
        android:layout_height="wrap_content"
        android:text="三角梯"
        android:background="#f9f5f9"/>

    <Button
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:id="@+id/but_add"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="+" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

  <com.example.com.yuekaomoni.MyViewGroup
        android:layout_width="match_parent"
        android:layout_marginTop="80dp"
      android:id="@+id/mygroup"
        android:layout_height="wrap_content">
       <!-- <TextView
            android:layout_width="155dp"
            android:layout_height="40dp"
            android:id="@+id/tv1"
            android:background="#f00"
            />
        <TextView
            android:layout_width="158dp"
            android:layout_height="40dp"
            android:id="@+id/tv2"
            android:background="#171818"
            />
        <TextView
            android:layout_width="158dp"
            android:layout_height="40dp"
            android:id="@+id/tv3"
            android:background="#0033ff"
            />
      <TextView
          android:layout_width="158dp"
          android:layout_height="40dp"
          android:id="@+id/tv4"
          android:background="#f00"
          />
      <TextView
          android:layout_width="158dp"
          android:layout_height="40dp"
          android:id="@+id/tv5"
          android:background="#171818"
          />
      <TextView
          android:layout_width="158dp"
          android:layout_height="40dp"
          android:id="@+id/tv6"
          android:background="#0033ff"
          />
-->
    </com.example.com.yuekaomoni.MyViewGroup>

    </LinearLayout>
   <!-- <com.example.com.yuekaomoni.MyViewGroup
        android:layout_width="match_parent"
        android:layout_marginTop="200dp"
        android:id="@+id/mygroup1"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="150dp"
            android:layout_height="40dp"

            android:background="#f00"
            />
        <TextView
            android:layout_width="150dp"
            android:layout_height="40dp"

            android:background="#02fac0"
            />
        <TextView
            android:layout_width="150dp"
            android:layout_height="40dp"

            android:background="#0033ff"
            />


    </com.example.com.yuekaomoni.MyViewGroup>-->


</RelativeLayout>


mainActivity:

package com.example.com.yuekaomoni;

import android.animation.ObjectAnimator;
import android.content.Intent;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private int i=0;
    private Button but_add;
    private int num=1;
    private MyViewGroup mygroup;
    private TextView tv1;


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


        getinit();
    }

    private void getinit() {
        but_add = findViewById(R.id.but_add);
        but_add.setOnClickListener(this);

        mygroup = findViewById(R.id.mygroup);



    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.but_add:
                i++;
              final TextView  textView = new TextView(this);
            textView.setText("条目"+i);
            textView.setHeight(55);
            textView.setWidth(220);
            if (i%3==1){
                textView.setBackgroundColor(Color.RED);
            }else if(i%3==2) {
                textView.setBackgroundColor(Color.BLACK);
            }else {
                textView.setBackgroundColor(Color.BLUE);
            }
             mygroup.addView(textView);
                float curTranslationX = textView.getTranslationX();
                ObjectAnimator animator = ObjectAnimator.ofFloat(textView, "translationX", curTranslationX, 500f, curTranslationX);
                animator.setDuration(5000);
                animator.start();


                textView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View view) {
                       mygroup.removeView(textView);
                        return true;
                    }
                });



                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                    startActivity(new Intent(MainActivity.this,Second.class));
                    }
                });
                break;
        }




    }
}

XRecycleView依赖:compile 'com.jcodecraeer:xrecyclerview:1.3.2' 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.com.yuekaomoni.Second">


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

    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:layout_width="match_parent"
        android:id="@+id/rv"
        android:layout_height="match_parent">


    </com.jcodecraeer.xrecyclerview.XRecyclerView>

    <!--<com.wuxiaolong.pullloadmorerecyclerview.PullLoadMoreRecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp" />-->
</LinearLayout>

第二个页面:
package com.example.com.yuekaomoni;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Log;
import android.widget.Toast;

import com.google.gson.Gson;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import com.wuxiaolong.pullloadmorerecyclerview.PullLoadMoreRecyclerView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class Second extends AppCompatActivity {
    private XRecyclerView rv;
    private MyRecycleViewAdapter myRecycleViewAdapter;
    private List<Reqbean.ResultBean.DataBean> list=new ArrayList<Reqbean.ResultBean.DataBean>();
    private int page=0;
    private boolean isRefresh = true;//判断是下啦刷新还是上啦加载
private String urldata="http://v.juhe.cn/toutiao/index?type=top&key=444da40ec8ee43818073d7131c2ffa8f&page="+page;
    private int type;
    private jsonshujudao jsonshujudao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        getinit();
        getdata();
        getdata();
        getinits();
    }
    private void getdata() {
        if (NetStateUtil.isConn(Second.this)) {
            okhttputil.doGet(urldata, new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {


                    Gson gson = new Gson();
                    String string = response.body().string();
                    Reqbean reqbean = gson.fromJson(string, Reqbean.class);

                    jsonshujudao.inserdata("aa",string);

                    final List<Reqbean.ResultBean.DataBean> data = reqbean.getResult().getData();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            myRecycleViewAdapter = new MyRecycleViewAdapter(Second.this, data);
                            rv.setAdapter(myRecycleViewAdapter);
                        }
                    });
                }
            });
        }else {
            Log.d("zzz","无网络,查询数据库中的数据");
            Toast.makeText(Second.this,"没有网络,稍后重试",Toast.LENGTH_SHORT).show();

            String querydata = jsonshujudao.querydata("aa");
            Toast.makeText(this, querydata, Toast.LENGTH_SHORT).show();
            Log.i("aa", "getdata: "+querydata);
        }
    }

    private void getinits() {

        rv.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                //当下拉刷新的时候,重新获取数据,所有curr要变回0,并且把集合list清空
                page=0;
                list.clear();
                getdata();
                rv.refreshComplete();

            }

            @Override
            public void onLoadMore() {
                page=page+5;
                getdata();
                rv.refreshComplete();

            }
        });
     /*   rv.setOnPullLoadMoreListener(new PullLoadMoreRecyclerView.PullLoadMoreListener() {
            @Override
            public void onRefresh() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                isRefresh = true;
                page=1;
                type =1;
               getdata();
                rv.setPullLoadMoreCompleted();
            }


        },1500);
            }

            @Override
            public void onLoadMore() {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {

                    type=2;
                    isRefresh = false;
                    page++;
                   getdata();

                    rv.setPullLoadMoreCompleted();

                }
            },1500);
            }
        });
    }*/
    }
    private void getinit() {

        rv = findViewById(R.id.rv);
        jsonshujudao = new jsonshujudao(this);

       /* rv.setPullLoadMoreCompleted();
        rv.setFooterViewText("loading");
        rv.setColorSchemeResources(android.R.color.holo_red_dark,android.R.color.holo_blue_dark);
        rv.setPullRefreshEnable(true);
        rv.setPushRefreshEnable(true);*/

        //布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
       rv.setLayoutManager(linearLayoutManager);
       // rv.setLinearLayout();

    }

}
自定义ViewGroup:
package com.example.com.yuekaomoni;

import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.HashSet;

/**
 * Created by 联想 on 2018/5/30.
 */




public class MyViewGroup extends ViewGroup {
    private HashSet mDatas;

    public MyViewGroup(Context context) {
        super(context);
    }

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    protected void onLayout(boolean b, int i, int i1, int i2, int i3) {

    }

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

        //测量子View的宽高,只有ViewFroup中有这个方法,直接继承自View是没有这个方法的
        measureChildren(widthMeasureSpec, heightMeasureSpec);
        //拿到子控件的个数
        int childCount = getChildCount();

        //定义一个临时高度
        int startHeight=0;
        int startWidth=0;
        //循环遍历出每一个View
        for(int a=0;a<childCount;a++){
            View v = getChildAt(a);
            //给每一个view设置自己的位置  上  右  下  左
            v.layout(startWidth,startHeight,startWidth+v.getMeasuredWidth(),startHeight+v.getMeasuredHeight());
            startHeight+=v.getMeasuredHeight();
            if ((a+1)%3==0){
                startWidth=0;
            }else {
            startWidth+=v.getMeasuredWidth();
}



        }


     /*   String rightButtonText = "+";
        if (!TextUtils.isEmpty(rightButtonText)) {
            titleBarRight.setText(rightButtonText);
            //设置左边按钮文字颜色
            int leftButtonTextColor = attributes.getColor(R.styleable.CustomTitleBar_right_button_text_color, Color.WHITE);
            titleBarRight.setTextColor(leftButtonTextColor);
        }*/


    }



  /*  public void removeAllViews(int i) {
        if(i != mDatas.size()){
        }
    }*/

}
适配器:
package com.example.com.yuekaomoni;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;

import java.util.List;

/**
 * Created by 联想 on 2018/5/30.
 */

class MyRecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final int TYPE_ONE=0;
    public static final int TYPE_TWO=1;
    private ViewHolder holder;
    private ViewHolder1 holder1;
    private DisplayImageOptions options;
     Context context;
    List<Reqbean.ResultBean.DataBean> data;


    public MyRecycleViewAdapter(Context context, List<Reqbean.ResultBean.DataBean> data) {
        this.context = context;
        this.data = data;

        options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)//使用内存缓存
                .cacheOnDisk(true)//使用磁盘缓存
                .showImageOnLoading(R.mipmap.ic_launcher)//设置正在下载的图片
                .showImageForEmptyUri(R.mipmap.ic_launcher)//url为空或请求的资源不存在时
                .showImageOnFail(R.mipmap.ic_launcher)//下载失败时显示的图片
                .bitmapConfig(Bitmap.Config.RGB_565)//设置图片色彩模式 1px=2字节
                .imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放模式
                .displayer(new RoundedBitmapDisplayer(100))//设置圆角 30代表半径 自定义
                .build();
    }



    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType==TYPE_ONE){
            View view=View.inflate(context,R.layout.view,null);
            holder = new ViewHolder(view);
            return holder;
        }else {
            View view1=View.inflate(context,R.layout.view1,null);
            holder1 = new ViewHolder1(view1);
            return holder1;


        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        if(holder instanceof ViewHolder){
            ((ViewHolder) holder).text.setText(data.get(position).getTitle());
            ImageLoader.getInstance().displayImage(data.get(position).getThumbnail_pic_s(),((ViewHolder) holder).image,options);

        }

        if (holder instanceof ViewHolder1){
            ((ViewHolder1) holder1).text1.setText(data.get(position).getAuthor_name());
            ImageLoader.getInstance().displayImage(data.get(position).getThumbnail_pic_s(),holder1.imgv1,options);
            ImageLoader.getInstance().displayImage(data.get(position).getThumbnail_pic_s02(),holder1.imgv2,options);
            ImageLoader.getInstance().displayImage(data.get(position).getThumbnail_pic_s03(),holder1.imgv3,options);
        }
    }
    @Override
    public int getItemCount() {
        return data.size();
    }
    @Override
    public int getItemViewType(int position) {
        if (position%2==0){
            return TYPE_ONE;
        }else {
            return TYPE_TWO;
        }
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        private final ImageView image;
        private final TextView text;

        public ViewHolder(View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.img);
            text = itemView.findViewById(R.id.tv);
        }


    }
    class ViewHolder1 extends RecyclerView.ViewHolder{

        private final ImageView imgv1;
        private final ImageView imgv2;
        private final ImageView imgv3;
        private final TextView text1;

        public ViewHolder1(View itemView) {
            super(itemView);
            text1 = itemView.findViewById(R.id.tv1);
            imgv1 = itemView.findViewById(R.id.imgv1);
            imgv2 = itemView.findViewById(R.id.imgv2);
            imgv3 = itemView.findViewById(R.id.imgv3);
        }
    }

}

多条目控件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">


    <ImageView
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/a"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv"
        android:text="fdsfdsfds"/>

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


    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_marginTop="10dp"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/imgv1"
            android:layout_width="80dp"
            android:layout_weight="0"
            android:layout_height="80dp" />

        <ImageView
            android:id="@+id/imgv2"
            android:layout_width="80dp"
            android:layout_weight="0"
            android:layout_height="80dp" />

        <ImageView
            android:id="@+id/imgv3"
            android:layout_width="80dp"
            android:layout_weight="0"
            android:layout_height="80dp" />

    </LinearLayout>
</LinearLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值