Skip to content

Commit

Permalink
support viewpager
Browse files Browse the repository at this point in the history
  • Loading branch information
cgspine committed Oct 12, 2019
1 parent b1848ee commit 9f3c7a8
Show file tree
Hide file tree
Showing 5 changed files with 313 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public QMUIPagerAdapter() {

@Override
@NonNull
public final Object instantiateItem(@NonNull ViewGroup container, int position) {
public Object instantiateItem(@NonNull ViewGroup container, int position) {
Object item = mScrapItems.get(position);
if (item == null) {
item = hydrate(container, position);
Expand Down
29 changes: 23 additions & 6 deletions qmuidemo-skin-code-generator-source
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,29 @@ QDArchTestFragment,ref,mBtn,background:app_skin_common_background
QDArchTestFragment,method,mHolder,QDArchTestFragment_mHolder
QDArchTestFragment,id,com.qmuiteam.qmuidemo.R.id.test_only_id,background:app_skin_common_background_1@getView()
;
com.qmuiteam.qmuidemo.fragment.components.QDCollapsingTopBarLayoutFragment
QDCollapsingTopBarLayoutFragment,adapter,mRecyclerView,QDCollapsingTopBarLayoutFragment_mRecyclerView
com.qmuiteam.qmuidemo.fragment.home.HomeFragment$1
HomeFragment_mViewPager,p,com.qmuiteam.qmuidemo.fragment.home.HomeLabController,HomeFragment_mViewPager_HomeLabController
HomeFragment_mViewPager,p,com.qmuiteam.qmuidemo.fragment.home.HomeUtilController,HomeFragment_mViewPager_HomeUtilController
HomeFragment_mViewPager,p,com.qmuiteam.qmuidemo.fragment.home.HomeComponentsController,HomeFragment_mViewPager_HomeComponentsController
;
com.qmuiteam.qmuidemo.adaptor.QDRecyclerViewAdapter$ViewHolder
QDCollapsingTopBarLayoutFragment_mRecyclerView_RelativeLayout,ref,mTextView,background:app_skin_common_background
com.qmuiteam.qmuidemo.base.RecyclerViewHolder
HomeFragment_mViewPager_HomeUtilController_recyclerView_LinearLayout,ref,itemView,background:app_skin_btn_test_border_single
HomeFragment_mViewPager_HomeComponentsController_recyclerView_LinearLayout,ref,itemView,background:app_skin_home_text_color
;
com.qmuiteam.qmuidemo.adaptor.QDRecyclerViewAdapter
com.qmuiteam.qmuidemo.adaptor.QDRecyclerViewAdapter$ViewHolder,c,RelativeLayout,QDCollapsingTopBarLayoutFragment_mRecyclerView_RelativeLayout
com.qmuiteam.qmuidemo.fragment.home.HomeFragment
HomeFragment,adapter,mViewPager,HomeFragment_mViewPager
;
com.qmuiteam.qmuidemo.fragment.home.HomeController$ItemAdapter
com.qmuiteam.qmuidemo.base.RecyclerViewHolder,c,HomeFragment_mViewPager_HomeUtilController_recyclerView,HomeFragment_mViewPager_HomeUtilController_recyclerView_LinearLayout
com.qmuiteam.qmuidemo.base.RecyclerViewHolder,c,HomeFragment_mViewPager_HomeLabController_recyclerView,HomeFragment_mViewPager_HomeLabController_recyclerView_LinearLayout
com.qmuiteam.qmuidemo.base.RecyclerViewHolder,c,HomeFragment_mViewPager_HomeComponentsController_recyclerView,HomeFragment_mViewPager_HomeComponentsController_recyclerView_LinearLayout
;
com.qmuiteam.qmuidemo.fragment.home.HomeUtilController
HomeFragment_mViewPager_HomeUtilController,adapter,i/com.qmuiteam.qmuidemo.R.id.recyclerView,HomeFragment_mViewPager_HomeUtilController_recyclerView@this
;
com.qmuiteam.qmuidemo.fragment.home.HomeLabController
HomeFragment_mViewPager_HomeLabController,adapter,i/com.qmuiteam.qmuidemo.R.id.recyclerView,HomeFragment_mViewPager_HomeLabController_recyclerView@this
;
com.qmuiteam.qmuidemo.fragment.home.HomeComponentsController
HomeFragment_mViewPager_HomeComponentsController,adapter,i/com.qmuiteam.qmuidemo.R.id.recyclerView,HomeFragment_mViewPager_HomeComponentsController_recyclerView@this
;
Original file line number Diff line number Diff line change
Expand Up @@ -136,22 +136,6 @@ class SkinMakerTransform extends Transform {
ctClass.addMethod(newMethod)
scope.methodCreated = true
}
}


handleDirectionInput(injectCode, directoryInput, pool) { className, methodName, scope, ctClass ->
if (!scope.method.isEmpty()) {
CtMethod ctMethod = getOrCreateMethodFromScope(ctClass, methodName, scope)
def sb = new StringBuilder()
scope.method.each { codeInfo ->
sb.append(codeInfo.fieldName)
sb.append(".")
sb.append("skinMaker")
sb.append(codeInfo.code)
sb.append("();\n")
}
ctMethod.insertAfter(sb.toString())
}

if (!scope.adapter.isEmpty()) {
CtMethod ctMethod = getOrCreateMethodFromScope(ctClass, methodName, scope)
Expand Down Expand Up @@ -180,6 +164,21 @@ class SkinMakerTransform extends Transform {
}
ctMethod.insertAfter(sb.toString())
}
}

handleDirectionInput(injectCode, directoryInput, pool) { className, methodName, scope, ctClass ->
if (!scope.method.isEmpty()) {
CtMethod ctMethod = getOrCreateMethodFromScope(ctClass, methodName, scope)
def sb = new StringBuilder()
scope.method.each { codeInfo ->
sb.append(codeInfo.fieldName)
sb.append(".")
sb.append("skinMaker")
sb.append(codeInfo.code)
sb.append("();\n")
}
ctMethod.insertAfter(sb.toString())
}

if (!scope.c.isEmpty()) {
CtClass viewHolder = pool.get(methodName)
Expand All @@ -197,7 +196,6 @@ class SkinMakerTransform extends Transform {
}
scope.c.each { codeInfo ->
try {

viewHolder.getDeclaredMethod("skinMaker" + codeInfo.code)
def tagIndex = codeInfo.code.lastIndexOf('_')
def tag = codeInfo.code.substring(0, tagIndex)
Expand All @@ -209,7 +207,42 @@ class SkinMakerTransform extends Transform {
builder.append(codeInfo.code)
builder.append("();")
builder.append("}")
print(builder.toString())
ctMethod.insertAfter(builder.toString())
} catch (NotFoundException ignore) {
}
}
}

if(!scope.p.isEmpty()){
CtMethod ctMethod
try {
ctMethod = ctClass.getDeclaredMethod("instantiateItem", pool.get("android.view.ViewGroup"), CtClass.intType)
} catch (NotFoundException ignore) {
ctMethod = CtNewMethod.make(
"protected java.lang.Object instantiateItem(android.view.ViewGroup parent, int position) { " +
"return super.instantiateItem(parent, position);}",
ctClass)
ctClass.addMethod(ctMethod)
}

scope.p.each { codeInfo ->
try {
def objectName = codeInfo.fieldName
def objectCls = pool.get(objectName)
objectCls.getDeclaredMethod("skinMaker" + codeInfo.code)

def tagIndex = codeInfo.code.lastIndexOf('_')
def tag = codeInfo.code.substring(0, tagIndex)
StringBuilder builder = new StringBuilder()
builder.append("if(\"")
builder.append(tag)
builder.append("\".equals(${'$1'}.getTag(com.qmuiteam.qmui.R.id.qmui_skin_adapter))){")
builder.append("if(${'$_'} instanceof ${objectName}){")
builder.append("((${objectName})${'$_'}).skinMaker")
builder.append(codeInfo.code)
builder.append("();")
builder.append("}")
builder.append("}")
ctMethod.insertAfter(builder.toString())
} catch (NotFoundException ignore) {
}
Expand Down Expand Up @@ -353,6 +386,8 @@ class SkinMakerTransform extends Transform {
scope.adapter.add(codeInfo)
} else if (type == "c") {
scope.c.add(codeInfo)
} else if(type == "p"){
scope.p.add(codeInfo)
}
} else {
mCurrentClassName = null
Expand Down Expand Up @@ -380,5 +415,6 @@ class CodeInScope {
ArrayList<CodeInfo> id = new ArrayList<>()
ArrayList<CodeInfo> adapter = new ArrayList<>()
ArrayList<CodeInfo> c = new ArrayList<>()
ArrayList<CodeInfo> p = new ArrayList<>()
boolean methodCreated = false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
/*
* Tencent is pleased to support the open source community by making QMUI_Android available.
*
* Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the MIT License (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://opensource.org/licenses/MIT
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.qmuiteam.qmui.skin;

import android.database.DataSetObserver;
import android.os.Parcelable;
import android.view.View;
import android.view.ViewGroup;

import java.util.HashMap;

import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;

public class DelegateViewPagerAdapter extends PagerAdapter {
private PagerAdapter origin;
private String prefix;
private HashMap<Object, Integer> mChildBindInfo = new HashMap<>();
private QMUISkinMaker skinMaker;

DelegateViewPagerAdapter(QMUISkinMaker skinMaker, PagerAdapter origin, String prefix) {
this.skinMaker = skinMaker;
this.origin = origin;
this.prefix = prefix;
}

@Override
public int getCount() {
return origin.getCount();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return origin.isViewFromObject(view, object);
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
Object item = origin.instantiateItem(container, position);
int id = skinMaker.bindViewPagerChild(origin, item, prefix);
mChildBindInfo.put(item, id);
return item;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
origin.destroyItem(container, position, object);
Integer bindId = mChildBindInfo.remove(object);
if (bindId != null) {
skinMaker.unbind(bindId);
}
}

@Override
public void restoreState(Parcelable bundle, ClassLoader classLoader) {
origin.restoreState(bundle, classLoader);
}

@Override
public Parcelable saveState() {
return origin.saveState();
}

@Override
public void startUpdate(@NonNull ViewGroup container) {
origin.startUpdate(container);
}

@Override
public void finishUpdate(@NonNull ViewGroup container) {
origin.finishUpdate(container);
}

@Override
public CharSequence getPageTitle(int position) {
return origin.getPageTitle(position);
}

@Override
public float getPageWidth(int position) {
return origin.getPageWidth(position);
}

@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
origin.setPrimaryItem(container, position, object);
}

@Override
public void unregisterDataSetObserver(@NonNull DataSetObserver observer) {
origin.unregisterDataSetObserver(observer);
}

@Override
public void registerDataSetObserver(@NonNull DataSetObserver observer) {
origin.registerDataSetObserver(observer);
}

@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
origin.notifyDataSetChanged();
}

@Override
public int getItemPosition(@NonNull Object object) {
return origin.getItemPosition(object);
}
}
Loading

0 comments on commit 9f3c7a8

Please sign in to comment.