diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39fb081 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..032774f --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..a8f9e56 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fbb6828 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..2621256 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..ec5f252 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,60 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.neenbedankt.android-apt' + +android { + compileSdkVersion 23 + buildToolsVersion '23.0.3' + defaultConfig { + vectorDrawables.useSupportLibrary = true + applicationId "com.hd.wlj.duohaowan" + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + signConfig { + storeFile file('keystory.jks')//签名文件路径, + //keystore的路径通常使用项目根目录的相对路径,但也可以是使用绝对路径,尽管这不推荐 + storePassword 'duohaowan' //密码 + keyAlias 'duohaowan' + keyPassword 'duohaowan' //密码 + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + + signingConfig signingConfigs.signConfig // 配置debug包的签名 + } + + debug { + signingConfig signingConfigs.signConfig // 配置debug包的签名 + } + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile project(':base') + compile project(':gesturelock') + compile project(':third') + //添加这一句 + compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.android.support:design:23.4.0' + compile 'com.android.support:recyclerview-v7:23.4.0' + compile 'com.android.support:cardview-v7:23.4.0' + compile 'com.jakewharton:butterknife:8.4.0' + compile 'com.android.support:support-v4:23.4.0' + compile 'com.github.bumptech.glide:glide:3.7.0' + testCompile 'junit:junit:4.12' + apt 'com.jakewharton:butterknife-compiler:8.4.0' + compile 'jp.wasabeef:glide-transformations:2.0.1' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..7de1e98 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/wlj/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/androidTest/java/com/hd/wlj/duohaowan/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/hd/wlj/duohaowan/ExampleInstrumentedTest.java new file mode 100644 index 0000000..a36e027 --- /dev/null +++ b/app/src/androidTest/java/com/hd/wlj/duohaowan/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.hd.wlj.duohaowan; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.hd.wlj.duohaowan", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6bd7474 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/fonts/phone.ttf b/app/src/main/assets/fonts/phone.ttf new file mode 100644 index 0000000..73cbd24 Binary files /dev/null and b/app/src/main/assets/fonts/phone.ttf differ diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000..65da506 Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/com/hd/wlj/duohaowan/App.java b/app/src/main/java/com/hd/wlj/duohaowan/App.java new file mode 100644 index 0000000..cda1b7d --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/App.java @@ -0,0 +1,11 @@ +package com.hd.wlj.duohaowan; + +import com.wlj.base.util.AppContext; + +/** + * Created by wlj on 2016/10/24. + */ + +public class App extends AppContext { + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehavior.java b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehavior.java new file mode 100644 index 0000000..5af0480 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehavior.java @@ -0,0 +1,103 @@ +package com.hd.wlj.duohaowan.Behavior; + +import android.animation.Animator; +import android.content.Context; +import android.support.design.widget.CoordinatorLayout; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.animation.FastOutSlowInInterpolator; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewPropertyAnimator; +import android.view.animation.Interpolator; + +/** + * 内容向上滑动时消失,向下滑动时显示 + */ +public class FooterBehavior extends CoordinatorLayout.Behavior { + + private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); + + + private int sinceDirectionChange; + + + public FooterBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + +//1.判断滑动的方向 我们需要垂直滑动 + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) { + return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + +//2.根据滑动的距离显示和隐藏footer view + @Override + public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { + if (dy > 0 && sinceDirectionChange < 0 || dy < 0 && sinceDirectionChange > 0) { + child.animate().cancel(); + sinceDirectionChange = 0; + } + sinceDirectionChange += dy; + if (sinceDirectionChange > child.getHeight() && child.getVisibility() == View.VISIBLE) { + hide(child); + } else if (sinceDirectionChange < 0 && child.getVisibility() == View.GONE) { + show(child); + } + } + + + private void hide(final View view) { + ViewPropertyAnimator animator = view.animate().translationY(view.getHeight()).setInterpolator(INTERPOLATOR).setDuration(200); + animator.setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + + } + + @Override + public void onAnimationEnd(Animator animator) { + view.setVisibility(View.GONE); + } + + @Override + public void onAnimationCancel(Animator animator) { + show(view); + } + + @Override + public void onAnimationRepeat(Animator animator) { + + } + }); + animator.start(); + } + + + private void show(final View view) { + ViewPropertyAnimator animator = view.animate().translationY(0).setInterpolator(INTERPOLATOR).setDuration(200); + animator.setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + + } + + @Override + public void onAnimationEnd(Animator animator) { + view.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationCancel(Animator animator) { + hide(view); + } + + @Override + public void onAnimationRepeat(Animator animator) { + + } + }); + animator.start(); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehaviorDependAppBar.java b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehaviorDependAppBar.java new file mode 100644 index 0000000..89e0a9a --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehaviorDependAppBar.java @@ -0,0 +1,31 @@ +package com.hd.wlj.duohaowan.Behavior; + +import android.content.Context; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CoordinatorLayout; +import android.util.AttributeSet; +import android.view.View; + +/** + * 滑动的时候 底部的都消失 + */ +public class FooterBehaviorDependAppBar extends CoordinatorLayout.Behavior { + + + public FooterBehaviorDependAppBar(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { + return dependency instanceof AppBarLayout; + } + + + @Override + public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { + float translationY = Math.abs(dependency.getTranslationY()); + child.setTranslationY(translationY); + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/Behavior/ToolbarAlphaBehavior.java b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/ToolbarAlphaBehavior.java new file mode 100644 index 0000000..a48d02a --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/ToolbarAlphaBehavior.java @@ -0,0 +1,45 @@ +package com.hd.wlj.duohaowan.Behavior; + +import android.content.Context; +import android.support.design.widget.CoordinatorLayout; +import android.support.v7.widget.Toolbar; +import android.util.AttributeSet; +import android.view.View; + +import com.hd.wlj.duohaowan.R; + +public class ToolbarAlphaBehavior extends CoordinatorLayout.Behavior { + private static final String TAG = "ToolbarAlphaBehavior"; + private int offset = 0; + private int startOffset = 0; + private int endOffset = 0; + private Context context; + + public ToolbarAlphaBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + } + + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, Toolbar child, View directTargetChild, View target, int nestedScrollAxes) { + return true; + } + + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, Toolbar toolbar, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { + startOffset = 0; + endOffset = context.getResources().getDimensionPixelOffset(R.dimen.header_height) - toolbar.getHeight(); + offset += dyConsumed; + if (offset <= startOffset) { //alpha为0 + toolbar.getBackground().setAlpha(0); + } else if (offset > startOffset && offset < endOffset) { //alpha为0到255 + float precent = (float) (offset - startOffset) / endOffset; + int alpha = Math.round(precent * 255); + toolbar.getBackground().setAlpha(alpha); + } else if (offset >= endOffset) { //alpha为255 + toolbar.getBackground().setAlpha(255); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/DataPass.java b/app/src/main/java/com/hd/wlj/duohaowan/DataPass.java new file mode 100644 index 0000000..e90e2ba --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/DataPass.java @@ -0,0 +1,10 @@ +package com.hd.wlj.duohaowan; + +/** + * + */ + +public class DataPass { + + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/MainActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/MainActivity.java new file mode 100644 index 0000000..232ebd2 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/MainActivity.java @@ -0,0 +1,315 @@ +package com.hd.wlj.duohaowan; + +import android.content.Context; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.FragmentTransaction; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnTouchListener; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.PopupWindow.OnDismissListener; + +import com.hd.wlj.duohaowan.ui.LoginActivity; +import com.hd.wlj.duohaowan.ui.follow.FollowFragment; +import com.hd.wlj.duohaowan.ui.home.HomeFragment; +import com.hd.wlj.duohaowan.ui.my.MyFragment; +import com.hd.wlj.duohaowan.ui.seach.SeachFragment; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.statusbar.StatusBarUtil; + +public class MainActivity extends BaseFragmentActivity implements OnClickListener,HomeFragment.OnFragmentInteractionListener +{ + // 定义Fragment页面 + private HomeFragment fragmentHome; + private SeachFragment fragmentSearch; + private FollowFragment fragmentSpace; + private MyFragment fragmentMy; + // 定义布局对象 + private FrameLayout homeFl, authFl, spaceFl, moreFl; + + // 定义图片组件对象 + private ImageView atIv, authIv, spaceIv, moreIv; + + // 定义按钮图片组件 + private ImageView toggleImageView, plusImageView; + + // 定义PopupWindow + private PopupWindow popWindow; + // 获取手机屏幕分辨率的类 + private DisplayMetrics dm; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + initView(); + + initData(); + + //初始化默认为选中点击了“动态”按钮 + clickAtBtn(); + } + + @Override + protected void setStatusBar() { + super.setStatusBar(); +// StatusBarUtil.setTransparentForImageViewInFragment(this,null); + } + + /** + * 初始化组件 + */ + private void initView() { + // 实例化布局对象 + homeFl = (FrameLayout) findViewById(R.id.layout_home); + authFl = (FrameLayout) findViewById(R.id.layout_seach); + spaceFl = (FrameLayout) findViewById(R.id.layout_follow); + moreFl = (FrameLayout) findViewById(R.id.layout_my); + + // 实例化图片组件对象 + atIv = (ImageView) findViewById(R.id.image_home); + authIv = (ImageView) findViewById(R.id.image_seach); + spaceIv = (ImageView) findViewById(R.id.image_follow); + moreIv = (ImageView) findViewById(R.id.image_my); + + // 实例化按钮图片组件 + toggleImageView = (ImageView) findViewById(R.id.toggle_btn); + plusImageView = (ImageView) findViewById(R.id.plus_btn); + + } + + /** + * 初始化数据 + */ + private void initData() { + // 给布局对象设置监听 + homeFl.setOnClickListener(this); + authFl.setOnClickListener(this); + spaceFl.setOnClickListener(this); + moreFl.setOnClickListener(this); + + // 给按钮图片设置监听 + toggleImageView.setOnClickListener(this); + } + + /** + * 点击事件 + */ + @Override + public void onClick(View v) { + switch (v.getId()) { + // 点击s首页按钮 + case R.id.layout_home: + clickAtBtn(); + break; + // 点击seach关按钮 + case R.id.layout_seach: + clickAuthBtn(); + break; + // 点击follow按钮 + case R.id.layout_follow: + clickFollowBtn(); + break; + // 点击my按钮 + case R.id.layout_my: + clickMoreBtn(); + break; + // 点击中间按钮 + case R.id.toggle_btn: +// clickToggleBtn(); + break; + } + } + + /** + * 点击了“动态”按钮 + */ + private void clickAtBtn() { + // 实例化Fragment页面 + if(fragmentHome == null) { + fragmentHome = new HomeFragment(); + } + // 得到Fragment事务管理器 + FragmentTransaction fragmentTransaction = this + .getSupportFragmentManager().beginTransaction(); + // 替换当前的页面 + fragmentTransaction.replace(R.id.frame_content, fragmentHome); + // 事务管理提交 + fragmentTransaction.commit(); + // 改变选中状态 + homeFl.setSelected(true); + atIv.setSelected(true); + + authFl.setSelected(false); + authIv.setSelected(false); + + spaceFl.setSelected(false); + spaceIv.setSelected(false); + + moreFl.setSelected(false); + moreIv.setSelected(false); + } + + /** + * 点击了“与我相关”按钮 + */ + private void clickAuthBtn() { + // 实例化Fragment页面 + if(fragmentSearch == null) { + fragmentSearch = new SeachFragment(); + } + // 得到Fragment事务管理器 + FragmentTransaction fragmentTransaction = this + .getSupportFragmentManager().beginTransaction(); + // 替换当前的页面 + fragmentTransaction.replace(R.id.frame_content, fragmentSearch); + // 事务管理提交 + fragmentTransaction.commit(); + + homeFl.setSelected(false); + atIv.setSelected(false); + + authFl.setSelected(true); + authIv.setSelected(true); + + spaceFl.setSelected(false); + spaceIv.setSelected(false); + + moreFl.setSelected(false); + moreIv.setSelected(false); + } + + /** + * 点击了“我的空间”按钮 + */ + private void clickFollowBtn() { + // 实例化Fragment页面 + if(fragmentSpace == null) { + fragmentSpace = new FollowFragment(); + } + // 得到Fragment事务管理器 + FragmentTransaction fragmentTransaction = this + .getSupportFragmentManager().beginTransaction(); + // 替换当前的页面 + fragmentTransaction.replace(R.id.frame_content, fragmentSpace); + // 事务管理提交 + fragmentTransaction.commit(); + + homeFl.setSelected(false); + atIv.setSelected(false); + + authFl.setSelected(false); + authIv.setSelected(false); + + spaceFl.setSelected(true); + spaceIv.setSelected(true); + + moreFl.setSelected(false); + moreIv.setSelected(false); + } + + /** + * 点击了“更多”按钮 + */ + private void clickMoreBtn() { + GoToHelp.go(this, LoginActivity.class); + + +// // 实例化Fragment页面 +// if(fragmentMy == null) { +// fragmentMy = new MyFragment(); +// } +// // 得到Fragment事务管理器 +// FragmentTransaction fragmentTransaction = this +// .getSupportFragmentManager().beginTransaction(); +// // 替换当前的页面 +// fragmentTransaction.replace(R.id.frame_content, fragmentMy); +// // 事务管理提交 +// fragmentTransaction.commit(); +// +// homeFl.setSelected(false); +// atIv.setSelected(false); +// +// authFl.setSelected(false); +// authIv.setSelected(false); +// +// spaceFl.setSelected(false); +// spaceIv.setSelected(false); +// +// moreFl.setSelected(true); +// moreIv.setSelected(true); + } + + /** + * 点击了中间按钮 + */ + private void clickToggleBtn() { + showPopupWindow(toggleImageView); + // 改变按钮显示的图片为按下时的状态 + plusImageView.setSelected(true); + } + + /** + * 改变显示的按钮图片为正常状态 + */ + private void changeButtonImage() { + plusImageView.setSelected(false); + } + + /** + * 显示PopupWindow弹出菜单 + */ + private void showPopupWindow(View parent) { + if (popWindow == null) { + LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + View view = layoutInflater.inflate(R.layout.popwindow_layout, null); + dm = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(dm); + // 创建一个PopuWidow对象 + popWindow = new PopupWindow(view, dm.widthPixels, LinearLayout.LayoutParams.WRAP_CONTENT); + } + // 使其聚集 ,要想监听菜单里控件的事件就必须要调用此方法 + popWindow.setFocusable(true); + // 设置允许在外点击消失 + popWindow.setOutsideTouchable(true); + // 设置背景,这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景 + popWindow.setBackgroundDrawable(new BitmapDrawable()); + // PopupWindow的显示及位置设置 + // popWindow.showAtLocation(parent, Gravity.FILL, 0, 0); + popWindow.showAsDropDown(parent, 0,0); + + popWindow.setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss() { + // 改变显示的按钮图片为正常状态 + changeButtonImage(); + } + }); + + // 监听触屏事件 + popWindow.setTouchInterceptor(new OnTouchListener() { + public boolean onTouch(View view, MotionEvent event) { + // 改变显示的按钮图片为正常状态 + changeButtonImage(); + popWindow.dismiss(); + return false; + } + }); + } + + @Override + public void onFragmentInteraction(Uri uri) { + + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/Urls.java b/app/src/main/java/com/hd/wlj/duohaowan/Urls.java new file mode 100644 index 0000000..518f120 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/Urls.java @@ -0,0 +1,19 @@ +package com.hd.wlj.duohaowan; + +import com.wlj.base.web.BaseURL; + +/** + * + */ +public class Urls extends BaseURL { + + public static final String getImageRand = HOST+ "rand/getImageRand.do"; + public static final String getPhoneRand = HOST+ "rand/getPhoneRand.do"; + public static final String getUserPhoneRand = HOST+ "rand/getUserPhoneRand.do"; + public static final String register = HOST+ "front/register.do"; + public static final String login = HOST+ "front/login_simple.do"; + public static final String resetPassword = HOST+ "front/resetPassword.do"; + + public static final String list_pub = HOST+ "front/list_pub.do";//首页banner图片 + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/adapter/RecyclerViewAdapter.java b/app/src/main/java/com/hd/wlj/duohaowan/adapter/RecyclerViewAdapter.java new file mode 100644 index 0000000..f1bd8d5 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/adapter/RecyclerViewAdapter.java @@ -0,0 +1,58 @@ +package com.hd.wlj.duohaowan.adapter; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Created by wlj on 2016/10/28. + */ + +public class RecyclerViewAdapter extends RecyclerView.Adapter { + + private int reslayout; + private List mData; + + public RecyclerViewAdapter(int reslayout){ + + reslayout = reslayout; + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + T t = mData.get(position); + + + } + + @Override + public int getItemCount() { + return mData.size(); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View inflate = LayoutInflater.from(parent.getContext()).inflate(reslayout, null); + + return new ViewHolder(inflate); + } + + @Override + public int getItemViewType(int position) { + + + return super.getItemViewType(position); + } + + public static class ViewHolder extends RecyclerView.ViewHolder{ + + + public ViewHolder(View itemView) { + super(itemView); + } + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/been/News.java b/app/src/main/java/com/hd/wlj/duohaowan/been/News.java new file mode 100644 index 0000000..2a9719a --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/been/News.java @@ -0,0 +1,40 @@ +package com.hd.wlj.duohaowan.been; + +import android.app.Activity; + +import com.wlj.base.bean.Base; +import com.wlj.base.web.asyn.AsyncRequestModle; +import com.wlj.base.web.asyn.BaseAsyncModle; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +/** + * Created by wlj on 2016/10/29. + */ + +public class News extends BaseAsyncModle { + + + public News() { + } + + public News(Activity paramActivity) { + super(paramActivity); + } + + public News(JSONObject jo) { + super(jo); + } + + @Override + public void addRequestParemeter(AsyncRequestModle asRequestModle) throws IOException { + } + + @Override + public Base parse(JSONObject jsonObject) throws JSONException { + return new News(jsonObject); + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/been/User.java b/app/src/main/java/com/hd/wlj/duohaowan/been/User.java new file mode 100644 index 0000000..acebd1b --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/been/User.java @@ -0,0 +1,153 @@ +package com.hd.wlj.duohaowan.been; + +import android.app.Activity; + +import com.hd.wlj.duohaowan.Urls; +import com.wlj.base.bean.Base; +import com.wlj.base.web.HttpPost; +import com.wlj.base.web.Md5Util; +import com.wlj.base.web.asyn.AsyncRequestModle; +import com.wlj.base.web.asyn.BaseAsyncModle; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; + +/** + * + */ +public class User extends BaseAsyncModle { + + + /** + * 获取验证码 + */ + public static final int getRand = -1; + + /** + * 注册 + */ + public static final int REGESTER = 1; + /** + * 登陆 + */ + public static final int LOGIN = 2; + /** + * 重置密码 + */ + public static final int RESSTPASSWORD = 3; + + /** + * 获取用户验证码 + */ + public static final int getUserPhoneRand = 4; + + private String phone; + private String verify; + private String psw; + + public User() { + super(); + } + + public User(Activity paramActivity) { + super(paramActivity); + } + + public User(JSONObject paramJSONObject) { + super(paramJSONObject); + } + + + @Override + public void addRequestParemeter(AsyncRequestModle paramAsyncRequestModle) throws IOException { + HttpPost httpPost = new HttpPost(Urls.getPhoneRand); + httpPost.addParemeter("phone", phone); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + + } + + @Override + public void addRequestParemeter(AsyncRequestModle paramAsyncRequestModle, int type) throws IOException { + if (type == REGESTER) { + + HttpPost httpPost = new HttpPost(Urls.register); + httpPost.addParemeter("username", phone); + httpPost.addParemeter("randCode", verify); + httpPost.addParemeter("userpwd", psw); + httpPost.addParemeter("userpwd_ok", psw); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + } else if (type == LOGIN) { + + String md5Final = Md5Util.MD5Normal(psw); + String randCode = System.currentTimeMillis() + ""; + String userpwd = Md5Util.MD5Normal(md5Final + randCode.toLowerCase()); + + HttpPost httpPost = new HttpPost(Urls.login); + httpPost.addParemeter("username", phone); + httpPost.addParemeter("randCode", randCode); + httpPost.addParemeter("userpwd", userpwd); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + + } else if (type == RESSTPASSWORD) { + HttpPost httpPost = new HttpPost(Urls.resetPassword); + httpPost.addParemeter("username", phone); + httpPost.addParemeter("randCode", verify); + httpPost.addParemeter("userpwd", psw); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + + } else if (type == getUserPhoneRand) { + HttpPost httpPost = new HttpPost(Urls.getUserPhoneRand); + httpPost.addParemeter("username", phone); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + } + + + } + + @Override + public Base parse(JSONObject jsonObject) throws JSONException { + return new User(jsonObject); + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerify() { + return verify; + } + + public void setVerify(String verify) { + this.verify = verify; + } + + public String getPsw() { + return psw; + } + + public void setPsw(String psw) { + this.psw = psw; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/ForgetPSWActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/ForgetPSWActivity.java new file mode 100644 index 0000000..615a1f4 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/ForgetPSWActivity.java @@ -0,0 +1,202 @@ +package com.hd.wlj.duohaowan.ui; + +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.text.InputFilter; +import android.text.InputType; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.MainActivity; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.been.User; +import com.hd.wlj.duohaowan.view.ImgInpImg; +import com.wlj.base.bean.Base; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.AppConfig; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.StringUtils; +import com.wlj.base.util.UIHelper; +import com.wlj.base.web.asyn.AsyncCall; + +import org.json.JSONObject; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class ForgetPSWActivity extends BaseFragmentActivity { + + @BindView(R.id.regester_phone) + ImgInpImg regesterPhone; + @BindView(R.id.regester_verifyCode) + EditText regesterVerifyCode; + @BindView(R.id.regester_psw) + ImgInpImg regesterPsw; + @BindView(R.id.regester_repsw) + ImgInpImg regesterRepsw; + @BindView(R.id.regester_submit) + Button regesterSubmit; + @BindView(R.id.toolbar_title) + TextView toolbarTitle; + @BindView(R.id.toolbar) + Toolbar toolbar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_regester); + ButterKnife.bind(this); + + init(); + } + + private void init() { + regesterSubmit.setText("修改密码"); + setSupportActionBar(toolbar); + toolbar.setTitle(""); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + toolbarTitle.setText("忘记密码"); + + + regesterPhone.getIconFontView1().setIconPath(getString(R.string.phonePath)); + regesterPhone.getIconFontView1().setTextSize(30f); + regesterPhone.setInputType(InputType.TYPE_CLASS_NUMBER); + regesterPhone.getEditTextView().setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)}); + regesterPhone.getIconFontView2().setTextSize(18f); + + regesterVerifyCode.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + + regesterPsw.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD); + regesterPsw.getIconFontView1().setTextSize(30f); + + regesterRepsw.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD); + regesterRepsw.getIconFontView1().setTextSize(30f); + regesterPhone.getIconFontView2().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getPhoneRand(); + } + }); + } + + /** + * 获取手机验证码 + */ + private void getPhoneRand() { + + String phone = regesterPhone.getText()+""; + + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return; + } + + User user = new User(this); + user.setPhone(phone); + AsyncCall request = user.Request(User.getUserPhoneRand); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base base, int paramInt) { + JSONObject jsonObject = base.getResultJsonObject(); + UIHelper.toastMessage(getApplicationContext(),jsonObject.optString("message")); + + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + @OnClick(R.id.regester_submit) + public void onClick() { + String phone = regesterPhone.getText(); + String verify = regesterVerifyCode.getText() + ""; + String psw = regesterPsw.getText(); + String repsw = regesterRepsw.getText(); + + if (verify(phone, verify, psw,repsw)) return; + + modify(phone,verify,psw); + + } + + + private boolean verify(String phone, String verify, String psw,String repsw) { + //phone 验证 + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return true; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return true; + } + // 验证码 验证 + if (StringUtils.isEmpty(verify)) { + UIHelper.toastMessage(getApplicationContext(),"短信验证码为空"); + return true; + } + //密码格式验证 + if (StringUtils.isEmpty(psw)) { + UIHelper.toastMessage(getApplicationContext(),"密码为空"); + return true; + } + if (6 > psw.length() || psw.length() > 16) { + UIHelper.toastMessage(getApplicationContext(),"密码长度6-16"); + return true; + } + //确认密码 + if ( !psw.equals(repsw)) { + UIHelper.toastMessage(getApplicationContext(),"确认密码和密码不相同"); + return true; + } + + return false; + } + private void modify(String phone, String verify, String psw) { + + User user = new User(this); + user.setPhone(phone); + user.setVerify(verify); + user.setPsw(psw); + + AsyncCall request = user.Request(User.RESSTPASSWORD); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + //重置密码 -》登陆成功 + JSONObject jsonObject = paramBase.getResultJsonObject(); + + AppConfig appConfig = AppConfig.getAppConfig(); + appConfig.set(AppConfig.CONF_KEY,jsonObject.optString("key")); + GoToHelp.go(ForgetPSWActivity.this, MainActivity.class); + finish(); + UIHelper.toastMessage(getApplicationContext(), "登陆成功"); + } + + @Override + public void fail(Exception paramException) { + UIHelper.toastMessage(getApplicationContext(),paramException.getMessage()); + } + }); + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/LoginActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/LoginActivity.java new file mode 100644 index 0000000..2b18b45 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/LoginActivity.java @@ -0,0 +1,172 @@ +package com.hd.wlj.duohaowan.ui; + +import android.content.Intent; +import android.os.Bundle; +import android.text.InputFilter; +import android.text.InputType; +import android.text.method.DigitsKeyListener; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.MainActivity; +import com.hd.wlj.duohaowan.been.User; +import com.hd.wlj.duohaowan.view.ImgInpImg; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.third.quicklogin.wx.WXLogin; +import com.wlj.base.bean.Base; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.AppConfig; +import com.wlj.base.util.AppContext; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.StringUtils; +import com.wlj.base.util.UIHelper; +import com.wlj.base.util.statusbar.StatusBarUtil; +import com.wlj.base.web.asyn.AsyncCall; +import com.wlj.base.widget.IconfontTextview; + +import org.json.JSONObject; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +/** + * 登陆 + * + * @author wlj + */ + +public class LoginActivity extends BaseFragmentActivity { + + @BindView(R.id.login_back) + IconfontTextview loginBack; + @BindView(R.id.login_account) + ImgInpImg loginAccount; + @BindView(R.id.login_psw) + ImgInpImg loginPsw; + @BindView(R.id.login_login_button) + Button loginLoginButton; + @BindView(R.id.login_forgetPswTV) + TextView loginForgetPswTV; + @BindView(R.id.login_qq_imageView) + ImageView loginQqImageView; + @BindView(R.id.login_wx_imageView) + ImageView loginWxImageView; + @BindView(R.id.login_rg_tv) + TextView loginRgTv; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + ButterKnife.bind(this); + + AppContext.getAppContext().loginOut(); + + loginAccount.getIconFontView1().setTextSize(20f); + String digists = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + loginAccount.getEditTextView().setKeyListener(DigitsKeyListener.getInstance(digists)); +// loginAccount.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + loginAccount.getEditTextView().setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)}); + + loginPsw.getIconFontView1().setTextSize(30f); + loginPsw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|InputType.TYPE_CLASS_TEXT); + } + + @Override + protected void setStatusBar() { + super.setStatusBar(); + } + + @OnClick({R.id.login_back, R.id.login_login_button, R.id.login_forgetPswTV, R.id.login_qq_imageView, R.id.login_wx_imageView, R.id.login_rg_tv}) + public void onClick(View view) { + switch (view.getId()) { + case R.id.login_back: + finish(); + break; + case R.id.login_login_button: + login(); + +// startActivity(new Intent(getApplicationContext(), MainActivity.class)); + break; + case R.id.login_forgetPswTV: + //忘记密码 + startActivity(new Intent(getApplicationContext(), ForgetPSWActivity.class)); + break; + case R.id.login_qq_imageView: + + break; + + case R.id.login_wx_imageView: + WXLogin wxLogin = new WXLogin(getApplicationContext()); + wxLogin.login(); + break; + case R.id.login_rg_tv: + //注册 + startActivity(new Intent(getApplicationContext(), RegesterActivity.class)); + + break; + } + } + + private void login() { + + String phone = loginAccount.getText(); + String psw = loginPsw.getText(); + +// phone = "15310315193"; +// psw = "123456"; + + if(verify(phone,psw))return; + + User user = new User(this); + user.setPhone(phone); + user.setPsw(psw); + AsyncCall request = user.Request(User.LOGIN); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + + JSONObject jsonObject = paramBase.getResultJsonObject(); + + AppConfig appConfig = AppConfig.getAppConfig(); + appConfig.set(AppConfig.CONF_KEY,jsonObject.optString("key")); + GoToHelp.go(LoginActivity.this, MainActivity.class); + finish(); + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + private boolean verify(String phone, String psw) { + //phone 验证 + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return true; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return true; + } + + //密码格式验证 + if (StringUtils.isEmpty(psw)) { + UIHelper.toastMessage(getApplicationContext(),"密码为空"); + return true; + } + if (6 > psw.length() || psw.length() > 16) { + UIHelper.toastMessage(getApplicationContext(),"密码长度6-16"); + return true; + } + return false; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/RegesterActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/RegesterActivity.java new file mode 100644 index 0000000..8f766f0 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/RegesterActivity.java @@ -0,0 +1,208 @@ +package com.hd.wlj.duohaowan.ui; + +import android.graphics.Typeface; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.text.InputFilter; +import android.text.InputType; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; + +import com.hd.wlj.duohaowan.MainActivity; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.been.User; +import com.hd.wlj.duohaowan.view.ImgInpImg; +import com.wlj.base.bean.Base; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.AppConfig; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.StringUtils; +import com.wlj.base.util.UIHelper; +import com.wlj.base.web.asyn.AsyncCall; + +import org.json.JSONObject; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +/** + * 注册 + */ +public class RegesterActivity extends BaseFragmentActivity { + + @BindView(R.id.regester_phone) + ImgInpImg regesterPhone; + @BindView(R.id.regester_verifyCode) + EditText regesterVerifyCode; + @BindView(R.id.regester_psw) + ImgInpImg regesterPsw; + @BindView(R.id.regester_repsw) + ImgInpImg regesterRepsw; + @BindView(R.id.regester_submit) + Button regesterSubmit; + @BindView(R.id.regester_repsw_ll) + LinearLayout regesterRepswLl; + @BindView(R.id.toolbar) + Toolbar toolbar; + + private String rand; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_regester); + ButterKnife.bind(this); + + init(); + + + } + + private void init() { + regesterRepswLl.setVisibility(View.GONE); + setSupportActionBar(toolbar); + toolbar.setTitle(""); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + regesterPhone.getIconFontView1().setIconPath(getString(R.string.phonePath)); + regesterPhone.getIconFontView1().setTextSize(30f); + regesterPhone.setInputType(InputType.TYPE_CLASS_NUMBER); + regesterPhone.getEditTextView().setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)}); + regesterPhone.getIconFontView2().setTextSize(18f); + + regesterVerifyCode.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + + regesterPsw.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD); + regesterPsw.getIconFontView1().setTextSize(30f); + +// regesterPhone.getIconFontView2().setTextSize(16f); + regesterPhone.getIconFontView2().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getPhoneRand(); + } + }); + } + + /** + * 获取手机验证码 + */ + private void getPhoneRand() { + + String phone = regesterPhone.getText()+""; + + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return; + } + + User user = new User(this); + user.setPhone(phone); + AsyncCall request = user.Request(); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base base, int paramInt) { + JSONObject jsonObject = base.getResultJsonObject(); + UIHelper.toastMessage(getApplicationContext(),jsonObject.optString("message")); + if(jsonObject != null){ + + rand = jsonObject.optString("rand"); + regesterVerifyCode.setText(rand); + + } + + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + @OnClick(R.id.regester_submit) + public void onClick() { + + String phone = regesterPhone.getText(); + String verify = regesterVerifyCode.getText() + ""; + String psw = regesterPsw.getText(); + + if (verify(phone, verify, psw)) return; + + regester(phone,verify,psw); + } + + private boolean verify(String phone, String verify, String psw) { + //phone 验证 + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return true; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return true; + } + // 验证码 验证 + if (StringUtils.isEmpty(verify)) { + UIHelper.toastMessage(getApplicationContext(),"短信验证码为空"); + return true; + } + //密码格式验证 + if (StringUtils.isEmpty(psw)) { + UIHelper.toastMessage(getApplicationContext(),"密码为空"); + return true; + } + if (6 > psw.length() || psw.length() > 16) { + UIHelper.toastMessage(getApplicationContext(),"密码长度6-16"); + return true; + } + return false; + } + + private void regester(String phone, String verify, String psw) { + + User user = new User(this); + user.setPhone(phone); + user.setVerify(verify); + user.setPsw(psw); + + AsyncCall request = user.Request(User.REGESTER); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + //注册成功 ->登陆成功 + JSONObject jsonObject = paramBase.getResultJsonObject(); + + AppConfig appConfig = AppConfig.getAppConfig(); + appConfig.set(AppConfig.CONF_KEY,jsonObject.optString("key")); + GoToHelp.go(RegesterActivity.this, MainActivity.class); + finish(); + + UIHelper.toastMessage(getApplicationContext(), "登陆成功"); + } + + @Override + public void fail(Exception paramException) { + UIHelper.toastMessage(getApplicationContext(),paramException.getMessage()); + } + }); + } + + +} + diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/WorkDetailsActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/WorkDetailsActivity.java new file mode 100644 index 0000000..5a5240f --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/WorkDetailsActivity.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.detailswork; + +import android.os.Bundle; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.hd.wlj.duohaowan.R; +import com.wlj.base.ui.BaseFragmentActivity; + +import butterknife.BindView; +import butterknife.ButterKnife; +import jp.wasabeef.glide.transformations.RoundedCornersTransformation; + +public class WorkDetailsActivity extends BaseFragmentActivity { + + @BindView(R.id.work_detail_head) + ImageView workDetailHead; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_work_details); + ButterKnife.bind(this); + + Glide.with(this).load(R.mipmap.ic_launcher).bitmapTransform + (new RoundedCornersTransformation(this, 90, 0)) + .into(workDetailHead); + + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/contract/DetailsContract.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/contract/DetailsContract.java new file mode 100644 index 0000000..8070d5b --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/contract/DetailsContract.java @@ -0,0 +1,24 @@ +package com.hd.wlj.duohaowan.ui.detailswork.contract; + +import com.wlj.base.bean.Base; + +import java.util.List; + +/** + * Created by wlj on 2016/10/26. + */ + +public class DetailsContract { + + +public interface View{ +} + +public interface Presenter{ +} + +public interface Model{ +} + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/model/DetailsModelImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/model/DetailsModelImpl.java new file mode 100644 index 0000000..c04c936 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/model/DetailsModelImpl.java @@ -0,0 +1,10 @@ +package com.hd.wlj.duohaowan.ui.detailswork.model; +import com.hd.wlj.duohaowan.ui.detailswork.contract.DetailsContract; + +/** +* Created by wlj on 2016/10/30 +*/ + +public class DetailsModelImpl implements DetailsContract.Model{ + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/presenter/DetailsPresenterImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/presenter/DetailsPresenterImpl.java new file mode 100644 index 0000000..79c0946 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/presenter/DetailsPresenterImpl.java @@ -0,0 +1,10 @@ +package com.hd.wlj.duohaowan.ui.detailswork.presenter; +import com.hd.wlj.duohaowan.ui.detailswork.contract.DetailsContract; + +/** +* Created by wlj on 2016/10/30 +*/ + +public class DetailsPresenterImpl implements DetailsContract.Presenter{ + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/follow/FollowFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/follow/FollowFragment.java new file mode 100644 index 0000000..32477ff --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/follow/FollowFragment.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.follow; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hd.wlj.duohaowan.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class FollowFragment extends Fragment { + + + public FollowFragment() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_follow, container, false); + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HomeFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HomeFragment.java new file mode 100644 index 0000000..6c79d8d --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HomeFragment.java @@ -0,0 +1,295 @@ +package com.hd.wlj.duohaowan.ui.home; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.Urls; +import com.hd.wlj.duohaowan.ui.home.contract.HomeContract; +import com.hd.wlj.duohaowan.ui.home.presenter.HomePresenterImpl; +import com.hd.wlj.duohaowan.ui.home.view.KamHorizontalScrollView; +import com.wlj.base.bean.Base; +import com.wlj.base.util.UIHelper; +import com.wlj.base.util.img.LoadImage; +import com.wlj.base.util.statusbar.StatusBarUtil; +import com.wlj.base.widget.SwitchViewPager; +import com.zhy.adapter.recyclerview.CommonAdapter; +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.wrapper.HeaderAndFooterWrapper; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link OnFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link HomeFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class HomeFragment extends Fragment implements HomeContract.View { + + @BindView(R.id.home_recyclerView) + RecyclerView homeRecyclerView; +// @BindView(R.id.fab) +// FloatingActionButton fab; + + private OnFragmentInteractionListener mListener; + private HomePresenterImpl homePresenter; + // private ViewPager honmeClassifyViewPager; + private FrameLayout bannerViewGroup; + private List mData; + private View part_home_head; + private TextView header_new; + private HeaderAndFooterWrapper mHeaderAndFooterWrapper; +// private HorizontalScrollView mHorizontalScrollView; +// private HorizontalScrollViewAdapter mAdapter; + private LinearLayout mGallery; + private List hostList; + private KamHorizontalScrollView mHorizontalScrollView; + + public HomeFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @return A new instance of fragment HomeFragment. + */ + public static HomeFragment newInstance() { + HomeFragment fragment = new HomeFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_home, container, false); + ButterKnife.bind(this, view); + init(); + return view; + } + + private void init() { + //沉浸式状态栏 + StatusBarUtil.transparentFlags(getActivity()); + + initHead(); + + initRecyclerView(); + + //Presenter + homePresenter = new HomePresenterImpl(getActivity()); + homePresenter.attachView(this); + + //初始化 网络请求 + homePresenter.loadBannerData(); + homePresenter.loadNews(); + homePresenter.loadHot(); + homePresenter.loadNewest(); + } + + + private void initHead() { + + part_home_head = LayoutInflater.from(getContext()).inflate(R.layout.part_home_head, null); + + bannerViewGroup = (FrameLayout) part_home_head.findViewById(R.id.home_autoScrollViewPager); + header_new = (TextView) part_home_head.findViewById(R.id.home_header_new); + + initHot(); + +// honmeClassifyViewPager = (ViewPager) part_home_head.findViewById(R.id.honme_classify_viewPager); +// //设置Page间间距 +// honmeClassifyViewPager.setPageMargin(20); +// //设置缓存的页面数量 +// honmeClassifyViewPager.setOffscreenPageLimit(4); + + } + + private void initHot() { + +// mHorizontalScrollView = (HorizontalScrollView) part_home_head.findViewById(R.id.id_horizontalScrollView); + mGallery = (LinearLayout)part_home_head.findViewById(R.id.id_gallery); + mHorizontalScrollView = (KamHorizontalScrollView) part_home_head.findViewById(R.id.id_horizontalScrollView); + + mHorizontalScrollView.setCreatItem(new KamHorizontalScrollView.CreatItem() { + @Override + public View getView(int index) { + + return createHotItem(index); + } + }); + } + + + private void initRecyclerView() { + // RecyclerView + homeRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + mData = new ArrayList(); + + CommonAdapter commonAdapter = new CommonAdapter(getContext(), R.layout.item_home_recyclerview, mData) { + @Override + protected void convert(ViewHolder holder, Base o, int position) { + + JSONObject resultJsonObject = o.getResultJsonObject(); + ImageView view = holder.getView(R.id.item_home_recyclerView_image); + holder.setImageResource(R.id.item_home_recyclerView_image,R.drawable.project_bg); + // Glide.with(HomeFragment.this).load(Urls.HOST + resultJsonObject.optString("pic")).crossFade().placeholder(R.drawable.project_bg).into(view); + LoadImage.getinstall().addTask(Urls.HOST + resultJsonObject.optString("pic"), view); + LoadImage.getinstall().doTask(); + + final ImageButton fat_in = holder.getView(R.id.home_fat_in); + final LinearLayout fat_out = holder.getView(R.id.home_fat_out); + holder.setText(R.id.item_home_rv_name,resultJsonObject.optString("") + " " + resultJsonObject.optString("")); + holder.setText(R.id.item_home_rv_year,resultJsonObject.optString("") + " " + resultJsonObject.optString("")); + + fat_in.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + v.setVisibility(View.GONE); + fat_out.setVisibility(View.VISIBLE); + } + }); + + fat_out. setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + v.setVisibility(View.GONE); + fat_in.setVisibility(View.VISIBLE); + } + }); + + + } + }; + + homeRecyclerView.setAdapter(commonAdapter); + + //添加header + mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(commonAdapter); + mHeaderAndFooterWrapper.addHeaderView(part_home_head); + homeRecyclerView.setAdapter(mHeaderAndFooterWrapper); + mHeaderAndFooterWrapper.notifyDataSetChanged(); + } + + + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnFragmentInteractionListener) { + mListener = (OnFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + mListener = null; + homePresenter.detachView(); + super.onDetach(); + } + + @Override + public void showBanner(List list) { + + SwitchViewPager switchViewPager = new SwitchViewPager(getContext(), list); + View createview = switchViewPager.createview(); + if (createview != null) { + bannerViewGroup.addView(createview); + } else { + UIHelper.toastMessage(getContext(), "banner图片为空"); + } + } + + @Override + public void showNews(Base base) { + JSONObject jsonObject = base.getResultJsonObject(); +// Html.fromHtml("s"); + header_new.setText( jsonObject.optString("name") ); + } + + @Override + public void showHot(List list ) { + hostList = list; + for (int i = 0; i < list.size(); i++) { + mGallery.addView(createHotItem(i)); + } + for (int i = list.size()-1; i >= 0; i--) { + + mHorizontalScrollView.addLeft(createHotItem(i)); + } + } + + private View createHotItem(int index) { + + View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_home_hot, null); + ImageView mImg = (ImageView) view.findViewById(R.id.home_hot_img); + int width = ((WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width / 2 - width/10, LinearLayout.LayoutParams.MATCH_PARENT); + // + JSONObject resultJsonObject = hostList.get(index).getResultJsonObject(); + + String pics = resultJsonObject.optString("pic"); + if (pics != null && pics.length() > 0) { +// Glide.with(HomeFragment.this).load(Urls.HOST +pics).crossFade().placeholder(R.drawable.project_bg).into(mImg); + LoadImage.getinstall().addTask(Urls.HOST + pics, mImg); + LoadImage.getinstall().doTask(); + } + view.setLayoutParams(layoutParams); + return view; + + } + + @Override + public void showNewest(List paramList) { + + mData.addAll(paramList); + mHeaderAndFooterWrapper.notifyDataSetChanged(); + } + + +public interface OnFragmentInteractionListener { + void onFragmentInteraction(Uri uri); +} +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HotFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HotFragment.java new file mode 100644 index 0000000..dce616f --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HotFragment.java @@ -0,0 +1,90 @@ +package com.hd.wlj.duohaowan.ui.home; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.Urls; +import com.orhanobut.logger.Logger; +import com.wlj.base.bean.Base; +import com.wlj.base.util.img.LoadImage; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * 分类item fragment + */ + + +public class HotFragment extends Fragment { + + + @BindView(R.id.home_hot_img) + ImageView homeClassifyImg; + private Base base; + + + public HotFragment() { + } + + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_home_hot, container, false); + + ButterKnife.bind(this, view); + + showData(); + return view; + } + + public static HotFragment newInstance(Base homeModel) { + + HotFragment classiryFragment = new HotFragment(); + classiryFragment.setHot(homeModel); + + return classiryFragment; + } + + private void showData() { + + if(base != null){ + JSONObject resultJsonObject = base.getResultJsonObject(); + + String pics = resultJsonObject.optString("pic"); + if(pics != null && pics.length() > 0 ){ + LoadImage.getinstall().addTask(Urls.HOST + pics,homeClassifyImg); + LoadImage.getinstall().doTask(); + } + }else{ + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + showData(); + } + + } + + public void setHot(Base base) { + this.base = base; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/contract/HomeContract.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/contract/HomeContract.java new file mode 100644 index 0000000..a29e9f8 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/contract/HomeContract.java @@ -0,0 +1,37 @@ +package com.hd.wlj.duohaowan.ui.home.contract; + +import com.wlj.base.bean.Base; + +import java.util.List; + +/** + * Created by wlj on 2016/10/26. + */ + +public class HomeContract { + + public interface View { + + void showBanner(List list); + + void showNews(Base news); + + void showHot(List hot); + + void showNewest(List newest); + } + + public interface Presenter { + + void attachView(V view); + + void detachView(); + + } + + public interface Model { + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/model/HomeModelImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/model/HomeModelImpl.java new file mode 100644 index 0000000..0b5b809 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/model/HomeModelImpl.java @@ -0,0 +1,164 @@ +package com.hd.wlj.duohaowan.ui.home.model; +import android.app.Activity; + +import com.hd.wlj.duohaowan.Urls; +import com.hd.wlj.duohaowan.ui.home.contract.HomeContract; +import com.wlj.base.bean.Banner; +import com.wlj.base.bean.Base; +import com.wlj.base.web.HttpPost; +import com.wlj.base.web.MsgContext; +import com.wlj.base.web.asyn.AsyncCall; +import com.wlj.base.web.asyn.AsyncRequestModle; +import com.wlj.base.web.asyn.BaseAsyncModle; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +/** +* Created by wlj on 2016/10/26 +*/ + + public class HomeModelImpl extends BaseAsyncModle implements HomeContract.Model{ + + /** + * 新闻消息 + */ + public final static int news = 2; + /** + * hot + */ + public final static int hot = 3; + /** + * 最新 + */ + public final static int newest = 4; + + // tag_type 标签 1/推荐 2/热门 3(热门+推荐) + + public HomeModelImpl() { + } + + public HomeModelImpl(Activity activity) { + super(activity); + } + + public HomeModelImpl(JSONObject jo) { + super(jo); + } + + @Override + public void addRequestParemeter(AsyncRequestModle paramAsyncRequestModle) throws IOException { + //首页banner图片 + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("pubConlumnId", MsgContext.home_banner); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setParserCla(Banner.class); + } + + @Override + public void addRequestParemeter(AsyncRequestModle asRequestModle, int type) throws IOException { + + if(type == news){ + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("pubConlumnId", MsgContext.home_news); + + asRequestModle.setHttpPost(httpPost); + + }else if(type == hot){ + // tag_type 标签 1/推荐 2/热门 3(热门+推荐) + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("rootPubConlumnId", MsgContext.home_hot); + httpPost.addParemeter("tag_type", "2"); + + asRequestModle.setHttpPost(httpPost); + + }else if(type == newest){ + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("secondPubConlumnId", MsgContext.home_newest); + + asRequestModle.setHttpPost(httpPost); + + } + + } + + @Override + public Base parse(JSONObject jsonObject) throws JSONException { + return new HomeModelImpl(jsonObject); + } + + public void loadBannerData(AsyncCall.OnAsyncBackListener lister) { + + AsyncCall request = Request(); + request.setOnAsyncBackListener(lister); + } + + /** + * 首页 顶部文字新闻 + * @param onAsyncBackListener + */ + public void loadNews(AsyncCall.OnAsyncBackListener onAsyncBackListener) { + Request(news).setOnAsyncBackListener(onAsyncBackListener); + } + + + + +} + +/** + * news + * { + "id" : "5812cc1f78e0802052dd7a14", + "name" : "“云南味道”咖啡拉花艺术大赛亮相中国国际食品博览会", + "intro" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgIIg", + "content" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgII=", + "state" : "1", + "rootPubConlumnId" : "56ef9534d812a83901549457", + "rootPubConlumnName" : "资讯管理", + "secondPubConlumnId" : "57fca5d9ef722c216b767c97", + "secondPubConlumnName" : "首页内容", + "thirdPubConlumnId" : "57fca5ffef722c216b767c99", + "thirdPubConlumnName" : "首页文字滚动资讯" + } + */ + +/** + * hot + * + * { + "id" : "5812cc1f78e0802052dd7a14", + "name" : "“云南味道”咖啡拉花艺术大赛亮相中国国际食品博览会", + "intro" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgIIg", + "content" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgII=", + "state" : "1", + "rootPubConlumnId" : "56ef9534d812a83901549457", + "rootPubConlumnName" : "资讯管理", + "secondPubConlumnId" : "57fca5d9ef722c216b767c97", + "secondPubConlumnName" : "首页内容", + "thirdPubConlumnId" : "57fca5ffef722c216b767c99", + "thirdPubConlumnName" : "首页文字滚动资讯" + } + */ + +/** + * newest + * + * { + "id" : "5812cc1f78e0802052dd7a14", + "name" : "“云南味道”咖啡拉花艺术大赛亮相中国国际食品博览会", + "intro" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgIIg", + "content" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgII=", + "state" : "1", + "rootPubConlumnId" : "56ef9534d812a83901549457", + "rootPubConlumnName" : "资讯管理", + "secondPubConlumnId" : "57fca5d9ef722c216b767c97", + "secondPubConlumnName" : "首页内容", + "thirdPubConlumnId" : "57fca5ffef722c216b767c99", + "thirdPubConlumnName" : "首页文字滚动资讯" + } + + */ diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/presenter/HomePresenterImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/presenter/HomePresenterImpl.java new file mode 100644 index 0000000..0ce75f3 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/presenter/HomePresenterImpl.java @@ -0,0 +1,148 @@ +package com.hd.wlj.duohaowan.ui.home.presenter; +import android.app.Activity; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import com.hd.wlj.duohaowan.ui.home.contract.HomeContract; +import com.hd.wlj.duohaowan.ui.home.model.HomeModelImpl; +import com.wlj.base.bean.Base; +import com.wlj.base.web.asyn.AsyncCall; + +import java.util.List; + +/** +* Created by wlj on 2016/10/26 +*/ + +public class HomePresenterImpl implements HomeContract.Presenter { + + + private final HomeModelImpl homeModel; + private HomeContract.View view; + + public HomePresenterImpl(Activity activity){ + homeModel = new HomeModelImpl(activity); + } + + @Override + public void attachView(HomeContract.View view) { + + this.view = view; + } + + @Override + public void detachView() { + + handler.removeCallbacks(null); + view = null; + } + + public void loadBannerData() { + + homeModel.loadBannerData(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + view.showBanner(paramList); + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + public void loadNews() { + + homeModel.loadNews(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + + tinner(paramList); + } + + @Override + public void fail(Exception paramException) { + + } + }); + } + + public void loadHot(){ + + homeModel.Request(HomeModelImpl.hot).setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + if(view != null) { + view.showHot(paramList); + } + } + + @Override + public void fail(Exception paramException) { + + } + }); + } + + public void loadNewest(){ + + homeModel.Request(HomeModelImpl.newest ).setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + if(view != null) { + view.showNewest(paramList); + } + } + + @Override + public void fail(Exception paramException) { + + } + }); + } + + private void tinner(final List paramList) { + new Thread(new Runnable() { + @Override + public void run() { + while(true) { + + for (int i = 0; i < paramList.size(); i++) { + + Message message = handler.obtainMessage(); + message.obj = paramList.get(i); + message.sendToTarget(); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + } + }).start(); + } + + private Handler handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(Message msg) { + + if(view != null) {//有可能要销毁 + view.showNews((Base) msg.obj); + } + + } + }; + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/HorizontalScrollViewAdapter.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/HorizontalScrollViewAdapter.java new file mode 100644 index 0000000..71261e3 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/HorizontalScrollViewAdapter.java @@ -0,0 +1,78 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import java.util.List; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.Urls; +import com.wlj.base.bean.Base; +import com.wlj.base.util.img.LoadImage; + +import org.json.JSONObject; + +public class HorizontalScrollViewAdapter { + private Context mContext; + private LayoutInflater mInflater; + private List mDatas; + + public HorizontalScrollViewAdapter(Context context, List mDatas) { + this.mContext = context; + mInflater = LayoutInflater.from(context); + this.mDatas = mDatas; + } + + public int getCount() { + return mDatas.size(); + } + + public Object getItem(int position) { + return mDatas.get(position); + } + + public long getItemId(int position) { + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder viewHolder = null; + if (convertView == null) { + + viewHolder = new ViewHolder(); + convertView = mInflater.inflate(R.layout.fragment_home_hot, parent, false); + viewHolder.mImg = (ImageView) convertView.findViewById(R.id.home_hot_img); + int width = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); + viewHolder.mImg.setLayoutParams(new LinearLayout.LayoutParams(width/2-150, LinearLayout.LayoutParams.MATCH_PARENT)); + + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + + // + Base base = mDatas.get(position); + + JSONObject resultJsonObject = base.getResultJsonObject(); + + String pics = resultJsonObject.optString("pic"); + if (pics != null && pics.length() > 0) { + LoadImage.getinstall().addTask(Urls.HOST + pics, viewHolder.mImg); + LoadImage.getinstall().doTask(); + } + + return convertView; + } + + private class ViewHolder { + ImageView mImg; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamHorizontalScrollView.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamHorizontalScrollView.java new file mode 100644 index 0000000..9d409e9 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamHorizontalScrollView.java @@ -0,0 +1,303 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.HorizontalScrollView; + +import com.orhanobut.logger.Logger; +import com.wlj.base.util.MathUtil; + +import java.math.BigDecimal; + + +/*如果不需要支持Android2.3,可以将代码中所有KamLinearLayout替换为ViewGroup*/ +public class KamHorizontalScrollView extends HorizontalScrollView { + + private CreatItem mCreatItem; + private Context context; + /*记录当前的页数标识(做日视图的时候可以和该值今日的日期作差)*/ + private int PageNo = 0; + /*保存ScrollView中的ViewGroup,如果不需要支持Android2.3,可以将KamLinearLayout替换为ViewGroup*/ + private KamLinearLayout childGroup = null; + /*这是判断左右滑动用的(个人喜好,其实不需要这么麻烦)*/ + private int poscache[] = new int[4]; + + private float startpos; + private KamLinearLayout.kamLayoutChangeListener listener; + private int childWidth = 1; + private float yushu = 0; + + + public KamHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + this.context = context; + } + + public KamHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + } + + public KamHorizontalScrollView(Context context) { + super(context); + this.context = context; + } + + /*重写触摸事件,判断左右滑动*/ + @Override + public boolean onTouchEvent(MotionEvent ev) { + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + startpos = ev.getX(); + /*用于判断触摸滑动的速度*/ +// initSpeedChange((int) ev.getX()); + break; + case MotionEvent.ACTION_MOVE: + /*更新触摸速度信息*/ +// movingSpeedChange((int) ev.getX()); + + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + /*先根据速度来判断向左或向右*/ +// int speed = releaseSpeedChange((int) ev.getX()); + + float movex = ev.getX() - startpos; + + if(childWidth == 1) { + if (childGroup.getChildCount() > 0) { + + View childAt = childGroup.getChildAt(0); + childWidth = childAt.getWidth(); + } + } +// Logger.e("movex:" + movex + " yushu:" + yushu); + movex += yushu; + yushu = movex % childWidth; + BigDecimal bigDecimal = MathUtil.divideDwon(movex,childWidth); + int i = Math.abs(bigDecimal.intValue()); +// Logger.e("movex:" + movex + " yushu:" + yushu+ " 个数: "+i +" "+ bigDecimal); + if (ev.getX() - startpos < 0) { + + for (int j = 0; j < i; j++) { + + nextPage(); + } + return true; + }else if (ev.getX() - startpos > 0) { + for (int j = 0; j < i; j++) { + + prevPage(); + } + return true; + } + } + } + return super.onTouchEvent(ev); + } + + /*下面的方法仅仅是个人喜好加上的,用于判断用户手指左右滑动的速度。*/ + private void initSpeedChange(int x) { + if (poscache.length <= 1) return; + poscache[0] = 1; + for (int i = 1; i < poscache.length; i++) { + + } + } + + /*完成实例化*/ + @Override + protected void onFinishInflate() { + super.onFinishInflate(); +// Logger.i( "onFinishInflate Called!"); + init(); + } + + /*初始化,加入三个子View*/ + private void init() { + if (this.childGroup == null) { + View childAt = getChildAt(0); + if (childAt instanceof KamLinearLayout) { + childGroup = (KamLinearLayout) childAt; + } else { + throw new RuntimeException("childGroup为空"); + } + } + + /*添加LayoutChange监听器*/ + childGroup.addKamLayoutChangeListener(listener); + + /*调用其自身的LayoutChange监听器(不支持Android2.3)*/ + /*childGroup.addOnLayoutChangeListener(listener);*/ + + /*添加监听器*/ + listener = new KamLinearLayout.kamLayoutChangeListener() { + @Override + public void onLayoutChange() { + Logger.i( "onLayoutChanged Called!"); + scrollToPage(1); + } + + }; + } + + + /* + //注意,如果不需要支持Android2.3,可以将上面的listener替换成下方listener + OnLayoutChangeListener listener = new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View arg0, int arg1, int arg2, int arg3, + int arg4, int arg5, int arg6, int arg7, int arg8) { + Logger.i(tag, "onLayoutChanged Called!"); + scrollToPage(1); + } + } + */ + + /*左翻页*/ + public void prevPage() { + Logger.d("prevPage"); + PageNo--; + addLeft(getView(PageNo )); + removeRight(); + } + + /*右翻页*/ + public void nextPage() { + Logger.d("nextPage"); + PageNo++; + addRight(getView(PageNo )); + removeLeft(); + } + + private View getView(int index) { + + int childCount = childGroup.getChildCount()/2; + int i = (index % childCount + childCount) % childCount; + return mCreatItem.getView(i); + } + + /*获取某个孩子的X坐标*/ + private int getChildLeft(int index) { + if (index >= 0 && childGroup != null) { + if (index < childGroup.getChildCount()) + return childGroup.getChildAt(index).getLeft(); + } + return 0; + } + + /** + * 向右边添加View + * + * @param view 需要添加的View + * @return true添加成功|false添加失败 + */ + + public boolean addRight(View view) { + + if (view == null || childGroup == null) return false; + childGroup.addView(view); + return true; + } + + /** + * 删除右边的View + * + * @return true成功|false失败 + */ + public boolean removeRight() { + if (childGroup == null || childGroup.getChildCount() <= 0) return false; + childGroup.removeViewAt(childGroup.getChildCount() - 1); + return true; + } + + /** + * 向左边添加View + * @param view 需要添加的View1 + * @return true添加成功|false添加失败 + */ + public boolean addLeft(View view) { + if (view == null || childGroup == null) return false; + childGroup.addView(view, 0); + /*因为在左边增加了View,因此所有View的x坐标都会增加,因此需要让ScrollView也跟着移动,才能从屏幕看来保持平滑。*/ + int tmpwidth = view.getLayoutParams().width; + if (tmpwidth == 0) tmpwidth = getWinWidth(); + Logger.i( "the new view's width = " + view.getLayoutParams().width); + this.scrollTo(this.getScrollX() + tmpwidth, 0); + return true; + } + + /** + * 删除左边的View + * @return true成功|false失败 + */ + public boolean removeLeft() { + if (childGroup == null || childGroup.getChildCount() <= 0) return false; + /*因为在左边删除了View,因此所有View的x坐标都会减少,因此需要让ScrollView也跟着移动。*/ + int tmpwidth = childGroup.getChildAt(0).getWidth(); + childGroup.removeViewAt(0); + this.scrollTo((int) (this.getScrollX() - tmpwidth), 0); + return true; + } + + /** + * 跳转到指定的页面 + * + * @param index 跳转的页码 + * @return + */ + public boolean scrollToPage(int index) { + if (childGroup == null) return false; + if (index < 0 || index >= childGroup.getChildCount()) return false; + smoothScrollTo(getChildLeft(index), 0); + return true; + } + + private int getWinWidth() { + // 获取屏幕信息 + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + return dm.widthPixels; + } + + private int getWinHeight() { + // 获取屏幕信息 + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + return dm.heightPixels; + } + +// private void movingSpeedChange(int x) { +// poscache[0] %= poscache.length - 1; +// poscache[0]++; +// //Logger.i(tag, "touch speed:"+(x-poscache[poscache[0]])); +// poscache[poscache[0]] = x; +// } +// +// private int releaseSpeedChange(int x) { +// return releaseSpeedChange(x, 30); +// } +// +// private int releaseSpeedChange(int x, int limit) { +// poscache[0] %= poscache.length - 1; +// poscache[0]++; +// /*检测到向左的速度很大*/ +// if (poscache[poscache[0]] - x > limit) return 1; +// /*检测到向右的速度很大*/ +// if (x - poscache[poscache[0]] > limit) return -1; +// +// return 0; +// } + + public void setCreatItem(CreatItem mCreatItem) { + this.mCreatItem = mCreatItem; + } + + public interface CreatItem { + + View getView(int index); + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamLinearLayout.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamLinearLayout.java new file mode 100644 index 0000000..910ed25 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamLinearLayout.java @@ -0,0 +1,34 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +public class KamLinearLayout extends LinearLayout { + kamLayoutChangeListener listener = null; + + public void addKamLayoutChangeListener(kamLayoutChangeListener listener) { + this.listener = listener; + } + + + public KamLinearLayout(Context context) { + super(context); + } + + public KamLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + if (this.listener != null) this.listener.onLayoutChange(); + } + + + /*自定义监听器*/ + public interface kamLayoutChangeListener { + abstract void onLayoutChange(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/MyHorizontalScrollView.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/MyHorizontalScrollView.java new file mode 100644 index 0000000..0f80dfe --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/MyHorizontalScrollView.java @@ -0,0 +1,278 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import java.util.HashMap; +import java.util.Map; + +import android.content.Context; +import android.graphics.Color; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.WindowManager; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; + +public class MyHorizontalScrollView extends HorizontalScrollView implements + OnClickListener { + + /** + * 图片滚动时的回调接口 + * + * @author zhy + */ + public interface CurrentImageChangeListener { + void onCurrentImgChanged(int position, View viewIndicator); + } + + /** + * 条目点击时的回调 + * + * @author zhy + */ + public interface OnItemClickListener { + void onClick(View view, int pos); + } + + private CurrentImageChangeListener mListener; + + private OnItemClickListener mOnClickListener; + + private static final String TAG = "MyHorizontalScrollView"; + + /** + * HorizontalListView中的LinearLayout + */ + private LinearLayout mContainer; + + /** + * 子元素的宽度 + */ + private int mChildWidth; + /** + * 子元素的高度 + */ + private int mChildHeight; + /** + * 当前最后一张图片的index + */ + private int mCurrentIndex; + /** + * 当前第一张图片的下标 + */ + private int mFristIndex; + /** + * 当前第一个View + */ + private View mFirstView; + /** + * 数据适配器 + */ + private HorizontalScrollViewAdapter mAdapter; + /** + * 每屏幕最多显示的个数 + */ + private int mCountOneScreen; + /** + * 屏幕的宽度 + */ + private int mScreenWitdh; + + + /** + * 保存View与位置的键值对 + */ + private Map mViewPos = new HashMap(); + + public MyHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + // 获得屏幕宽度 + WindowManager wm = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics outMetrics = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(outMetrics); + mScreenWitdh = outMetrics.widthPixels; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mContainer = (LinearLayout) getChildAt(0); + } + + /** + * 加载下一张图片 + */ + protected void loadNextImg() { + // 数组边界值计算 + if (mCurrentIndex == mAdapter.getCount() - 1) { + return; + } + //移除第一张图片,且将水平滚动位置置0 + scrollTo(0, 0); + mViewPos.remove(mContainer.getChildAt(0)); + mContainer.removeViewAt(0); + + //获取下一张图片,并且设置onclick事件,且加入容器中 + View view = mAdapter.getView(++mCurrentIndex, null, mContainer); + view.setOnClickListener(this); + mContainer.addView(view); + mViewPos.put(view, mCurrentIndex); + + //当前第一张图片小标 + mFristIndex++; + //如果设置了滚动监听则触发 + if (mListener != null) { + notifyCurrentImgChanged(); + } + + } + + /** + * 加载前一张图片 + */ + protected void loadPreImg() { + //如果当前已经是第一张,则返回 + if (mFristIndex == 0) + return; + //获得当前应该显示为第一张图片的下标 + int index = mCurrentIndex - mCountOneScreen; + if (index >= 0) { +// mContainer = (LinearLayout) getChildAt(0); + //移除最后一张 + int oldViewPos = mContainer.getChildCount() - 1; + mViewPos.remove(mContainer.getChildAt(oldViewPos)); + mContainer.removeViewAt(oldViewPos); + + //将此View放入第一个位置 + View view = mAdapter.getView(index, null, mContainer); + mViewPos.put(view, index); + mContainer.addView(view, 0); + view.setOnClickListener(this); + //水平滚动位置向左移动view的宽度个像素 + scrollTo(mChildWidth, 0); + //当前位置--,当前第一个显示的下标-- + mCurrentIndex--; + mFristIndex--; + //回调 + if (mListener != null) { + notifyCurrentImgChanged(); + + } + } + } + + /** + * 滑动时的回调 + */ + public void notifyCurrentImgChanged() { + //先清除所有的背景色,点击时会设置为蓝色 + for (int i = 0; i < mContainer.getChildCount(); i++) { + mContainer.getChildAt(i).setBackgroundColor(Color.WHITE); + } + + mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(0)); + + } + + /** + * 初始化数据,设置数据适配器 + * + * @param mAdapter + */ + public void initDatas(HorizontalScrollViewAdapter mAdapter) { + this.mAdapter = mAdapter; + mContainer = (LinearLayout) getChildAt(0); + // 获得适配器中第一个View + final View view = mAdapter.getView(0, null, mContainer); + mContainer.addView(view); + + // 强制计算当前View的宽和高 + if (mChildWidth == 0 && mChildHeight == 0) { + int w = View.MeasureSpec.makeMeasureSpec(0, + View.MeasureSpec.UNSPECIFIED); + int h = View.MeasureSpec.makeMeasureSpec(0, + View.MeasureSpec.UNSPECIFIED); + view.measure(w, h); + mChildHeight = view.getMeasuredHeight(); + mChildWidth = view.getMeasuredWidth(); + Log.e(TAG, view.getMeasuredWidth() + "," + view.getMeasuredHeight()); + mChildHeight = view.getMeasuredHeight(); + // 计算每次加载多少个View + mCountOneScreen = mScreenWitdh / mChildWidth + 2; + + Log.e(TAG, "mCountOneScreen = " + mCountOneScreen + + " ,mChildWidth = " + mChildWidth); + + + } + //初始化第一屏幕的元素 + initFirstScreenChildren(mCountOneScreen); + } + + /** + * 加载第一屏的View + * + * @param mCountOneScreen + */ + public void initFirstScreenChildren(int mCountOneScreen) { + mContainer = (LinearLayout) getChildAt(0); + mContainer.removeAllViews(); + mViewPos.clear(); + + for (int i = 0; i < mCountOneScreen; i++) { + View view = mAdapter.getView(i, null, mContainer); + view.setOnClickListener(this); + mContainer.addView(view); + mViewPos.put(view, i); + mCurrentIndex = i; + } + + if (mListener != null) { + notifyCurrentImgChanged(); + } + + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + switch (ev.getAction()) { + case MotionEvent.ACTION_MOVE: +// Log.e(TAG, getScrollX() + ""); + + int scrollX = getScrollX(); + // 如果当前scrollX为view的宽度,加载下一张,移除第一张 + if (scrollX >= mChildWidth) { + loadNextImg(); + } + // 如果当前scrollX = 0, 往前设置一张,移除最后一张 + if (scrollX == 0) { + loadPreImg(); + } + break; + } + return super.onTouchEvent(ev); + } + + @Override + public void onClick(View v) { + if (mOnClickListener != null) { + for (int i = 0; i < mContainer.getChildCount(); i++) { + mContainer.getChildAt(i).setBackgroundColor(Color.WHITE); + } + mOnClickListener.onClick(v, mViewPos.get(v)); + } + } + + public void setOnItemClickListener(OnItemClickListener mOnClickListener) { + this.mOnClickListener = mOnClickListener; + } + + public void setCurrentImageChangeListener( + CurrentImageChangeListener mListener) { + this.mListener = mListener; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/my/MyFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/my/MyFragment.java new file mode 100644 index 0000000..5890d56 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/my/MyFragment.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.my; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hd.wlj.duohaowan.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class MyFragment extends Fragment { + + + public MyFragment() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_my, container, false); + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/seach/SeachFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/seach/SeachFragment.java new file mode 100644 index 0000000..39ec4d8 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/seach/SeachFragment.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.seach; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hd.wlj.duohaowan.R; +import com.wlj.base.ui.BaseFragment; +import com.wlj.base.util.statusbar.StatusBarUtil; + +/** + * Created by wlj on 2016/10/27. + */ + +public class SeachFragment extends Fragment { + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_seach, container, false); + +// StatusBarUtil.setTransparentForImageViewInFragment(getActivity(),null); + return view; + } + + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/view/ImgInpImg.java b/app/src/main/java/com/hd/wlj/duohaowan/view/ImgInpImg.java new file mode 100644 index 0000000..df496ee --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/view/ImgInpImg.java @@ -0,0 +1,131 @@ +package com.hd.wlj.duohaowan.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.RequiresApi; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.R; +import com.orhanobut.logger.Logger; +import com.wlj.base.widget.IconfontTextview; + +/** + * iconfont EditText iconfont组合 + * + */ +public class ImgInpImg extends FrameLayout { + private float deftextsize = 16f; + private int deftextcolor = Color.BLACK; + private TextView iconFontView1; + private EditText editTextView; + private TextView iconFontView2; + + public ImgInpImg(Context context) { + this(context,null); + } + + public ImgInpImg(Context context, AttributeSet attrs) { + this(context, attrs,0); + } + + public ImgInpImg(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + init(context, attrs); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public ImgInpImg(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + init(context, attrs); + } + + private void init(Context context, AttributeSet attrs) { + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImgInpImg); + //-------- 获取值 + //iconFontView1 + String iconfont1Text = a.getString(R.styleable.ImgInpImg_iconfont1_text); + int iconfont1TextColor = a.getColor(R.styleable.ImgInpImg_iconfont1_color, deftextcolor); + + //iconFontView2 + String iconfont2Text = a.getString(R.styleable.ImgInpImg_iconfont2_text); + int iconfont2TextColor = a.getColor(R.styleable.ImgInpImg_iconfont2_color, deftextcolor); + // EditText + String editTextHit = a.getString(R.styleable.ImgInpImg_edittext_hit); + String editTextText = a.getString( R.styleable.ImgInpImg_edittext_text); + int editTextTextColor = a.getColor(R.styleable.ImgInpImg_edittext_textcolor,deftextcolor); + + boolean backgroundisNull = a.getBoolean(R.styleable.ImgInpImg_edittext_background_isnull, false); + Drawable background_drawable = a.getDrawable(R.styleable.ImgInpImg_edittext_background); +// int resourceId = a.getResourceId(R.styleable.ImgInpImg_edittext_background, 0); +// Bitmap background_bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId); + + //---------布局 + View inflate = LayoutInflater.from(context).inflate(R.layout.view_img_inp_img, this); + + iconFontView1 = (TextView)inflate.findViewById(R.id.img_inp_img__imgs); + + editTextView = (EditText)inflate.findViewById(R.id.img_inp_img__input); + iconFontView2 = (TextView)inflate.findViewById(R.id.img_inp_img__imge); + + //---------- 设置值 + //iconFontView1 + iconFontView1.setText(iconfont1Text); + iconFontView1.setTextColor(iconfont1TextColor); + iconFontView1.setTextSize(deftextsize); + //editTextView + editTextView.setText(editTextText); + editTextView.setHint(editTextHit); + editTextView.setTextColor(editTextTextColor); + editTextView.setTextSize(deftextsize); + + if(background_drawable != null ) { + + editTextView.setBackgroundDrawable(background_drawable); + }else if(backgroundisNull){ + editTextView.setBackgroundDrawable(null); + } + // iconFontView2 + iconFontView2.setText(iconfont2Text); + iconFontView2.setTextColor(iconfont2TextColor); + iconFontView2.setTextSize(deftextsize); + } + + public void setInputType(int type){ + editTextView.setInputType(type); + } + + /** + * iconFontView2 的点击事件 + * @param onClickListener + */ + public void setOnClickListener(OnClickListener onClickListener){ + iconFontView2.setOnClickListener(onClickListener); + } + + public String getText(){ + + return editTextView.getText()+""; + } + + public IconfontTextview getIconFontView2() { + return (IconfontTextview)iconFontView2; + } + + public IconfontTextview getIconFontView1() { + return (IconfontTextview)iconFontView1; + } + + public EditText getEditTextView() { + return editTextView; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/wxapi/WXEntryActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/wxapi/WXEntryActivity.java new file mode 100644 index 0000000..dc67ce5 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/wxapi/WXEntryActivity.java @@ -0,0 +1,164 @@ +package com.hd.wlj.duohaowan.wxapi; + + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Button; +import android.widget.Toast; + +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.third.share.Constants; +import com.tencent.mm.sdk.constants.ConstantsAPI; +import com.tencent.mm.sdk.modelbase.BaseReq; +import com.tencent.mm.sdk.modelbase.BaseResp; +import com.tencent.mm.sdk.modelmsg.ShowMessageFromWX; +import com.tencent.mm.sdk.modelmsg.WXAppExtendObject; +import com.tencent.mm.sdk.modelmsg.WXMediaMessage; +import com.tencent.mm.sdk.openapi.IWXAPI; +import com.tencent.mm.sdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.sdk.openapi.WXAPIFactory; +import com.wlj.base.util.UIHelper; + + +public class WXEntryActivity extends Activity implements IWXAPIEventHandler { + + private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001; + + private Button gotoBtn, regBtn, launchBtn, checkBtn; + + // IWXAPI 是第三方app和微信通信的openapi接口 + private IWXAPI api; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// setContentView(R.layout.entry); + + // 通过WXAPIFactory工厂,获取IWXAPI的实例 + api = WXAPIFactory.createWXAPI(this, Constants.WX_APP_ID, false); + api.registerApp(Constants.WX_APP_ID); +// regBtn = (Button) findViewById(R.id.reg_btn); +// regBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// // 将该app注册到微信 +// api.registerApp(Constants.APP_ID); +// } +// }); +// +// gotoBtn = (Button) findViewById(R.id.goto_send_btn); +// gotoBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// startActivity(new Intent(WXEntryActivity.this, SendToWXActivity.class)); +// finish(); +// } +// }); +// +// launchBtn = (Button) findViewById(R.id.launch_wx_btn); +// launchBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// Toast.makeText(WXEntryActivity.this, "launch result = " + api.openWXApp(), Toast.LENGTH_LONG).show(); +// } +// }); +// +// checkBtn = (Button) findViewById(R.id.check_timeline_supported_btn); +// checkBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// int wxSdkVersion = api.getWXAppSupportAPI(); +// if (wxSdkVersion >= TIMELINE_SUPPORTED_VERSION) { +// Toast.makeText(WXEntryActivity.this, "wxSdkVersion = " + Integer.toHexString(wxSdkVersion) + "\ntimeline supported", Toast.LENGTH_LONG).show(); +// } else { +// Toast.makeText(WXEntryActivity.this, "wxSdkVersion = " + Integer.toHexString(wxSdkVersion) + "\ntimeline not supported", Toast.LENGTH_LONG).show(); +// } +// } +// }); + + api.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + setIntent(intent); + api.handleIntent(intent, this); + } + + // 微信发送请求到第三方应用时,会回调到该方法 + @Override + public void onReq(BaseReq req) { + switch (req.getType()) { + case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX: + goToGetMsg(); + break; + case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX: + goToShowMsg((ShowMessageFromWX.Req) req); + break; + default: + break; + } + } + + // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法 + @Override + public void onResp(BaseResp resp) { + int result = 0; + + switch (resp.errCode) { + case BaseResp.ErrCode.ERR_OK: + result = R.string.weibosdk_demo_toast_share_success; + break; + case BaseResp.ErrCode.ERR_USER_CANCEL: + result = R.string.weibosdk_demo_toast_share_canceled; + break; + case BaseResp.ErrCode.ERR_AUTH_DENIED: +// result = "errcode_deny"; + break; + default: + result = R.string.weibosdk_demo_toast_share_failed; + break; + } + + Toast.makeText(this, result, Toast.LENGTH_LONG).show(); + } + + private void goToGetMsg() { + UIHelper.toastMessage(this," goToGetMsg "); +// Intent intent = new Intent(this, GetFromWXActivity.class); +// intent.putExtras(getIntent()); +// startActivity(intent); +// finish(); + } + + private void goToShowMsg(ShowMessageFromWX.Req showReq) { + WXMediaMessage wxMsg = showReq.message; + WXAppExtendObject obj = (WXAppExtendObject) wxMsg.mediaObject; + + StringBuffer msg = new StringBuffer(); // 组织一个待显示的消息内容 + msg.append("description: "); + msg.append(wxMsg.description); + msg.append("\n"); + msg.append("extInfo: "); + msg.append(obj.extInfo); + msg.append("\n"); + msg.append("filePath: "); + msg.append(obj.filePath); + + UIHelper.toastMessage(this,"goToShowMsg "+msg.toString()); + +// Intent intent = new Intent(this, ShowFromWXActivity.class); +// intent.putExtra(Constants.ShowMsgActivity.STitle, wxMsg.title); +// intent.putExtra(Constants.ShowMsgActivity.SMessage, msg.toString()); +// intent.putExtra(Constants.ShowMsgActivity.BAThumbData, wxMsg.thumbData); +// startActivity(intent); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zhy/adapter/abslistview/CommonAdapter.java b/app/src/main/java/com/zhy/adapter/abslistview/CommonAdapter.java new file mode 100755 index 0000000..2608948 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/CommonAdapter.java @@ -0,0 +1,41 @@ +package com.zhy.adapter.abslistview; + +import android.content.Context; +import android.view.View; + +import com.zhy.adapter.abslistview.base.ItemViewDelegate; + +import java.util.List; + +public abstract class CommonAdapter extends MultiItemTypeAdapter +{ + + public CommonAdapter(Context context, final int layoutId, List datas) + { + super(context, datas); + + addItemViewDelegate(new ItemViewDelegate() + { + @Override + public int getItemViewLayoutId() + { + return layoutId; + } + + @Override + public boolean isForViewType(T item, int position) + { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) + { + CommonAdapter.this.convert(holder, t, position); + } + }); + } + + protected abstract void convert(ViewHolder viewHolder, T item, int position); + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/MultiItemTypeAdapter.java b/app/src/main/java/com/zhy/adapter/abslistview/MultiItemTypeAdapter.java new file mode 100755 index 0000000..1cba072 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/MultiItemTypeAdapter.java @@ -0,0 +1,98 @@ +package com.zhy.adapter.abslistview; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +import com.zhy.adapter.abslistview.base.ItemViewDelegate; +import com.zhy.adapter.abslistview.base.ItemViewDelegateManager; + +import java.util.List; + +public class MultiItemTypeAdapter extends BaseAdapter { + protected Context mContext; + protected List mDatas; + + private ItemViewDelegateManager mItemViewDelegateManager; + + + public MultiItemTypeAdapter(Context context, List datas) { + this.mContext = context; + this.mDatas = datas; + mItemViewDelegateManager = new ItemViewDelegateManager(); + } + + public MultiItemTypeAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(itemViewDelegate); + return this; + } + + private boolean useItemViewDelegateManager() { + return mItemViewDelegateManager.getItemViewDelegateCount() > 0; + } + + @Override + public int getViewTypeCount() { + if (useItemViewDelegateManager()) + return mItemViewDelegateManager.getItemViewDelegateCount(); + return super.getViewTypeCount(); + } + + @Override + public int getItemViewType(int position) { + if (useItemViewDelegateManager()) { + int viewType = mItemViewDelegateManager.getItemViewType(mDatas.get(position), position); + return viewType; + } + return super.getItemViewType(position); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(mDatas.get(position), position); + int layoutId = itemViewDelegate.getItemViewLayoutId(); + ViewHolder viewHolder = null ; + if (convertView == null) + { + View itemView = LayoutInflater.from(mContext).inflate(layoutId, parent, + false); + viewHolder = new ViewHolder(mContext, itemView, parent, position); + viewHolder.mLayoutId = layoutId; + onViewHolderCreated(viewHolder,viewHolder.getConvertView()); + } else + { + viewHolder = (ViewHolder) convertView.getTag(); + viewHolder.mPosition = position; + } + + + convert(viewHolder, getItem(position), position); + return viewHolder.getConvertView(); + } + + protected void convert(ViewHolder viewHolder, T item, int position) { + mItemViewDelegateManager.convert(viewHolder, item, position); + } + + public void onViewHolderCreated(ViewHolder holder , View itemView ) + {} + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public T getItem(int position) { + return mDatas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/ViewHolder.java b/app/src/main/java/com/zhy/adapter/abslistview/ViewHolder.java new file mode 100755 index 0000000..d8a86b0 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/ViewHolder.java @@ -0,0 +1,290 @@ +package com.zhy.adapter.abslistview; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.util.Linkify; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.widget.Checkable; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RatingBar; +import android.widget.TextView; + +public class ViewHolder +{ + private SparseArray mViews; + protected int mPosition; + private View mConvertView; + private Context mContext; + protected int mLayoutId; + + public ViewHolder(Context context, View itemView, ViewGroup parent, int position) + { + mContext = context; + mConvertView = itemView; + mPosition = position; + mViews = new SparseArray(); + mConvertView.setTag(this); + } + + + public static ViewHolder get(Context context, View convertView, + ViewGroup parent, int layoutId, int position) + { + if (convertView == null) + { + View itemView = LayoutInflater.from(context).inflate(layoutId, parent, + false); + ViewHolder holder = new ViewHolder(context, itemView, parent, position); + holder.mLayoutId = layoutId; + return holder; + } else + { + ViewHolder holder = (ViewHolder) convertView.getTag(); + holder.mPosition = position; + return holder; + } + } + + + /** + * 通过viewId获取控件 + * + * @param viewId + * @return + */ + public T getView(int viewId) + { + View view = mViews.get(viewId); + if (view == null) + { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + public View getConvertView() + { + return mConvertView; + } + + public int getLayoutId() + { + return mLayoutId; + } + + public void updatePosition(int position) + { + mPosition = position; + } + + public int getItemPosition() + { + return mPosition; + } + + + /****以下为辅助方法*****/ + + /** + * 设置TextView的值 + * + * @param viewId + * @param text + * @return + */ + public ViewHolder setText(int viewId, String text) + { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setImageResource(int viewId, int resId) + { + ImageView view = getView(viewId); + view.setImageResource(resId); + return this; + } + + public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) + { + ImageView view = getView(viewId); + view.setImageBitmap(bitmap); + return this; + } + + public ViewHolder setImageDrawable(int viewId, Drawable drawable) + { + ImageView view = getView(viewId); + view.setImageDrawable(drawable); + return this; + } + + public ViewHolder setBackgroundColor(int viewId, int color) + { + View view = getView(viewId); + view.setBackgroundColor(color); + return this; + } + + public ViewHolder setBackgroundRes(int viewId, int backgroundRes) + { + View view = getView(viewId); + view.setBackgroundResource(backgroundRes); + return this; + } + + public ViewHolder setTextColor(int viewId, int textColor) + { + TextView view = getView(viewId); + view.setTextColor(textColor); + return this; + } + + public ViewHolder setTextColorRes(int viewId, int textColorRes) + { + TextView view = getView(viewId); + view.setTextColor(mContext.getResources().getColor(textColorRes)); + return this; + } + + @SuppressLint("NewApi") + public ViewHolder setAlpha(int viewId, float value) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + { + getView(viewId).setAlpha(value); + } else + { + // Pre-honeycomb hack to set Alpha value + AlphaAnimation alpha = new AlphaAnimation(value, value); + alpha.setDuration(0); + alpha.setFillAfter(true); + getView(viewId).startAnimation(alpha); + } + return this; + } + + public ViewHolder setVisible(int viewId, boolean visible) + { + View view = getView(viewId); + view.setVisibility(visible ? View.VISIBLE : View.GONE); + return this; + } + + public ViewHolder linkify(int viewId) + { + TextView view = getView(viewId); + Linkify.addLinks(view, Linkify.ALL); + return this; + } + + public ViewHolder setTypeface(Typeface typeface, int... viewIds) + { + for (int viewId : viewIds) + { + TextView view = getView(viewId); + view.setTypeface(typeface); + view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); + } + return this; + } + + public ViewHolder setProgress(int viewId, int progress) + { + ProgressBar view = getView(viewId); + view.setProgress(progress); + return this; + } + + public ViewHolder setProgress(int viewId, int progress, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + view.setProgress(progress); + return this; + } + + public ViewHolder setMax(int viewId, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + return this; + } + + public ViewHolder setRating(int viewId, float rating) + { + RatingBar view = getView(viewId); + view.setRating(rating); + return this; + } + + public ViewHolder setRating(int viewId, float rating, int max) + { + RatingBar view = getView(viewId); + view.setMax(max); + view.setRating(rating); + return this; + } + + public ViewHolder setTag(int viewId, Object tag) + { + View view = getView(viewId); + view.setTag(tag); + return this; + } + + public ViewHolder setTag(int viewId, int key, Object tag) + { + View view = getView(viewId); + view.setTag(key, tag); + return this; + } + + public ViewHolder setChecked(int viewId, boolean checked) + { + Checkable view = (Checkable) getView(viewId); + view.setChecked(checked); + return this; + } + + /** + * 关于事件的 + */ + public ViewHolder setOnClickListener(int viewId, + View.OnClickListener listener) + { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + + public ViewHolder setOnTouchListener(int viewId, + View.OnTouchListener listener) + { + View view = getView(viewId); + view.setOnTouchListener(listener); + return this; + } + + public ViewHolder setOnLongClickListener(int viewId, + View.OnLongClickListener listener) + { + View view = getView(viewId); + view.setOnLongClickListener(listener); + return this; + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegate.java b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegate.java new file mode 100755 index 0000000..4f5ca9c --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegate.java @@ -0,0 +1,22 @@ +package com.zhy.adapter.abslistview.base; + + +import android.view.View; + +import com.zhy.adapter.abslistview.ViewHolder; + +/** + * Created by zhy on 16/6/22. + */ +public interface ItemViewDelegate +{ + + public abstract int getItemViewLayoutId(); + + public abstract boolean isForViewType(T item, int position); + + public abstract void convert(ViewHolder holder, T t, int position); + + + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegateManager.java b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegateManager.java new file mode 100755 index 0000000..298cccf --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegateManager.java @@ -0,0 +1,133 @@ +package com.zhy.adapter.abslistview.base; + +import android.support.v4.util.SparseArrayCompat; + +import com.zhy.adapter.abslistview.ViewHolder; + + +/** + * Created by zhy on 16/6/22. + */ +public class ItemViewDelegateManager +{ + SparseArrayCompat> delegates = new SparseArrayCompat(); + + public int getItemViewDelegateCount() + { + return delegates.size(); + } + + public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate) + { + int viewType = delegates.size(); + if (delegate != null) + { + delegates.put(viewType, delegate); + viewType++; + } + return this; + } + + public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate) + { + if (delegates.get(viewType) != null) + { + throw new IllegalArgumentException( + "An ItemViewDelegate is already registered for the viewType = " + + viewType + + ". Already registered ItemViewDelegate is " + + delegates.get(viewType)); + } + delegates.put(viewType, delegate); + return this; + } + + public ItemViewDelegateManager removeDelegate(ItemViewDelegate delegate) + { + if (delegate == null) + { + throw new NullPointerException("ItemViewDelegate is null"); + } + int indexToRemove = delegates.indexOfValue(delegate); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public ItemViewDelegateManager removeDelegate(int itemType) + { + int indexToRemove = delegates.indexOfKey(itemType); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public int getItemViewType(T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = delegatesCount - 1; i >= 0; i--) + { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType(item, position)) + { + return delegates.keyAt(i); + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + public void convert(ViewHolder holder, T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = 0; i < delegatesCount; i++) + { + ItemViewDelegate delegate = delegates.valueAt(i); + + if (delegate.isForViewType(item, position)) + { + delegate.convert(holder, item, position); + return; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegateManager added that matches position=" + position + " in data source"); + } + + + public int getItemViewLayoutId(int viewType) + { + return delegates.get(viewType).getItemViewLayoutId(); + } + + public int getItemViewType(ItemViewDelegate itemViewDelegate) + { + return delegates.indexOfValue(itemViewDelegate); + } + + public ItemViewDelegate getItemViewDelegate(T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = delegatesCount - 1; i >= 0; i--) + { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType(item, position)) + { + return delegate; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + public int getItemViewLayoutId(T item, int position) + { + return getItemViewDelegate(item,position).getItemViewLayoutId(); + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/CommonAdapter.java b/app/src/main/java/com/zhy/adapter/recyclerview/CommonAdapter.java new file mode 100755 index 0000000..f5c36f1 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/CommonAdapter.java @@ -0,0 +1,55 @@ +package com.zhy.adapter.recyclerview; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; + +import com.zhy.adapter.recyclerview.base.ItemViewDelegate; +import com.zhy.adapter.recyclerview.base.ViewHolder; + +import java.util.List; + +/** + * Created by zhy on 16/4/9. + */ +public abstract class CommonAdapter extends MultiItemTypeAdapter +{ + protected Context mContext; + protected int mLayoutId; + protected List mDatas; + protected LayoutInflater mInflater; + + public CommonAdapter(final Context context, final int layoutId, List datas) + { + super(context, datas); + mContext = context; + mInflater = LayoutInflater.from(context); + mLayoutId = layoutId; + mDatas = datas; + + addItemViewDelegate(new ItemViewDelegate() + { + @Override + public int getItemViewLayoutId() + { + return layoutId; + } + + @Override + public boolean isForViewType( T item, int position) + { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) + { + CommonAdapter.this.convert(holder, t, position); + } + }); + } + + protected abstract void convert(ViewHolder holder, T t, int position); + + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/MultiItemTypeAdapter.java b/app/src/main/java/com/zhy/adapter/recyclerview/MultiItemTypeAdapter.java new file mode 100755 index 0000000..84613d3 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/MultiItemTypeAdapter.java @@ -0,0 +1,124 @@ +package com.zhy.adapter.recyclerview; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ItemViewDelegate; +import com.zhy.adapter.recyclerview.base.ItemViewDelegateManager; +import com.zhy.adapter.recyclerview.base.ViewHolder; + +import java.util.List; + +/** + * Created by zhy on 16/4/9. + */ +public class MultiItemTypeAdapter extends RecyclerView.Adapter { + protected Context mContext; + protected List mDatas; + + protected ItemViewDelegateManager mItemViewDelegateManager; + protected OnItemClickListener mOnItemClickListener; + + + public MultiItemTypeAdapter(Context context, List datas) { + mContext = context; + mDatas = datas; + mItemViewDelegateManager = new ItemViewDelegateManager(); + } + + @Override + public int getItemViewType(int position) { + if (!useItemViewDelegateManager()) return super.getItemViewType(position); + return mItemViewDelegateManager.getItemViewType(mDatas.get(position), position); + } + + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType); + int layoutId = itemViewDelegate.getItemViewLayoutId(); + ViewHolder holder = ViewHolder.createViewHolder(mContext, parent, layoutId); + onViewHolderCreated(holder,holder.getConvertView()); + setListener(parent, holder, viewType); + return holder; + } + + public void onViewHolderCreated(ViewHolder holder,View itemView){ + + } + + public void convert(ViewHolder holder, T t) { + mItemViewDelegateManager.convert(holder, t, holder.getAdapterPosition()); + } + + protected boolean isEnabled(int viewType) { + return true; + } + + + protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) { + if (!isEnabled(viewType)) return; + viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mOnItemClickListener != null) { + int position = viewHolder.getAdapterPosition(); + mOnItemClickListener.onItemClick(v, viewHolder , position); + } + } + }); + + viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (mOnItemClickListener != null) { + int position = viewHolder.getAdapterPosition(); + return mOnItemClickListener.onItemLongClick(v, viewHolder, position); + } + return false; + } + }); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + convert(holder, mDatas.get(position)); + } + + @Override + public int getItemCount() { + int itemCount = mDatas.size(); + return itemCount; + } + + + public List getDatas() { + return mDatas; + } + + public MultiItemTypeAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(itemViewDelegate); + return this; + } + + public MultiItemTypeAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate); + return this; + } + + protected boolean useItemViewDelegateManager() { + return mItemViewDelegateManager.getItemViewDelegateCount() > 0; + } + + public interface OnItemClickListener { + void onItemClick(View view, RecyclerView.ViewHolder holder, int position); + + boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position); + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.mOnItemClickListener = onItemClickListener; + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegate.java b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegate.java new file mode 100755 index 0000000..9ba9863 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegate.java @@ -0,0 +1,18 @@ +package com.zhy.adapter.recyclerview.base; + + +import android.view.View; + +/** + * Created by zhy on 16/6/22. + */ +public interface ItemViewDelegate +{ + + int getItemViewLayoutId(); + + boolean isForViewType(T item, int position); + + void convert(ViewHolder holder, T t, int position); + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegateManager.java b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegateManager.java new file mode 100755 index 0000000..3c8dba8 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegateManager.java @@ -0,0 +1,116 @@ +package com.zhy.adapter.recyclerview.base; + +import android.support.v4.util.SparseArrayCompat; + + +/** + * Created by zhy on 16/6/22. + */ +public class ItemViewDelegateManager +{ + SparseArrayCompat> delegates = new SparseArrayCompat(); + + public int getItemViewDelegateCount() + { + return delegates.size(); + } + + public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate) + { + int viewType = delegates.size(); + if (delegate != null) + { + delegates.put(viewType, delegate); + viewType++; + } + return this; + } + + public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate) + { + if (delegates.get(viewType) != null) + { + throw new IllegalArgumentException( + "An ItemViewDelegate is already registered for the viewType = " + + viewType + + ". Already registered ItemViewDelegate is " + + delegates.get(viewType)); + } + delegates.put(viewType, delegate); + return this; + } + + public ItemViewDelegateManager removeDelegate(ItemViewDelegate delegate) + { + if (delegate == null) + { + throw new NullPointerException("ItemViewDelegate is null"); + } + int indexToRemove = delegates.indexOfValue(delegate); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public ItemViewDelegateManager removeDelegate(int itemType) + { + int indexToRemove = delegates.indexOfKey(itemType); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public int getItemViewType(T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = delegatesCount - 1; i >= 0; i--) + { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType( item, position)) + { + return delegates.keyAt(i); + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + public void convert(ViewHolder holder, T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = 0; i < delegatesCount; i++) + { + ItemViewDelegate delegate = delegates.valueAt(i); + + if (delegate.isForViewType( item, position)) + { + delegate.convert(holder, item, position); + return; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegateManager added that matches position=" + position + " in data source"); + } + + + public ItemViewDelegate getItemViewDelegate(int viewType) + { + return delegates.get(viewType); + } + + public int getItemViewLayoutId(int viewType) + { + return getItemViewDelegate(viewType).getItemViewLayoutId(); + } + + public int getItemViewType(ItemViewDelegate itemViewDelegate) + { + return delegates.indexOfValue(itemViewDelegate); + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/base/ViewHolder.java b/app/src/main/java/com/zhy/adapter/recyclerview/base/ViewHolder.java new file mode 100755 index 0000000..1d3ba07 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/base/ViewHolder.java @@ -0,0 +1,271 @@ +package com.zhy.adapter.recyclerview.base; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v7.widget.RecyclerView; +import android.text.util.Linkify; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.widget.Checkable; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RatingBar; +import android.widget.TextView; + +public class ViewHolder extends RecyclerView.ViewHolder +{ + private SparseArray mViews; + private View mConvertView; + private Context mContext; + + public ViewHolder(Context context, View itemView) + { + super(itemView); + mContext = context; + mConvertView = itemView; + mViews = new SparseArray(); + } + + + public static ViewHolder createViewHolder(Context context, View itemView) + { + ViewHolder holder = new ViewHolder(context, itemView); + return holder; + } + + public static ViewHolder createViewHolder(Context context, + ViewGroup parent, int layoutId) + { + View itemView = LayoutInflater.from(context).inflate(layoutId, parent, + false); + ViewHolder holder = new ViewHolder(context, itemView); + return holder; + } + + /** + * 通过viewId获取控件 + * + * @param viewId + * @return + */ + public T getView(int viewId) + { + View view = mViews.get(viewId); + if (view == null) + { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + public View getConvertView() + { + return mConvertView; + } + + + + + /****以下为辅助方法*****/ + + /** + * 设置TextView的值 + * + * @param viewId + * @param text + * @return + */ + public ViewHolder setText(int viewId, String text) + { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setImageResource(int viewId, int resId) + { + ImageView view = getView(viewId); + view.setImageResource(resId); + return this; + } + + public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) + { + ImageView view = getView(viewId); + view.setImageBitmap(bitmap); + return this; + } + + public ViewHolder setImageDrawable(int viewId, Drawable drawable) + { + ImageView view = getView(viewId); + view.setImageDrawable(drawable); + return this; + } + + public ViewHolder setBackgroundColor(int viewId, int color) + { + View view = getView(viewId); + view.setBackgroundColor(color); + return this; + } + + public ViewHolder setBackgroundRes(int viewId, int backgroundRes) + { + View view = getView(viewId); + view.setBackgroundResource(backgroundRes); + return this; + } + + public ViewHolder setTextColor(int viewId, int textColor) + { + TextView view = getView(viewId); + view.setTextColor(textColor); + return this; + } + + public ViewHolder setTextColorRes(int viewId, int textColorRes) + { + TextView view = getView(viewId); + view.setTextColor(mContext.getResources().getColor(textColorRes)); + return this; + } + + @SuppressLint("NewApi") + public ViewHolder setAlpha(int viewId, float value) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + { + getView(viewId).setAlpha(value); + } else + { + // Pre-honeycomb hack to set Alpha value + AlphaAnimation alpha = new AlphaAnimation(value, value); + alpha.setDuration(0); + alpha.setFillAfter(true); + getView(viewId).startAnimation(alpha); + } + return this; + } + + public ViewHolder setVisible(int viewId, boolean visible) + { + View view = getView(viewId); + view.setVisibility(visible ? View.VISIBLE : View.GONE); + return this; + } + + public ViewHolder linkify(int viewId) + { + TextView view = getView(viewId); + Linkify.addLinks(view, Linkify.ALL); + return this; + } + + public ViewHolder setTypeface(Typeface typeface, int... viewIds) + { + for (int viewId : viewIds) + { + TextView view = getView(viewId); + view.setTypeface(typeface); + view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); + } + return this; + } + + public ViewHolder setProgress(int viewId, int progress) + { + ProgressBar view = getView(viewId); + view.setProgress(progress); + return this; + } + + public ViewHolder setProgress(int viewId, int progress, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + view.setProgress(progress); + return this; + } + + public ViewHolder setMax(int viewId, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + return this; + } + + public ViewHolder setRating(int viewId, float rating) + { + RatingBar view = getView(viewId); + view.setRating(rating); + return this; + } + + public ViewHolder setRating(int viewId, float rating, int max) + { + RatingBar view = getView(viewId); + view.setMax(max); + view.setRating(rating); + return this; + } + + public ViewHolder setTag(int viewId, Object tag) + { + View view = getView(viewId); + view.setTag(tag); + return this; + } + + public ViewHolder setTag(int viewId, int key, Object tag) + { + View view = getView(viewId); + view.setTag(key, tag); + return this; + } + + public ViewHolder setChecked(int viewId, boolean checked) + { + Checkable view = (Checkable) getView(viewId); + view.setChecked(checked); + return this; + } + + /** + * 关于事件的 + */ + public ViewHolder setOnClickListener(int viewId, + View.OnClickListener listener) + { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + + public ViewHolder setOnTouchListener(int viewId, + View.OnTouchListener listener) + { + View view = getView(viewId); + view.setOnTouchListener(listener); + return this; + } + + public ViewHolder setOnLongClickListener(int viewId, + View.OnLongClickListener listener) + { + View view = getView(viewId); + view.setOnLongClickListener(listener); + return this; + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/utils/WrapperUtils.java b/app/src/main/java/com/zhy/adapter/recyclerview/utils/WrapperUtils.java new file mode 100755 index 0000000..df453af --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/utils/WrapperUtils.java @@ -0,0 +1,53 @@ +package com.zhy.adapter.recyclerview.utils; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.ViewGroup; + +/** + * Created by zhy on 16/6/28. + */ +public class WrapperUtils +{ + public interface SpanSizeCallback + { + int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position); + } + + public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback) + { + innerAdapter.onAttachedToRecyclerView(recyclerView); + + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) + { + final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; + final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup(); + + gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() + { + @Override + public int getSpanSize(int position) + { + return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position); + } + }); + gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount()); + } + } + + public static void setFullSpan(RecyclerView.ViewHolder holder) + { + ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); + + if (lp != null + && lp instanceof StaggeredGridLayoutManager.LayoutParams) + { + + StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; + + p.setFullSpan(true); + } + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/EmptyWrapper.java b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/EmptyWrapper.java new file mode 100755 index 0000000..2eb35b5 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/EmptyWrapper.java @@ -0,0 +1,125 @@ +package com.zhy.adapter.recyclerview.wrapper; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23. + */ +public class EmptyWrapper extends RecyclerView.Adapter +{ + public static final int ITEM_TYPE_EMPTY = Integer.MAX_VALUE - 1; + + private RecyclerView.Adapter mInnerAdapter; + private View mEmptyView; + private int mEmptyLayoutId; + + + public EmptyWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + private boolean isEmpty() + { + return (mEmptyView != null || mEmptyLayoutId != 0) && mInnerAdapter.getItemCount() == 0; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (isEmpty()) + { + ViewHolder holder; + if (mEmptyView != null) + { + holder = ViewHolder.createViewHolder(parent.getContext(), mEmptyView); + } else + { + holder = ViewHolder.createViewHolder(parent.getContext(), parent, mEmptyLayoutId); + } + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager gridLayoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + if (isEmpty()) + { + return gridLayoutManager.getSpanCount(); + } + if (oldLookup != null) + { + return oldLookup.getSpanSize(position); + } + return 1; + } + }); + + + } + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + if (isEmpty()) + { + WrapperUtils.setFullSpan(holder); + } + } + + + @Override + public int getItemViewType(int position) + { + if (isEmpty()) + { + return ITEM_TYPE_EMPTY; + } + return mInnerAdapter.getItemViewType(position); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isEmpty()) + { + return; + } + mInnerAdapter.onBindViewHolder(holder, position); + } + + @Override + public int getItemCount() + { + if (isEmpty()) return 1; + return mInnerAdapter.getItemCount(); + } + + + + public void setEmptyView(View emptyView) + { + mEmptyView = emptyView; + } + + public void setEmptyView(int layoutId) + { + mEmptyLayoutId = layoutId; + } + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/HeaderAndFooterWrapper.java b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/HeaderAndFooterWrapper.java new file mode 100755 index 0000000..fa5fe7d --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/HeaderAndFooterWrapper.java @@ -0,0 +1,152 @@ +package com.zhy.adapter.recyclerview.wrapper; + +import android.support.v4.util.SparseArrayCompat; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23. + */ +public class HeaderAndFooterWrapper extends RecyclerView.Adapter +{ + private static final int BASE_ITEM_TYPE_HEADER = 100000; + private static final int BASE_ITEM_TYPE_FOOTER = 200000; + + private SparseArrayCompat mHeaderViews = new SparseArrayCompat<>(); + private SparseArrayCompat mFootViews = new SparseArrayCompat<>(); + + private RecyclerView.Adapter mInnerAdapter; + + public HeaderAndFooterWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (mHeaderViews.get(viewType) != null) + { + ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mHeaderViews.get(viewType)); + return holder; + + } else if (mFootViews.get(viewType) != null) + { + ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mFootViews.get(viewType)); + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public int getItemViewType(int position) + { + if (isHeaderViewPos(position)) + { + return mHeaderViews.keyAt(position); + } else if (isFooterViewPos(position)) + { + return mFootViews.keyAt(position - getHeadersCount() - getRealItemCount()); + } + return mInnerAdapter.getItemViewType(position - getHeadersCount()); + } + + private int getRealItemCount() + { + return mInnerAdapter.getItemCount(); + } + + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isHeaderViewPos(position)) + { + return; + } + if (isFooterViewPos(position)) + { + return; + } + mInnerAdapter.onBindViewHolder(holder, position - getHeadersCount()); + } + + @Override + public int getItemCount() + { + return getHeadersCount() + getFootersCount() + getRealItemCount(); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + int viewType = getItemViewType(position); + if (mHeaderViews.get(viewType) != null) + { + return layoutManager.getSpanCount(); + } else if (mFootViews.get(viewType) != null) + { + return layoutManager.getSpanCount(); + } + if (oldLookup != null) + return oldLookup.getSpanSize(position); + return 1; + } + }); + } + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + int position = holder.getLayoutPosition(); + if (isHeaderViewPos(position) || isFooterViewPos(position)) + { + WrapperUtils.setFullSpan(holder); + } + } + + private boolean isHeaderViewPos(int position) + { + return position < getHeadersCount(); + } + + private boolean isFooterViewPos(int position) + { + return position >= getHeadersCount() + getRealItemCount(); + } + + + public void addHeaderView(View view) + { + mHeaderViews.put(mHeaderViews.size() + BASE_ITEM_TYPE_HEADER, view); + } + + public void addFootView(View view) + { + mFootViews.put(mFootViews.size() + BASE_ITEM_TYPE_FOOTER, view); + } + + public int getHeadersCount() + { + return mHeaderViews.size(); + } + + public int getFootersCount() + { + return mFootViews.size(); + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/LoadMoreWrapper.java b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/LoadMoreWrapper.java new file mode 100755 index 0000000..894b8d7 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/LoadMoreWrapper.java @@ -0,0 +1,162 @@ +package com.zhy.adapter.recyclerview.wrapper; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23. + */ +public class LoadMoreWrapper extends RecyclerView.Adapter +{ + public static final int ITEM_TYPE_LOAD_MORE = Integer.MAX_VALUE - 2; + + private RecyclerView.Adapter mInnerAdapter; + private View mLoadMoreView; + private int mLoadMoreLayoutId; + + public LoadMoreWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + private boolean hasLoadMore() + { + return mLoadMoreView != null || mLoadMoreLayoutId != 0; + } + + + private boolean isShowLoadMore(int position) + { + return hasLoadMore() && (position >= mInnerAdapter.getItemCount()); + } + + @Override + public int getItemViewType(int position) + { + if (isShowLoadMore(position)) + { + return ITEM_TYPE_LOAD_MORE; + } + return mInnerAdapter.getItemViewType(position); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (viewType == ITEM_TYPE_LOAD_MORE) + { + ViewHolder holder; + if (mLoadMoreView != null) + { + holder = ViewHolder.createViewHolder(parent.getContext(), mLoadMoreView); + } else + { + holder = ViewHolder.createViewHolder(parent.getContext(), parent, mLoadMoreLayoutId); + } + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isShowLoadMore(position)) + { + if (mOnLoadMoreListener != null) + { + mOnLoadMoreListener.onLoadMoreRequested(); + } + return; + } + mInnerAdapter.onBindViewHolder(holder, position); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + if (isShowLoadMore(position)) + { + return layoutManager.getSpanCount(); + } + if (oldLookup != null) + { + return oldLookup.getSpanSize(position); + } + return 1; + } + }); + } + + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + + if (isShowLoadMore(holder.getLayoutPosition())) + { + setFullSpan(holder); + } + } + + private void setFullSpan(RecyclerView.ViewHolder holder) + { + ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); + + if (lp != null + && lp instanceof StaggeredGridLayoutManager.LayoutParams) + { + StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; + + p.setFullSpan(true); + } + } + + @Override + public int getItemCount() + { + return mInnerAdapter.getItemCount() + (hasLoadMore() ? 1 : 0); + } + + + public interface OnLoadMoreListener + { + void onLoadMoreRequested(); + } + + private OnLoadMoreListener mOnLoadMoreListener; + + public LoadMoreWrapper setOnLoadMoreListener(OnLoadMoreListener loadMoreListener) + { + if (loadMoreListener != null) + { + mOnLoadMoreListener = loadMoreListener; + } + return this; + } + + public LoadMoreWrapper setLoadMoreView(View loadMoreView) + { + mLoadMoreView = loadMoreView; + return this; + } + + public LoadMoreWrapper setLoadMoreView(int layoutId) + { + mLoadMoreLayoutId = layoutId; + return this; + } +} diff --git a/app/src/main/res/drawable-hdpi/icon_verify.png b/app/src/main/res/drawable-hdpi/icon_verify.png new file mode 100755 index 0000000..d90c41e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_verify.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_artgallery.png b/app/src/main/res/drawable-xhdpi/icon_artgallery.png new file mode 100755 index 0000000..2d39274 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_artgallery.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_artist.png b/app/src/main/res/drawable-xhdpi/icon_artist.png new file mode 100755 index 0000000..1188b38 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_artist.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_artview.png b/app/src/main/res/drawable-xhdpi/icon_artview.png new file mode 100755 index 0000000..428302c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_artview.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_back.png b/app/src/main/res/drawable-xhdpi/icon_back.png new file mode 100755 index 0000000..6ea0e6e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_back.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_home_fat_in.png b/app/src/main/res/drawable-xhdpi/icon_home_fat_in.png new file mode 100644 index 0000000..3c4cdcc Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_home_fat_in.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_home_fat_out.9.png b/app/src/main/res/drawable-xhdpi/icon_home_fat_out.9.png new file mode 100644 index 0000000..049ebf8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_home_fat_out.9.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_laba.png b/app/src/main/res/drawable-xhdpi/icon_laba.png new file mode 100755 index 0000000..2991c94 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_laba.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_workofart.png b/app/src/main/res/drawable-xhdpi/icon_workofart.png new file mode 100755 index 0000000..f8e4521 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_workofart.png differ diff --git a/app/src/main/res/drawable-xhdpi/login_03.png b/app/src/main/res/drawable-xhdpi/login_03.png new file mode 100755 index 0000000..20a7e58 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/login_03.png differ diff --git a/app/src/main/res/drawable-xhdpi/logo_qq.png b/app/src/main/res/drawable-xhdpi/logo_qq.png new file mode 100755 index 0000000..612bf2f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/logo_qq.png differ diff --git a/app/src/main/res/drawable-xhdpi/logo_wechat.png b/app/src/main/res/drawable-xhdpi/logo_wechat.png new file mode 100755 index 0000000..a4a99cd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/logo_wechat.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_fabu.png b/app/src/main/res/drawable-xhdpi/tab_fabu.png new file mode 100755 index 0000000..c9fa012 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_fabu.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_follow_nor.png b/app/src/main/res/drawable-xhdpi/tab_follow_nor.png new file mode 100755 index 0000000..7003b4f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_follow_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_follow_sel.png b/app/src/main/res/drawable-xhdpi/tab_follow_sel.png new file mode 100755 index 0000000..76b444f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_follow_sel.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_home_nor.png b/app/src/main/res/drawable-xhdpi/tab_home_nor.png new file mode 100755 index 0000000..e6113ce Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_home_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_home_sel.png b/app/src/main/res/drawable-xhdpi/tab_home_sel.png new file mode 100755 index 0000000..0e49db2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_home_sel.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_my_nor.png b/app/src/main/res/drawable-xhdpi/tab_my_nor.png new file mode 100755 index 0000000..271dc65 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_my_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_my_sel.png b/app/src/main/res/drawable-xhdpi/tab_my_sel.png new file mode 100755 index 0000000..b2a0c73 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_my_sel.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_seach_nor.png b/app/src/main/res/drawable-xhdpi/tab_seach_nor.png new file mode 100755 index 0000000..c998fc0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_seach_nor.png differ diff --git a/app/src/main/res/drawable-xhdpi/tab_seach_sel.png b/app/src/main/res/drawable-xhdpi/tab_seach_sel.png new file mode 100755 index 0000000..a89db0e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_seach_sel.png differ diff --git a/app/src/main/res/drawable/ic_backspace_black_24dp.xml b/app/src/main/res/drawable/ic_backspace_black_24dp.xml new file mode 100644 index 0000000..db4def9 --- /dev/null +++ b/app/src/main/res/drawable/ic_backspace_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/shape_hui1_white.xml b/app/src/main/res/drawable/shape_hui1_white.xml new file mode 100755 index 0000000..cc465de --- /dev/null +++ b/app/src/main/res/drawable/shape_hui1_white.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_hui_white.xml b/app/src/main/res/drawable/shape_hui_white.xml new file mode 100755 index 0000000..0ec1fe0 --- /dev/null +++ b/app/src/main/res/drawable/shape_hui_white.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_follow_select.xml b/app/src/main/res/drawable/tab_follow_select.xml new file mode 100755 index 0000000..1bacafe --- /dev/null +++ b/app/src/main/res/drawable/tab_follow_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_home_select.xml b/app/src/main/res/drawable/tab_home_select.xml new file mode 100755 index 0000000..b21941e --- /dev/null +++ b/app/src/main/res/drawable/tab_home_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_my_select.xml b/app/src/main/res/drawable/tab_my_select.xml new file mode 100755 index 0000000..a4ed5a9 --- /dev/null +++ b/app/src/main/res/drawable/tab_my_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_seach_select.xml b/app/src/main/res/drawable/tab_seach_select.xml new file mode 100755 index 0000000..4a273ca --- /dev/null +++ b/app/src/main/res/drawable/tab_seach_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..a6b98fc --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + +