美文网首页 Android知识进阶(遥远的重头开始)
Android-Java-泛型-总得有个开始的篇

Android-Java-泛型-总得有个开始的篇

作者: MonkeyLei | 来源:发表于2019-07-12 09:39 被阅读7次

Intentfilter, 自定义View本来要开始的,最近事情多,学习任务也多。另外还得帮网友验证一些问题,还得总结之前遗漏的好多知识点和问题,所以一直还没开始妮。这篇也是帮网友验证过程中觉得还是得记录下,作为开山篇,后面接着就可以铺开相关知识点,所以记录下先。

我有一种感受,经过和兄弟一起分析设计模式,然后经过几个公有私有项目的锻炼,项目结构上越来越完善了,封装性相对好多了。不过mvp里面网络请求的类还是太多,封装性还是不够,应该是可以更简单的。继续加油吧。。。

泛型了,这个东东确实不错! 很多框架的封装集成很多时候就需要靠这个泛型来做,因为你不知道传入的参数到底是什么类型,你也不可能为了几百个不同类型的数据(这些数据又有共同的处理),这个时候你就可以利用泛型来作为参数,当具体需要什么参数的时候给定具体的参数即可!

我们在做一些算法的时候可能涉及到数据交换的操作,交换的数据类型可能是int, string, double, long等.这个时候你确实可以

    public void swap_me(int a, int b){

    }
    public void swap_me(String a, String b){

    }
    public void swap_me(double a, double b){

    }

但是这样的话,无疑增加了代码。如果就一个方法可以搞定,岂不是更好么,这个时候就可以泛型的时间了!

    public static <T> void swap(T a, T b, T[] tt){
        T temp = a;
        a = b;
        b = temp;
        tt[0] = a;
        tt[1] = b;
    }

由于Java没有像C语言那样的指针,我们只能讲交换的值存储到入参数组里面,进而获得交换的值,你可以用对象的方式返回,总之变量内部是无法进行值更改的啦。

看到上面我们引用的用法了吧。这是函数的引用基本用法,使用如下:

    public class dfdfds {
    public static void main(String[] args){
        int a = 1, b  =3;
        System.out.println("a=" + a + " b = " + b);
        Integer[] tt = new Integer[2];
        swap(a, b, tt);
        System.out.println("a=" + tt[0] + " b = " + tt[1]);

        String as = "1", bs  = "3";
        System.out.println("a=" + as + " b = " + bs);
        String[] tts = new String[2];
        swap(as, bs, tts);
        System.out.println("a=" + tts[0] + " b = " + tts[1]);
    }

    public static <T> void swap(T a, T b, T[] tt){
        T temp = a;
        a = b;
        b = temp;
        tt[0] = a;
        tt[1] = b;
    }

    public void swap_me(int a, int b){

    }
    public void swap_me(String a, String b){

    }
    public void swap_me(double a, double b){

    }
}

泛型就是这么帅,有没有。以前老是用很多方法,老是觉得看别人的通用适配器费劲。当然我们这里只是方法的,还有类相关的泛型。总是泛型还有好些个知识点,后面我们逐渐拨开...

然后我们立即来看通用适配器(假设我们的Recycleview目前就是展示图片,别的可以按需扩展,没关系):

1. 我们先定义一个标准接口,该接口提供一个getImage()的方法,专门用来获取图片资源id

   public interface BaseT {
    public int getImage();
}

2.看下布局文件

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

    <ImageView
        android:id="@+id/pri_smallIv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher_sb"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

2. 然后泛型T的定义就可以继承该接口了

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.ImageView;

import com.example.lieyun_android.myapplication.R;

import java.lang.ref.WeakReference;
import java.util.List;

public class PicTvRecAdapter<T extends BaseT> extends RecyclerView.Adapter<PicTvRecAdapter.ContentViewHolder<T>> {
    private List<T> dataList = null;
    private WeakReference<Context> contextWeakReference;

    public PicTvRecAdapter(Context context, List<T> dataList){
        this.contextWeakReference = new WeakReference<>(context);
        this.dataList = dataList;
    }

    @Override
    public ContentViewHolder<T> onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(contextWeakReference.get()).inflate(R.layout.pictv_recadapter_item, parent, false);
        return new ContentViewHolder<T>(view);
    }

    @Override
    public void onBindViewHolder(ContentViewHolder<T> holder, int position) {
        holder.bindData(dataList.get(position));
        ///< Then, 可以做事件指针存储
    }

    @Override
    public int getItemCount() {
        return (null == dataList) ? 0 : dataList.size();
    }

    /**
     * 内容持有
     * @param <T>
     */
    static class ContentViewHolder<T extends BaseT> extends RecyclerView.ViewHolder{
        public ImageView smallIv;

        public ContentViewHolder(View itemView) {
            super(itemView);
            smallIv = itemView.findViewById(R.id.pri_smallIv);
        }

        public void bindData(T data){
            smallIv.setImageResource(data.getImage());
        }
    }
}

