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());
}
}
}
然后你可以看到适配器里面用到泛型去定义参数,返回值的地方:

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

到底我们一个基本的展示图片的通用的适配器就定义好了,用法也比较简单:
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)的通用网络请求....
网友评论