Cloud9527
Alex_赵
Struggle
shixinzhang
通过反编译介绍四种内部类
结合实战介绍内部类的使用场景
抽象类和接口 (完成)
内部类
修饰符
装箱拆箱
注解
反射
泛型
异常(完成)
集合
IO
字符串
其他
public class VideoListActivity extends AppCompatActivity{
private ListView mVideoListView;
private BaseAdapter mListAdapter;
private List mVideoInfoData;
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_list);
mVideoListView = (ListView) findViewById(R.id.video_list);
mVideoInfoData = Collections.EMPTY_LIST;
mListAdapter = new VideoListAdapter();
mVideoListView.setAdapter(mListAdapter);
}
//这里的 private 内部类说明这个 adapter 只能在当前类中使用
private class VideoListAdapter extends BaseAdapter {
@Override
public int getCount() {
return mVideoInfoData.size(); //访问外部类数据
}
@Override
public Object getItem(final int position) {
return mVideoInfoData.get(position); //访问外部类数据
}
@Override
public long getItemId(final int position) {
return 0;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
return null;
}
}
}
public class MultiplexViewActivity extends AppCompatActivity {
public static final String DATA_VIEW_TYPE = "view_type";
public static final int TYPE_LOGIN = 1;
public static final int TYPE_REGISTER = 2;
private TextView mTitleTv;
private ViewController mViewController;
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multiplex_view);
int type = getIntent().getIntExtra(DATA_VIEW_TYPE, TYPE_LOGIN);
mViewController = getViewController(type);
initView();
}
//外界只能拿到基类,具体实现隐藏
public ViewController getViewController(final int type) {
switch (type) {
case TYPE_REGISTER:
return new RegisterViewController();
case TYPE_LOGIN:
default:
return new LoginViewController();
}
}
private void initView() {
mTitleTv = (TextView) findViewById(R.id.multiplex_title_tv);
mViewController.initUi();
}
/**
* 定义操作规范
*/
private interface ViewController {
void initUi();
void loadData();
}
private class LoginViewController implements ViewController {
@Override
public void initUi() {
mTitleTv.setText("登录");
//显示登录需要的布局
}
@Override
public void loadData() {
//加载登录需要的数据
}
}
private class RegisterViewController implements ViewController {
@Override
public void initUi() {
mTitleTv.setText("注册");
//显示注册需要的布局
}
@Override
public void loadData() {
//加载注册需要的数据
}
}
}
ViewGroup.LayoutParams
WindowManager.LayoutParams
继承上一层
RelativeLayout.LayoutParams
...
public interface WindowManager extends ViewManager {
//...
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
//...
}
}
public void setLayoutParams(ViewGroup.LayoutParams params) {
if (params == null) {
throw new NullPointerException("Layout parameters cannot be null");
}
mLayoutParams = params;
resolveLayoutParams();
if (mParent instanceof ViewGroup) {
((ViewGroup) mParent).onSetLayoutParams(this, params);
}
requestLayout();
}
public class LocationManager{
private static class ClassHolder {
private static final LocationManager instance = new LocationManager();
}
public static LocationManager getInstance() {
return ClassHolder.instance;
}
}
懒加载:类加载时不会创建实例,只有当 getInstance()
方法被调用时才去加载静态内部类以及其中持有的 LocationManager
实例
线程安全:JVM 加载类时,可以确保 instance
变量只能初始化一次
mButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //... } });
public class GirlFriendMaker {
public interface GirlFriend {
void sayHi();
}
public static GirlFriend giveMeAGirlFriend(final String name) {
return new GirlFriend() { //匿名内部类
@Override
public void sayHi() {
Log.i("来自女朋友的问候", "Hello I'm " + name);
}
};
}
}
public class MainActivity extends AppCompatActivity {
public final int LOGIN_SUCCESS = 1;
private Context mContext;
private boolean isLongTimeNoMsg;
@SuppressWarnings("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
isLongTimeNoMsg = false;
switch (msg.what) {
case LOGIN_SUCCESS: {/
break;
}
//...
}
}
需要用一个类来解决一个复杂的问题,但是又不希望这个类是公共的
需要实现一个接口,但不需要持有它的引用