然后你可以看到适配器里面用到泛型去定义参数,返回值的地方:

image

其中 T **extends **BaseT 说明了这个类型是一个继承了BaseT的泛型对象,因此它拥有了getImage方法:

image

到底我们一个基本的展示图片的通用的适配器就定义好了,用法也比较简单:

a。先看数据类型对象

     public class PicDataBean implements BaseT {
    private int resourceId;

    public PicDataBean(int resourceId) {
        this.resourceId = resourceId;
    }

    public void setResourceId(int resourceId) {
        this.resourceId = resourceId;
    }

    @Override
    public int getImage() {
        return resourceId;
    }
}

我们把getResourceId替换为getImage,用来获取资源id。

b.然后重点是创建适配器的地方

new PicTvRecAdapter<PicDataBean>(this, picDataBeanList);

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.example.lieyun_android.myapplication.R;
import com.example.mylibrary.ButterKnife;

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

public class MainFFActivity extends AppCompatActivity {

    public RecyclerView rva;
    public RecyclerView rvb;
    public RecyclerView rvc;
    public RecyclerView rvd;

    private PicTvRecAdapter<PicDataBean> picTvRecAdapterA;
    private PicTvRecAdapter<PicDataBean> picTvRecAdapterB;
    private PicTvRecAdapter<PicDataBean> picTvRecAdapterC;
    private PicTvRecAdapter<PicDataBean> picTvRecAdapterD;
    private List<PicDataBean> picDataBeanList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mainffff);
        ButterKnife.bind(this);

        picDataBeanList.add(new PicDataBean(R.drawable.ic_launcher_sb));
        picDataBeanList.add(new PicDataBean(R.drawable.ic_launcher_sb));
        picDataBeanList.add(new PicDataBean(R.drawable.ic_launcher_sb));
        picDataBeanList.add(new PicDataBean(R.drawable.ic_launcher_sb));

        picTvRecAdapterA = new PicTvRecAdapter<PicDataBean>(this, picDataBeanList);
        picTvRecAdapterB = new PicTvRecAdapter<PicDataBean>(this, picDataBeanList);
        picTvRecAdapterC = new PicTvRecAdapter<PicDataBean>(this, picDataBeanList);
        picTvRecAdapterD = new PicTvRecAdapter<PicDataBean>(this, picDataBeanList);

        FullyLinearLayoutManager linearLayoutManager = new FullyLinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

        FullyLinearLayoutManager linearLayoutManagerb = new FullyLinearLayoutManager(this);
        linearLayoutManagerb.setOrientation(LinearLayoutManager.HORIZONTAL);

        FullyLinearLayoutManager linearLayoutManagerc = new FullyLinearLayoutManager(this);
        linearLayoutManagerc.setOrientation(LinearLayoutManager.HORIZONTAL);

        FullyLinearLayoutManager linearLayoutManagerd = new FullyLinearLayoutManager(this);
        linearLayoutManagerd.setOrientation(LinearLayoutManager.HORIZONTAL);

        rva = findViewById(R.id.amaaa_rva);
        rvb = findViewById(R.id.amaaa_rvb);
        rvc = findViewById(R.id.amaaa_rvc);
        rvd = findViewById(R.id.amaaa_rvd);

        rva.setLayoutManager(linearLayoutManager);
        rvb.setLayoutManager(linearLayoutManagerb);
        rvc.setLayoutManager(linearLayoutManagerc);
        rvd.setLayoutManager(linearLayoutManagerd);

        rva.setNestedScrollingEnabled(false);
        rvb.setNestedScrollingEnabled(false);
        rvc.setNestedScrollingEnabled(false);
        rvd.setNestedScrollingEnabled(false);

        rva.setAdapter(picTvRecAdapterA);
        rvb.setAdapter(picTvRecAdapterB);
        rvc.setAdapter(picTvRecAdapterC);
        rvd.setAdapter(picTvRecAdapterD);
    }

这里面是scrollview套了rec,所以加了setNestedScrollingEnabled方法。顺便说下而已。。

这一次开始篇不太一样,我们直接摆出了案例,连泛型经典的List都没摆出来,主要是因为帮网友做验证,直接就整了。所以先来总结下,这次概念都还没摆出来妮。。好吧,这是不同的开场,,后面我们会逐渐展开,以及最后看看如何利用泛型高度封装mvp(retrofit+rxjva+fastjson)的通用网络请求....

相关文章

网友评论

    本文标题:Android-Java-泛型-总得有个开始的篇

    本文链接:https://www.haomeiwen.com/subject/hqwskctx.html