From fda8305a1331c2ca5bd948da0b8d15cb146dcce3 Mon Sep 17 00:00:00 2001 From: jinyuer <454386664@qq.com> Date: Fri, 14 Aug 2020 17:07:43 +0800 Subject: [PATCH] 1 --- app/build.gradle | 18 +- app/src/main/AndroidManifest.xml | 7 +- .../java/adapter/BaseRecycleViewAdapter.java | 39 +- .../com/sl/house_property/BaseActivity.java | 2 +- .../com/sl/house_property/BaseFragment.java | 3 + .../sl/house_property/MainTabActivity.java | 122 +++-- .../discovery/DiscoveryFragment.java | 488 +++++++++++++++--- .../imageselector/view/ClipImageView.java | 5 +- app/src/main/java/my_view/CommentDialog.java | 90 ++++ app/src/main/java/my_view/MyFrameLayout.java | 50 ++ .../utils/BottomNavigationViewHelper.java | 2 +- app/src/main/java/utils/CommonUtils.java | 42 ++ app/src/main/java/utils/DateUtils.java | 480 +++++++++++++++++ app/src/main/java/utils/KeyboardUtil.java | 12 + app/src/main/java/utils/NineImageLoader.java | 8 +- app/src/main/java/utils/UtilHelpers.java | 42 ++ app/src/main/res/drawable/shape_comment.xml | 24 + .../main/res/drawable/shape_comment_bg.xml | 11 + app/src/main/res/layout/activity_main_tab.xml | 176 ++++--- app/src/main/res/layout/dialog_comment.xml | 70 +++ .../main/res/layout/fragment_discovery.xml | 195 ++++--- app/src/main/res/layout/item_comment.xml | 69 +++ app/src/main/res/layout/item_discovery.xml | 7 +- app/src/main/res/mipmap-xhdpi/buy.png | Bin 0 -> 693 bytes app/src/main/res/mipmap-xhdpi/pl2.png | Bin 0 -> 484 bytes app/src/main/res/mipmap-xhdpi/xin.png | Bin 0 -> 952 bytes app/src/main/res/values/styles.xml | 9 +- .../preview/NineGridViewClickAdapter.java | 2 +- 28 files changed, 1686 insertions(+), 287 deletions(-) create mode 100644 app/src/main/java/my_view/CommentDialog.java create mode 100644 app/src/main/java/my_view/MyFrameLayout.java create mode 100644 app/src/main/java/utils/CommonUtils.java create mode 100644 app/src/main/java/utils/DateUtils.java create mode 100644 app/src/main/java/utils/UtilHelpers.java create mode 100644 app/src/main/res/drawable/shape_comment.xml create mode 100644 app/src/main/res/drawable/shape_comment_bg.xml create mode 100644 app/src/main/res/layout/dialog_comment.xml create mode 100644 app/src/main/res/layout/item_comment.xml create mode 100644 app/src/main/res/mipmap-xhdpi/buy.png create mode 100644 app/src/main/res/mipmap-xhdpi/pl2.png create mode 100644 app/src/main/res/mipmap-xhdpi/xin.png diff --git a/app/build.gradle b/app/build.gradle index 6e7467c..6df0f75 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,8 +25,8 @@ android { enabled = true } - compileSdkVersion 27 - buildToolsVersion '27.0.3' + compileSdkVersion 28 + buildToolsVersion '28.0.3' aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false defaultConfig { @@ -35,7 +35,7 @@ android { // multiDexEnabled true applicationId "com.sl.HouseProperty" minSdkVersion 21 - targetSdkVersion 27 + targetSdkVersion 28 // multiDexEnabled true versionCode 1 versionName "1.1.0" @@ -106,14 +106,14 @@ android { implementation 'fm.jiecao:jiecaovideoplayer:4.6.3' //noinspection GradleCompatible - implementation 'com.android.support:appcompat-v7:27.0.2' + implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.nhaarman.listviewanimations:lib-core:3.1.0@aar' implementation 'com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar' implementation 'com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar' implementation 'com.truizlop.sectionedrecyclerview:library:1.0.0' implementation 'tech.wangjie:qrcodetools:1.0.0' - implementation 'com.android.support:recyclerview-v7:27.0.2' + implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1' implementation 'com.google.zxing:core:3.3.0' @@ -125,12 +125,18 @@ android { implementation 'com.github.bumptech.glide:glide:4.5.0' implementation 'com.github.chrisbanes:PhotoView:2.0.0' - implementation 'com.android.support:design:27.1.1' + implementation 'com.android.support:design:28.0.0' implementation 'net.dankito.richtexteditor:richtexteditor-android:2.0.8' implementation(name: 'alipaySdk-15.5.9', ext: 'aar') implementation files('libs/pldroid-player-2.1.9.jar') implementation project(':ninegridview') + implementation 'com.lxj:xpopup:1.8.10' + // 添加下面这句即可 + implementation 'com.android.support:support-v4:28.0.0' + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //1.0.5及以前版本的老用户升级需谨慎,API改动过大 + // 基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 023ba82..7896062 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,7 +19,6 @@ - @@ -67,11 +66,11 @@ + + android:theme="@style/TAppTheme" /> extends RecyclerView.Adapter { private ArrayList list; @@ -29,7 +31,6 @@ public class BaseRecycleViewAdapter extends Recy private static OnLongItemClickListener longItemClickListener; - public BaseRecycleViewAdapter(Context context, @LayoutRes int layout) { inflater = LayoutInflater.from(context); this.context = context; @@ -40,10 +41,11 @@ public class BaseRecycleViewAdapter extends Recy public void setData(ArrayList list) { this.list.clear(); - this.list=new ArrayList<>(); + this.list = new ArrayList<>(); this.list.addAll(list); - notifyDataSetChanged(); + notifyDataSetChanged(); } + public void addData(ArrayList list) { this.list = list; this.list.addAll(list); @@ -51,6 +53,11 @@ public class BaseRecycleViewAdapter extends Recy notifyDataSetChanged(); } + public void upDateOne(int position, T1 bean) { + this.list.set(position, bean); + notifyItemChanged(position); + } + public void setOnBindViewHolder(BindView bindView) { this.bindView = bindView; } @@ -68,6 +75,11 @@ public class BaseRecycleViewAdapter extends Recy } + @Override + public long getItemId(int position) { + return position; + } + @Override public int getItemCount() { return list.size(); @@ -76,15 +88,19 @@ public class BaseRecycleViewAdapter extends Recy public interface BindView { void onBindViewHolder(T2 b, int position); } + public interface OnItemClickListener { void onItemClick(View itemView, int position); } + public interface OnLongItemClickListener { void onItemLongClick(View itemView, int position); } + public void setOnItemLongClickListener(OnLongItemClickListener longClickListener) { this.longItemClickListener = longClickListener; } + public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } @@ -104,25 +120,26 @@ public class BaseRecycleViewAdapter extends Recy }); - itemView.setOnLongClickListener(new View.OnLongClickListener(){ - @Override - public boolean onLongClick(View v) { + itemView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { - if (longItemClickListener != null) - longItemClickListener.onItemLongClick(itemView,getLayoutPosition()); - return true; - } + if (longItemClickListener != null) + longItemClickListener.onItemLongClick(itemView, getLayoutPosition()); + return true; + } } ); } + public ViewDataBinding getBinding() { return b; } } - } +} diff --git a/app/src/main/java/com/sl/house_property/BaseActivity.java b/app/src/main/java/com/sl/house_property/BaseActivity.java index 64847b8..2266e0f 100644 --- a/app/src/main/java/com/sl/house_property/BaseActivity.java +++ b/app/src/main/java/com/sl/house_property/BaseActivity.java @@ -77,7 +77,7 @@ public abstract class BaseActivity extends RxAppCom } mDataBinding = DataBindingUtil.setContentView(this, getLayoutResId()); // mDataBinding.getRoot().setBackground(getResources().getDrawable(R.drawable.background_slowly)); - fullScreen(this); + // fullScreen(this); progressDialog = new ProgressDialog(this); if (mDataBinding != null) { diff --git a/app/src/main/java/com/sl/house_property/BaseFragment.java b/app/src/main/java/com/sl/house_property/BaseFragment.java index cbed22e..f9cdab3 100644 --- a/app/src/main/java/com/sl/house_property/BaseFragment.java +++ b/app/src/main/java/com/sl/house_property/BaseFragment.java @@ -1,6 +1,7 @@ package com.sl.house_property; import android.app.ProgressDialog; +import android.content.Context; import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; import android.os.Bundle; @@ -10,6 +11,7 @@ import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; /** * Created by ximsfei on 17-1-7. @@ -41,6 +43,7 @@ public ProgressDialog progressDialog; } + protected abstract void loadData(); } diff --git a/app/src/main/java/com/sl/house_property/MainTabActivity.java b/app/src/main/java/com/sl/house_property/MainTabActivity.java index 0801f07..145d35a 100644 --- a/app/src/main/java/com/sl/house_property/MainTabActivity.java +++ b/app/src/main/java/com/sl/house_property/MainTabActivity.java @@ -6,21 +6,26 @@ import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; +import android.view.MotionEvent; import android.view.View; import android.widget.RadioButton; import android.widget.RadioGroup; +import com.gyf.immersionbar.ImmersionBar; import com.sl.house_property.databinding.ActivityMainTabBinding; import com.sl.house_property.discovery.DiscoveryFragment; +import java.util.ArrayList; + import tools.Config; +import utils.UtilHelpers; public class MainTabActivity extends BaseActivity -implements View.OnClickListener,MainFragment.OnFragmentInteractionListener, + implements View.OnClickListener, MainFragment.OnFragmentInteractionListener, Main1Fragment.OnFragmentInteractionListener, Main2Fragment.OnFragmentInteractionListener, Main3Fragment.OnFragmentInteractionListener, - Main4Fragment.OnFragmentInteractionListener{ + Main4Fragment.OnFragmentInteractionListener { /*定义的全局返回码,例如在主界面的某个Fragment点击某一项后进入下一个界面后 如果在下一个界面有数据更改,需要Fragment刷新时,通过setResult方法通知主界面,主界面的 @@ -30,58 +35,96 @@ implements View.OnClickListener,MainFragment.OnFragmentInteractionListener, public static final int RESUlT_CODE_0 = 201;//首页 public static final int RESUlT_CODE_1 = 202;//发现 public static final int RESUlT_CODE_2 = 203;//购物车 - // public static final int RESUlT_CODE_3 = 204;// + // public static final int RESUlT_CODE_3 = 204;// public static final int RESUlT_CODE_4 = 205;//我的 - private RadioGroup radioGroup; - private MainFragment fragment0; - private DiscoveryFragment fragment1; - private Main3Fragment fragment2; - private Main2Fragment fragment3; - private Main4Fragment fragment4; + private RadioGroup radioGroup; + private MainFragment fragment0; + private DiscoveryFragment fragment1; + private Main3Fragment fragment2; + private Main2Fragment fragment3; + private Main4Fragment fragment4; private Fragment currentFragment; - private int myeditcode=1000; + private int myeditcode = 1000; - private int nowradioId; - + private int nowradioId; +// @Override +// public boolean dispatchTouchEvent(MotionEvent ev) { +// switch (ev.getAction()) { +// case MotionEvent.ACTION_DOWN: +// +// UtilHelpers.hideKeyboard(ev, getCurrentFocus(), this); +// break; +// } +// return super.dispatchTouchEvent(ev); +// +// } + public void visibilyBottom(int isVisibily){ + findViewById(R.id.rl_bottom).setVisibility(isVisibily); + } + //2. 保存MyOnTouchListener接口的列表 + private ArrayList onTouchListeners = new ArrayList(); + //1.触摸事件接口 + public interface MyOnTouchListener { + public boolean onTouch(MotionEvent ev); + } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + for (MyOnTouchListener listener : onTouchListeners) { + // listener.onTouch(ev); + } + return super.dispatchTouchEvent(ev); + } + //4.提供给Fragment通过getActivity()方法来注册自己的触摸事件的方法 + public void registerMyOnTouchListener(MyOnTouchListener myOnTouchListener) { + onTouchListeners.add(myOnTouchListener); + } + //5.提供给Fragment通过getActivity()方法来注销自己的触摸事件的方法 + public void unregisterMyOnTouchListener(MyOnTouchListener myOnTouchListener) { + onTouchListeners.remove(myOnTouchListener); + } @Override protected int getLayoutResId() { return R.layout.activity_main_tab; } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Config.getInstance(MainTabActivity.this).put("MainTabActivity",true); + Config.getInstance(MainTabActivity.this).put("MainTabActivity", true); //setPhotoSysyrmbar(); - //setSytemBar(R.color.colorPrimary);//设置主题样式 - //setFramentMarginTop(); - + //setSytemBar(R.color.colorPrimary);//设置主题样式 + //setFramentMarginTop(); + ImmersionBar.with(this) + .keyboardEnable(true) //解决软键盘与底部输入框冲突问题 + // .keyboardEnable(true, WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE + // | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) //软键盘自动弹出 + .init(); initView(); } - @SuppressLint("MissingSuperCall") @Override public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); + super.onSaveInstanceState(outState); } private void initView() { - radioGroup= mDataBinding.radioGroup; - for (int i = 0; i { +public class DiscoveryFragment extends BaseFragment implements MainTabActivity.MyOnTouchListener { private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; private String mParam1; @@ -69,21 +84,75 @@ public class DiscoveryFragment extends BaseFragment { super.onCreateVew(inflater, savedInstanceState); baseActivity = (BaseActivity) getActivity(); progressDialog = new ProgressDialog(baseActivity); - mDataBinding.rl.setOnRefreshListener(new OnRefreshListener() { + mDataBinding.dw.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() { @Override - public void onRefresh() { + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + getlist(page); + } + + @Override + public void onRefresh(@NonNull RefreshLayout refreshLayout) { page = 1; getlist(page); - - } - - @Override - public void onLoadMore() { - } }); - mDataBinding.rl.setAutoRefresh(true); + mDataBinding.dw.autoRefresh(); intRecycleView(); + MainTabActivity activity = (MainTabActivity) getActivity(); + activity.registerMyOnTouchListener(this); + } + + @Override + public void onDestroy() { + super.onDestroy(); + MainTabActivity activity = (MainTabActivity) getActivity(); + activity.unregisterMyOnTouchListener(this); + } + + public void updateEditTextBodyVisible(int visibility) { + mDataBinding.llComment.setVisibility(visibility); + if (View.VISIBLE == visibility) { + mDataBinding.llComment.requestFocus(); + //弹出键盘 + CommonUtils.showSoftInput(mDataBinding.etComment.getContext(), mDataBinding.etComment); + + } else if (View.GONE == visibility) { + //隐藏键盘 + MainTabActivity activity = (MainTabActivity) getActivity(); + activity.visibilyBottom(View.VISIBLE); + CommonUtils.hideSoftInput(mDataBinding.etComment.getContext(), mDataBinding.etComment); + } + } + + private int currentKeyboardH; + private int editTextBodyHeight; + + private void setViewTreeObserver() { + final ViewTreeObserver swipeRefreshLayoutVTO = mDataBinding.rl.getViewTreeObserver(); + swipeRefreshLayoutVTO.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Rect r = new Rect(); + mDataBinding.rl.getWindowVisibleDisplayFrame(r); + int statusBarH = ImmersionBar.getStatusBarHeight(DiscoveryFragment.this);//状态栏高度 + int screenH = mDataBinding.rl.getRootView().getHeight(); + if (r.top != statusBarH) { + //r.top代表的是状态栏高度,在沉浸式状态栏时r.top=0,通过getStatusBarHeight获取状态栏高度 + r.top = statusBarH; + } + int keyboardH = screenH - (r.bottom - r.top); + + if (keyboardH == currentKeyboardH) {//有变化时才处理,否则会陷入死循环 + return; + } + currentKeyboardH = keyboardH; + editTextBodyHeight = mDataBinding.llComment.getHeight(); + if (keyboardH < 150) {//说明是隐藏键盘的情况 + updateEditTextBodyVisible(View.GONE); + return; + } + } + }); } private Loader mGankLoader; @@ -104,24 +173,234 @@ public class DiscoveryFragment extends BaseFragment { getGankList(ApiConfig.BASE_URL, map, getResources().getString(R.string.requsting), mypage); } + private void like(String goodsId, final int position) { + final RegisterUser user = + Config.getInstance(getContext()).getUser(); + Map map = new HashMap<>(); + if (user != null) { + map.put("userid", user.getUserid()); + } else { + map.put("userid", 0 + ""); + } + map.put("app", "Goods"); + map.put("class", "AddUp"); + map.put("goods_id", goodsId); + map.put("sign", Md5.md5("Goods" + "AddUp" + Md5.secret)); + progressDialog.setMessage("提交中"); + progressDialog.setCancelable(false); +// progressDialog.show(); + + mGankLoader = new Loader(); + Subscription subscription = mGankLoader.getMovie(ApiConfig.BASE_URL, map).subscribe(new Action1() { + + + @Override + public void call(Resultcode resultcode) { + + progressDialog.dismiss(); + if (!(resultcode.status == 0)) { + baseActivity.setToast(1, resultcode.msg); + } + if (resultcode.status == 0) { + BaseRecycleViewAdapter adapter = (BaseRecycleViewAdapter) mDataBinding.recyView.getAdapter(); + if (discoveryListEntities.get(position).getIs_like() == 1) { + discoveryListEntities.get(position).setIs_like(0); + ArrayList like = discoveryListEntities.get(position).getLike(); + for (int i = 0; i < like.size(); i++) { + if (user.getUserid().equals(like.get(i).getUserid())) { + like.remove(i); + break; + } + } + discoveryListEntities.get(position).setLike(like); + } else { + discoveryListEntities.get(position).setIs_like(1); + DiscoveryListEntity.Like like = new DiscoveryListEntity.Like(); + like.setNickname(user.getNickname()); + like.setUserid(user.getUserid()); + discoveryListEntities.get(position).getLike().add(like); + } + + adapter.upDateOne(position, discoveryListEntities.get(position)); + } + + } + + + }, new Action1() { + @Override + public void call(Throwable throwable) { + progressDialog.dismiss(); + baseActivity.setToast(2, "提交失败"); + throwable.printStackTrace(); + } + }); + + baseActivity.addSubscription(subscription); + + } + + /** + * 获取控件左上顶点Y坐标 + * + * @param view + * @return + */ + private int getCoordinateY(View view) { + int[] coordinate = new int[2]; + view.getLocationOnScreen(coordinate); + return coordinate[1]; + } + + private void intRecycleView() { - FullyGridLayoutManager mgr = new FullyGridLayoutManager(getActivity(), 1); - mgr.setOrientation(FullyGridLayoutManager.VERTICAL); - mgr.setSmoothScrollbarEnabled(true); - mDataBinding.recyView.setLayoutManager(mgr); + mDataBinding.tvSendComment.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setViewTreeObserver(); + } + }); + mDataBinding.sv.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (mDataBinding.llComment.getVisibility() == View.VISIBLE) { + updateEditTextBodyVisible(View.GONE); + return true; + } + return false; + } + }); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(baseActivity); + mDataBinding.recyView.setNestedScrollingEnabled(false);//禁止rcyc嵌套滑动 + mDataBinding.recyView.setLayoutManager(linearLayoutManager); BaseRecycleViewAdapter baseRecycleViewAdapter = new BaseRecycleViewAdapter(getActivity(), R.layout.item_discovery); + baseRecycleViewAdapter.setHasStableIds(true); + discoveryListEntities = new ArrayList<>(); baseRecycleViewAdapter.setOnBindViewHolder(new BaseRecycleViewAdapter.BindView() { @Override - public void onBindViewHolder(Object b, int position) { + public void onBindViewHolder(Object b, final int position) { if (!(position >= discoveryListEntities.size())) { - ItemDiscoveryBinding homeGridAdapterItemBinding = (ItemDiscoveryBinding) b; + final ItemDiscoveryBinding homeGridAdapterItemBinding = (ItemDiscoveryBinding) b; // homeGridAdapterItemBinding.setMyentity(discoveryListEntities.get(position)); - DiscoveryListEntity discoveryListEntity = discoveryListEntities.get(position); + final DiscoveryListEntity discoveryListEntity = discoveryListEntities.get(position); + homeGridAdapterItemBinding.tvNikeName.setText(discoveryListEntity.getNickname()); + homeGridAdapterItemBinding.tvContent.setText(discoveryListEntity.getGoods_detail()); + // Picasso.with(getActivity()).load(discoveryListEntity.getAvatar()) // .placeholder(R.mipmap.icon_default_rectangle) // .transform(new PicassoRoundTransform()) // .into(homeGridAdapterItemBinding.imageHead); + mDataBinding.tvSendComment.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.e("click", "comment"); + MainTabActivity activity = (MainTabActivity) getActivity(); + CommonUtils.hideSoftInput(getContext(),mDataBinding.etComment); + mDataBinding.llComment.setVisibility(View.GONE); + activity.visibilyBottom(View.VISIBLE); + comment(discoveryListEntity.getGoods_id(), position, "", mDataBinding.etComment.getText().toString()); + } + }); + homeGridAdapterItemBinding.ivComment.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View v) { + final CommentDialog commentDialog = new CommentDialog(baseActivity); + commentDialog.setShowBug(discoveryListEntity.getType() == 2); + commentDialog.setPraise(discoveryListEntity.getIs_like() == 1); + final int mBottomY = getCoordinateY(homeGridAdapterItemBinding.ivComment) + homeGridAdapterItemBinding.ivComment.getHeight(); + commentDialog.setOnCommentOperateListener(new CommentDialog.OnCommentOperateListener() { + @Override + public void click(int type) { + + if (type == 1 || type == 2) { + //点赞/取消 + commentDialog.dismiss(); + like(discoveryListEntity.getGoods_id(), position); + } else if (type == 3) { + mDataBinding.llComment.setVisibility(View.VISIBLE); + mDataBinding.etComment.requestFocus(); + mDataBinding.etComment.setHint("评论"); + MainTabActivity activity = (MainTabActivity) getActivity(); + KeyboardUtil.showSoftInput(getContext()); + activity.visibilyBottom(View.GONE); + + commentDialog.dismiss(); + mDataBinding.etComment.setText(""); + homeGridAdapterItemBinding.ivComment.postDelayed(new Runnable() { + @Override + public void run() { + int y = getCoordinateY(mDataBinding.llComment) - 20; + //评论时滑动到对应item底部和输入框顶部对齐 + mDataBinding.sv.smoothScrollBy(0, mBottomY - y); + } + }, 300); + + + } + } + }); + new XPopup.Builder(baseActivity).hasShadowBg(false).atView(homeGridAdapterItemBinding.ivComment).asCustom(commentDialog) + .show(); + + } + }); + + + if (discoveryListEntity.getLike().isEmpty()) { + homeGridAdapterItemBinding.tvLike.setVisibility(View.GONE); + } else { + homeGridAdapterItemBinding.tvLike.setVisibility(View.VISIBLE); + StringBuilder likeString = new StringBuilder(); + for (int i = 0; i < discoveryListEntity.getLike().size(); i++) { + if (i == 0) { + likeString.append("❤"); + + } else { + likeString.append(","); + } + likeString.append(discoveryListEntity.getLike().get(i).getNickname()); + } + homeGridAdapterItemBinding.tvLike.setText(likeString.toString()); + + homeGridAdapterItemBinding.tvTime.setText(DateUtils.getDate(discoveryListEntity.getCtime())); + + } + if (discoveryListEntity.getDis_content().isEmpty()) { + homeGridAdapterItemBinding.rvComment.setVisibility(View.GONE); + } else { + homeGridAdapterItemBinding.rvComment.setVisibility(View.VISIBLE); + FullyGridLayoutManager mgr = new FullyGridLayoutManager(getActivity(), 1); + mgr.setOrientation(FullyGridLayoutManager.VERTICAL); + mgr.setSmoothScrollbarEnabled(true); + homeGridAdapterItemBinding.rvComment.setLayoutManager(mgr); + BaseRecycleViewAdapter baseRecycleViewAdapter = new BaseRecycleViewAdapter(getActivity(), R.layout.item_comment); + homeGridAdapterItemBinding.rvComment.setAdapter(baseRecycleViewAdapter); + final ArrayList dis_content = discoveryListEntity.getDis_content(); + baseRecycleViewAdapter.setOnBindViewHolder(new BaseRecycleViewAdapter.BindView() { + @Override + public void onBindViewHolder(Object b, int position) { + ItemCommentBinding itemCommentBinding = (ItemCommentBinding) b; + itemCommentBinding.tvName.setText(dis_content.get(position).getNickname() + ": "); + itemCommentBinding.tvInfo.setText(dis_content.get(position).getContents()); + if (dis_content.get(position).getReply().isEmpty()) { + itemCommentBinding.llHf.setVisibility(View.GONE); + + } else { + itemCommentBinding.llHf.setVisibility(View.VISIBLE); + itemCommentBinding.tvName2.setText(discoveryListEntity.getNickname()); + itemCommentBinding.tvInfo2.setText("回复"); + itemCommentBinding.tvName3.setText(dis_content.get(position).getNickname() + ":"); + itemCommentBinding.tvInfo3.setText(dis_content.get(position).getReply()); + + } + } + }); + baseRecycleViewAdapter.setData(dis_content); + + } + + RequestOptions requestOptions = new RequestOptions(); requestOptions.placeholder(R.mipmap.icon_default_rectangle); requestOptions.error(R.mipmap.icon_default_rectangle); @@ -160,14 +439,6 @@ public class DiscoveryFragment extends BaseFragment { baseRecycleViewAdapter.setData(discoveryListEntities); } - private void addRecycleVerization(ArrayList lsit) { - BaseRecycleViewAdapter baseRecycleViewAdapter = (BaseRecycleViewAdapter) mDataBinding.recyView.getAdapter(); - - discoveryListEntities = lsit; - baseRecycleViewAdapter.setData(discoveryListEntities); - - } - private void getGankList(String myurl, Map map, String msg, final int requstecode) { progressDialog.setMessage(msg); progressDialog.setCancelable(false); @@ -180,8 +451,8 @@ public class DiscoveryFragment extends BaseFragment { @Override public void call(Resultcode resultcode) { - mDataBinding.rl.stopRefresh(true); - mDataBinding.rl.stopLoadMore(true); + mDataBinding.dw.finishRefresh(); + mDataBinding.dw.finishLoadMore(); progressDialog.dismiss(); if (!(resultcode.status == 0)) { baseActivity.setToast(1, resultcode.msg); @@ -191,22 +462,37 @@ public class DiscoveryFragment extends BaseFragment { LinkedTreeMap adta = (LinkedTreeMap) resultcode.data; String s = gs.toJson(adta); try { - JSONObject jsonObject = new JSONObject(s); org.json.JSONArray array = jsonObject.getJSONArray("info"); Type type = new TypeToken>() { }.getType(); - String fengmian = jsonObject.getString("fengmian"); - String avatar = jsonObject.getString("avatar"); - Picasso.with(getActivity()).load(fengmian) - .placeholder(R.mipmap.icon_default_rectangle) - .into(target); - Picasso.with(getActivity()).load(avatar) - .placeholder(R.mipmap.icon_default_rectangle) - .transform(new PicassoRoundTransform()) - .into(mDataBinding.head); - discoveryListEntities = new Gson().fromJson(array.toString(), type); - addRecycleVerization(discoveryListEntities); + if (page == 1) { + String fengmian = jsonObject.getString("fengmian"); + String avatar = jsonObject.getString("avatar"); + Picasso.with(getActivity()).load(fengmian) + .placeholder(R.mipmap.icon_default_rectangle) + .into(target); + Picasso.with(getActivity()).load(avatar) + .placeholder(R.mipmap.icon_default_rectangle) + .transform(new PicassoRoundTransform()) + .into(mDataBinding.head); + discoveryListEntities = new Gson().fromJson(array.toString(), type); + BaseRecycleViewAdapter baseRecycleViewAdapter = (BaseRecycleViewAdapter) mDataBinding.recyView.getAdapter(); + baseRecycleViewAdapter.setData(discoveryListEntities); + page++; + } else { + ArrayList o = new Gson().fromJson(array.toString(), type); + discoveryListEntities.addAll(o); + BaseRecycleViewAdapter baseRecycleViewAdapter = (BaseRecycleViewAdapter) mDataBinding.recyView.getAdapter(); + baseRecycleViewAdapter.setData(discoveryListEntities); + int count = jsonObject.getInt("count"); + if (discoveryListEntities.size() == count || o.isEmpty()) { + mDataBinding.dw.finishLoadMoreWithNoMoreData(); + } else { + page++; + + } + } } catch (Exception e) { @@ -214,36 +500,6 @@ public class DiscoveryFragment extends BaseFragment { } } -// if (resultcode.status == 0) { -//// baseActivity.setToast(0, resultcode.msg); -// if (requstecode == 0) { -// Gson gs = new Gson(); -// LinkedTreeMap adta = (LinkedTreeMap) resultcode.data; -// String s = gs.toJson(adta); -// -// ArrayList list = null; -// try { -// JSONObject jsonObject = new JSONObject(s); -// org.json.JSONArray array1 = jsonObject.getJSONArray("advert_info"); -// if (array1.length() > 0) { -// String img = array1.getJSONObject(0).optString("advert_img"); -// configTopImage(img); -// imgme = img; -// -// } -// org.json.JSONArray array = jsonObject.getJSONArray("advertorial_list"); -// Type type = new TypeToken>() { -// }.getType(); -// list = new Gson().fromJson(array.toString(), type); -// //addRecycleVerization(list); -// -// -// } catch (JSONException e) { -// e.printStackTrace(); -// } -// } -// } - } @@ -251,8 +507,8 @@ public class DiscoveryFragment extends BaseFragment { @Override public void call(Throwable throwable) { progressDialog.dismiss(); - mDataBinding.rl.stopRefresh(true); - mDataBinding.rl.stopLoadMore(true); + mDataBinding.dw.finishRefresh(); + mDataBinding.dw.finishLoadMore(); baseActivity.setToast(2, getString(R.string.getdatafailure)); throwable.printStackTrace(); } @@ -298,4 +554,86 @@ public class DiscoveryFragment extends BaseFragment { } + @Override + public boolean onTouch(MotionEvent ev) { + switch (ev.getAction()) { + + case MotionEvent.ACTION_DOWN: + //点击空白处隐藏键盘,隐藏输入框相关 + if (getActivity().getCurrentFocus()!=null&&getActivity().getCurrentFocus().getId() == R.id.tv_send_comment) { + return false; + } + boolean b = UtilHelpers.hideKeyboard(ev, getActivity().getCurrentFocus(), getActivity()); + if (b) { + CommonUtils.hideSoftInput( mDataBinding.etComment.getContext(), mDataBinding.etComment); + MainTabActivity activity = (MainTabActivity) getActivity(); + activity.visibilyBottom(View.VISIBLE); + mDataBinding.llComment.setVisibility(View.GONE); + } + break; + } + return false; + } + + + private void comment(String goodsId, final int position, String reply_id, final String content) { + final RegisterUser user = + Config.getInstance(getContext()).getUser(); + Map map = new HashMap<>(); + if (user != null) { + map.put("userid", user.getUserid()); + } else { + map.put("userid", 0 + ""); + } + map.put("app", "Goods"); + map.put("class", "DisGoods"); + map.put("goods_id", goodsId); + if (!TextUtils.isEmpty(reply_id)) { + map.put("reply_id", reply_id); + } + + map.put("contents", content); + map.put("sign", Md5.md5("Goods" + "DisGoods" + Md5.secret)); + progressDialog.setMessage("提交中"); + progressDialog.setCancelable(false); +// progressDialog.show(); + + mGankLoader = new Loader(); + Subscription subscription = mGankLoader.getMovie(ApiConfig.BASE_URL, map).subscribe(new Action1() { + + + @Override + public void call(Resultcode resultcode) { + + progressDialog.dismiss(); + if (!(resultcode.status == 0)) { + baseActivity.setToast(1, resultcode.msg); + } + if (resultcode.status == 0) { + +// BaseRecycleViewAdapter adapter = (BaseRecycleViewAdapter) mDataBinding.recyView.getAdapter(); +// if (discoveryListEntities.get(position).getDis_content().isEmpty()) { +// DiscoveryListEntity.Dis_content dis_content = new DiscoveryListEntity.Dis_content(); +// dis_content.setContents(content); +// +// } +// +// adapter.upDateOne(position, discoveryListEntities.get(position)); + } + + } + + + }, new Action1() { + @Override + public void call(Throwable throwable) { + progressDialog.dismiss(); + baseActivity.setToast(2, "提交失败"); + throwable.printStackTrace(); + } + }); + + baseActivity.addSubscription(subscription); + + } } diff --git a/app/src/main/java/imageselector/view/ClipImageView.java b/app/src/main/java/imageselector/view/ClipImageView.java index 655d7fa..02a75b0 100644 --- a/app/src/main/java/imageselector/view/ClipImageView.java +++ b/app/src/main/java/imageselector/view/ClipImageView.java @@ -126,10 +126,7 @@ public class ClipImageView extends AppCompatImageView { rf = new RectF(r); } // 画入前景圆形蒙板层 - int sc = canvas.saveLayer(rf, null, Canvas.MATRIX_SAVE_FLAG - | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG - | Canvas.FULL_COLOR_LAYER_SAVE_FLAG - | Canvas.CLIP_TO_LAYER_SAVE_FLAG | Canvas.ALL_SAVE_FLAG); + int sc = canvas.saveLayer(rf, null, Canvas.ALL_SAVE_FLAG); //画入矩形黑色半透明蒙板层 canvas.drawRect(r, mFrontGroundPaint); //设置Xfermode,目的是为了去除矩形黑色半透明蒙板层和圆形的相交部分 diff --git a/app/src/main/java/my_view/CommentDialog.java b/app/src/main/java/my_view/CommentDialog.java new file mode 100644 index 0000000..5868076 --- /dev/null +++ b/app/src/main/java/my_view/CommentDialog.java @@ -0,0 +1,90 @@ +package my_view; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.view.View; +import android.widget.TextView; + +import com.lxj.xpopup.core.HorizontalAttachPopupView; +import com.sl.house_property.R; + +public class CommentDialog extends HorizontalAttachPopupView { + private boolean isPraise; + private OnCommentOperateListener listener; + private final TextView tvZan; + + public CommentDialog(@NonNull Context context) { + super(context); + tvZan = findViewById(R.id.tv_zan); + + + tvZan.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (isPraise) { + if (listener != null) { + listener.click(1); + } + + } else { + if (listener != null) { + listener.click(2); + } + } + } + }); + findViewById(R.id.tv_comment).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (listener != null) { + listener.click(3); + } + } + }); + findViewById(R.id.tv_bug).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (listener != null) { + listener.click(4); + + } + } + }); + } + + public void setShowBug(boolean type) { + + if (type) { + findViewById(R.id.tv_bug).setVisibility(View.VISIBLE); + findViewById(R.id.v).setVisibility(View.VISIBLE); + } else { + findViewById(R.id.tv_bug).setVisibility(View.GONE); + findViewById(R.id.v).setVisibility(View.GONE); + } + } + + public void setPraise(boolean type) { + isPraise=type; + if (type) { + tvZan.setText("取消"); + } else { + tvZan.setText("赞"); + + } + } + + public void setOnCommentOperateListener(OnCommentOperateListener li) { + listener = li; + } + + @Override + protected int getImplLayoutId() { + return R.layout.dialog_comment; + + } + + + public interface OnCommentOperateListener { + void click(int type); + } +} diff --git a/app/src/main/java/my_view/MyFrameLayout.java b/app/src/main/java/my_view/MyFrameLayout.java new file mode 100644 index 0000000..a1135fb --- /dev/null +++ b/app/src/main/java/my_view/MyFrameLayout.java @@ -0,0 +1,50 @@ +package my_view; + +import android.content.Context; +import android.graphics.Rect; +import android.os.Build; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.RequiresApi; +import android.text.Layout; +import android.util.AttributeSet; +import android.view.WindowInsets; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +public class MyFrameLayout extends FrameLayout { + + + public MyFrameLayout(@NonNull Context context) { + super(context); + } + + public MyFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public MyFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public MyFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected boolean fitSystemWindows(Rect insets) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + insets.left = 0; + insets.top = 0; + insets.right = 0; + insets.bottom=0; + } + return super.fitSystemWindows(insets); + } + + @Override + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0, 0)); + } + +} diff --git a/app/src/main/java/utils/BottomNavigationViewHelper.java b/app/src/main/java/utils/BottomNavigationViewHelper.java index c60399b..7e7af58 100644 --- a/app/src/main/java/utils/BottomNavigationViewHelper.java +++ b/app/src/main/java/utils/BottomNavigationViewHelper.java @@ -24,7 +24,7 @@ public class BottomNavigationViewHelper { for (int i = 0; i < menuView.getChildCount(); i++) { BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i); //noinspection RestrictedApi - item.setShiftingMode(false); + // item.setShiftingMode(false); // set once again checked value, so view will be updated //noinspection RestrictedApi item.setChecked(item.getItemData().isChecked()); diff --git a/app/src/main/java/utils/CommonUtils.java b/app/src/main/java/utils/CommonUtils.java new file mode 100644 index 0000000..7b63c32 --- /dev/null +++ b/app/src/main/java/utils/CommonUtils.java @@ -0,0 +1,42 @@ +package utils; + +import android.content.Context; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +/** + * @author yiw + * @ClassName: CommonUtils + * @Description: + * @date 2015-12-28 下午4:16:01 + */ +public class CommonUtils { + + + public static void showSoftInput(Context context, View view) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + //imm.showSoftInput(view, InputMethodManager.SHOW_FORCED); + } + + public static void hideSoftInput(Context context, View view) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘 + } + + public static boolean isShowSoftInput(Context context) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + //获取状态信息 + return imm.isActive();//true 打开 + } + + /** + * 是否显示,显示则关闭,没显示则显示 + * + * @param context + */ + public static void isShow(Context context) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + } +} diff --git a/app/src/main/java/utils/DateUtils.java b/app/src/main/java/utils/DateUtils.java new file mode 100644 index 0000000..c8e3306 --- /dev/null +++ b/app/src/main/java/utils/DateUtils.java @@ -0,0 +1,480 @@ +package utils; + +import android.text.TextUtils; +import android.util.Log; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Locale; + +/** + * 日期:2017.01.12 + *

+ * 作者:chigan + *

+ * 描述:目期工具类 + */ +public class DateUtils { + + private static final String TAG = "DateUtils"; + + + public static String getTimeStart(String timeString) { + String timeStamp = ""; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); + Date d = new Date(); + try { + d = sdf.parse(timeString); + long l = d.getTime(); + if (String.valueOf(l).length() > 10) { + l = l / 10; + } + timeStamp = String.valueOf(l); + } catch (Exception e) { + + } + return timeStamp; + } + + public static String getTimeEnd(String timeString) { + String timeStamp = ""; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm"); + Date d = new Date(); + try { + d = sdf.parse((timeString + "23:59")); + long l = d.getTime(); + if (String.valueOf(l).length() > 10) { + l = l / 10; + } + timeStamp = String.valueOf(l); + + } catch (Exception e) { + + } + return timeStamp; + } + + + public static String getDate(String mtime) { + return getTimeStrByLong(dataOne(mtime)); + } + + /** + * 获取时间串 + * + * @param longStr 秒 + * @return 1月前 1周前 1天前 1小时前 1分钟前 + */ + public static String getTimeStrByLong(String longStr) { + try { + Calendar calendar = new GregorianCalendar(); + Date date = calendar.getTime(); + Long clv = date.getTime(); + Long olv = Long.valueOf(longStr); + + calendar.setTimeInMillis(olv); // 转毫秒 + Date date2 = calendar.getTime(); + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String curtime = format.format(date2); + + Long belv = clv - olv; + String retStr = ""; + // 24 * 60 * 60 * 1000; + Long daylong = Long.valueOf("86400000"); + Long hourlong = Long.valueOf("3600000"); + Long minlong = Long.valueOf("60000"); + Long seclong = Long.valueOf("1000"); + + if (belv >= daylong * 30) {// 月 + + Long mul = belv / (daylong * 30); + retStr = retStr + mul + "月"; + belv = belv % (daylong * 30); + return retStr + "前"; + } + if (belv >= daylong * 7) {// 周 + + Long mul = belv / (daylong * 7); + retStr = retStr + mul + "周"; + belv = belv % (daylong * 7); + return retStr + "前"; + } + if (belv >= daylong) {// 天 + + Long mul = belv / daylong; + retStr = retStr + mul + "天"; + belv = belv % daylong; + return retStr + "前"; + } + if (belv >= hourlong) {// 时 + Long mul = belv / hourlong; + retStr = retStr + mul + "小时"; + belv = belv % hourlong; + return retStr + "前"; + } + if (belv >= minlong) {// 分 + Long mul = belv / minlong; + retStr = retStr + mul + "分钟"; + return retStr + "前"; + } + if (belv >= seclong) { + Long mul = belv / seclong; + retStr = retStr + mul + "秒"; + return retStr + "前"; + } + } catch (Exception e) { + Log.e("ttterr", longStr); + return ""; + } + return ""; + } + + /** + * 返回xxxx年-xx月xx日 xx时:xx分:xx秒 + * + * @param strMis 毫秒的字符串形式 + * @return + */ + public static String getStringDataMilli(String strMis) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(new Date(Long.parseLong(strMis))); + } + + /** + * 返回xx月xx日 xx时:xx分 + * + * @return + */ + public static String getStringDataMilliNoy() { + SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm"); + return sdf.format(new Date(System.currentTimeMillis())); + } + + /** + * 返回xxxx年-xx月xx日 xx时:xx分:xx秒 + * + * @param strSecond 秒的字符串形式所以要*1000 + * @return + */ + public static String getStringDataSecond(String strSecond) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(new Date(Long.parseLong(strSecond) * 1000)); + } + + /** + * 返回xxxx年-xx月xx日 + * + * @param strMis + * @return + */ + public static String getStringYMD(String strMis) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + if (TextUtils.isEmpty(strMis)) { + return ""; + } + return sdf.format(new Date(Long.parseLong(strMis) * 1000)); + } + + /** + * 返回xxxx年-xx月xx日 + * + * @param date + * @return + */ + public static String getStringYMD(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.format(date); + } + + /** + * 返回xxxx年-xx月xx日 xx时xx分 + * + * @param strMis + * @return + */ + public static String getStringYMDHM(String strMis) { +// Log.d(TAG, "getStringYMDHM: " + strMis); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + return sdf.format(new Date(Long.parseLong(strMis) * 1000)); + } + + /** + * 返回xxxx年-xx月xx日 xx时xx分 + * + * @param date + * @return + */ + public static String getStringYMDHM(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + return sdf.format(date); + } + + + /** + * 获取当前是哪一天 + * + * @return + */ + public static int getCurrentDay() { + SimpleDateFormat sdf = new SimpleDateFormat("dd"); + return Integer.parseInt(sdf.format(new Date(System.currentTimeMillis()))); + } + + /** + * 获取当前是哪个月 + * + * @return + */ + public static int getCurrentMonth() { + SimpleDateFormat sdf = new SimpleDateFormat("MM"); + return Integer.parseInt(sdf.format(new Date(System.currentTimeMillis()))) - 1; + } + + /** + * 获取当前是哪一年 + * + * @return + */ + public static int getCurrentYear() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); + return Integer.parseInt(sdf.format(new Date(System.currentTimeMillis()))); + } + + /** + * 根据一个时间磋,获取是多少天 + * + * @param time + * @return + */ + public static int getDay(long time) { + long day = (time * 1000) / (24 * 60 * 60 * 1000); + return (int) day; + } + + /** + * 获取时间戳 是多少分钟 + * + * @param timestamp + * @return + */ + public static int getMinute(long timestamp) { + long minute = timestamp * 1000 / (60 * 1000); + return (int) minute; + } + + /** + * 计算多少天开始 + * + * @param starTime 时间轴 + * @return 天数 + */ + public static int beginDate(String starTime) { + long now = System.currentTimeMillis(); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH"); + String d = format.format(Long.valueOf(starTime) * 1000); + Long start = null; + try { + start = format.parse(d).getTime(); + } catch (ParseException e) { + e.printStackTrace(); + } + long b = start - now; + float f = (float) (b * 1.0 / 60 / 60 / 24 / 1000); + double days = (b * 1.0 / 60 / 60 / 24 / 1000); + return (int) Math.ceil(days); + } + + /** + * 返回一个时间轴和现在的相隔时间 如果时间在当前时间之前则返回空 + * + * @param longStr + * @return + */ + public static String getTimeStrToBegin(String longStr) { + + Calendar calendar = new GregorianCalendar(); + Date date = calendar.getTime(); + Long clv = date.getTime(); + Long olv = Long.valueOf(longStr); + + calendar.setTimeInMillis(olv); // 转毫秒 + Date date2 = calendar.getTime(); + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String curtime = format.format(date2); + + Long belv = olv * 1000 - clv; + String retStr = ""; + // 24 * 60 * 60 * 1000; + Long daylong = Long.valueOf("86400000"); + Long hourlong = Long.valueOf("3600000"); + Long minlong = Long.valueOf("60000"); + Long seclong = Long.valueOf("1000"); + + if (belv >= daylong * 30) {// 月 + + Long mul = belv / (daylong * 30); + retStr = retStr + mul + "月"; + belv = belv % (daylong * 30); + return retStr; + } + if (belv >= daylong * 7) {// 周 + + Long mul = belv / (daylong * 7); + retStr = retStr + mul + "周"; + belv = belv % (daylong * 7); + return retStr; + } + if (belv >= daylong) {// 天 + + Long mul = belv / daylong; + retStr = retStr + mul + "天"; + belv = belv % daylong; + return retStr; + } + if (belv >= hourlong) {// 时 + Long mul = belv / hourlong; + retStr = retStr + mul + "小时"; + belv = belv % hourlong; + return retStr; + } + if (belv >= minlong) {// 分 + Long mul = belv / minlong; + retStr = retStr + mul + "分钟"; + return retStr; + } + if (belv >= seclong) { + Long mul = belv / seclong; + retStr = retStr + mul + "秒"; + return retStr; + } + return ""; + } + + + /** + * 调此方法输入所要转换的时间输入例如("2014-06-14-16-09-00")返回时间戳 + * + * @param time + * @return + */ + public static String dataOne(String time) { + SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", + Locale.CHINA); + Date date = null; + try { + date = sdr.parse(time); + return date.getTime() + ""; + } catch (ParseException e) { + e.printStackTrace(); + } + + + return ""; + } + public static Long getUnitDate(String time){ + SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd", + Locale.CHINA); + Date date = null; + try { + date = sdr.parse(time); + return date.getTime() ; + } catch (ParseException e) { + e.printStackTrace(); + } + return 0l; + } + + public static String getSpecifiedDayAfter(String specifiedDay) { + Calendar c = Calendar.getInstance(); + Date date = null; + try { + date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay); + } catch (ParseException e) { + e.printStackTrace(); + } + c.setTime(date); + int day = c.get(Calendar.DATE); + c.set(Calendar.DATE, day + 1); + String dayAfter = new SimpleDateFormat("yyyy-MM-dd") + .format(c.getTime()); + return dayAfter; + } + + /** + * 月份+i + * + * @param i + * @return + */ + public static String getmonthAdd(int i, String specifiedDay) { + Calendar c = Calendar.getInstance(); + Date date = null; + try { + date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay); + } catch (ParseException e) { + e.printStackTrace(); + } + c.setTime(date); + int month = c.get(Calendar.MONTH); + c.set(Calendar.MONTH, month + i); + String dayAfter = new SimpleDateFormat("yyyy-MM-dd") + .format(c.getTime()); + return dayAfter; + } + + + public static Calendar getParkingStart(String info) { + Calendar c = Calendar.getInstance(); + Date date = null; + try { + date = new SimpleDateFormat("yy-MM-dd").parse(DateUtils.getSpecifiedDayAfter(info)); + } catch (ParseException e) { + e.printStackTrace(); + } + c.setTime(date); + return c; + } + + public static Calendar getParkingMaxEnd(String info) { + Calendar c = Calendar.getInstance(); + Date date = null; + try { + date = new SimpleDateFormat("yy-MM-dd").parse(DateUtils.getSpecifiedDayAfter(info)); + } catch (ParseException e) { + e.printStackTrace(); + } + c.setTime(date); + int month = c.get(Calendar.MONTH); + c.set(Calendar.MONTH, month + 12); + return c; + } + + public static String getUnit(String info) { + if (TextUtils.isEmpty(info)) { + return ""; + } + boolean numericZidai = isNumericZidai(info); + if (numericZidai) { + return info + "单元"; + } else { + return info; + } + } + + public static boolean isNumericZidai(String str) { + + for (int i = 0; i < str.length(); i++) { + System.out.println(str.charAt(i)); + if (!Character.isDigit(str.charAt(i))) { + return false; + } + } + return true; + } + +} diff --git a/app/src/main/java/utils/KeyboardUtil.java b/app/src/main/java/utils/KeyboardUtil.java index 9d44ee4..f99c5db 100644 --- a/app/src/main/java/utils/KeyboardUtil.java +++ b/app/src/main/java/utils/KeyboardUtil.java @@ -1,12 +1,14 @@ package utils; import android.app.Activity; +import android.content.Context; import android.inputmethodservice.Keyboard; import android.inputmethodservice.KeyboardView; import android.text.Editable; import android.text.InputType; import android.view.View; import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import com.sl.house_property.R; @@ -144,6 +146,16 @@ public class KeyboardUtil { mKeyboardView.setVisibility(View.VISIBLE); } } + /** + * 显示软键盘 + * + * @param context 当前Activity + */ + public static void showSoftInput(Context context) { + InputMethodManager inputMethodManager = + (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + } /** * 软键盘隐藏 diff --git a/app/src/main/java/utils/NineImageLoader.java b/app/src/main/java/utils/NineImageLoader.java index 89eb76a..3848885 100644 --- a/app/src/main/java/utils/NineImageLoader.java +++ b/app/src/main/java/utils/NineImageLoader.java @@ -5,12 +5,18 @@ import android.graphics.Bitmap; import android.widget.ImageView; import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.lzy.ninegrid.NineGridView; +import com.sl.house_property.R; public class NineImageLoader implements NineGridView.ImageLoader { @Override public void onDisplayImage(Context context, ImageView imageView, String url) { - Glide.with(context).load(url).into(imageView); + RequestOptions requestOptions = new RequestOptions(); + requestOptions.placeholder(R.mipmap.icon_default_rectangle); + requestOptions.error(R.mipmap.icon_default_rectangle); + requestOptions .skipMemoryCache(false); + Glide.with(context).load(url).apply(requestOptions).into(imageView); } @Override diff --git a/app/src/main/java/utils/UtilHelpers.java b/app/src/main/java/utils/UtilHelpers.java new file mode 100644 index 0000000..c0fe758 --- /dev/null +++ b/app/src/main/java/utils/UtilHelpers.java @@ -0,0 +1,42 @@ +package utils; + +import android.app.Activity; +import android.content.Context; +import android.os.IBinder; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +public class UtilHelpers { + /** + * 根据传入控件的坐标和用户的焦点坐标,判断是否隐藏键盘,如果点击的位置在控件内,则不隐藏键盘 + * + * @param view 控件view + * @param event 焦点位置 + * @return 是否隐藏 + */ + public static boolean hideKeyboard(MotionEvent event, View view, + Activity activity) { + + try { + if (view != null && view instanceof EditText) { + int[] location = {0, 0}; + view.getLocationInWindow(location); + int left = location[0], top = location[1], right = left + + view.getWidth(), bootom = top + view.getHeight(); + // 判断焦点位置坐标是否在空间内,如果位置在控件外,则隐藏键盘 + if (event.getRawX() < left || event.getRawX() > right + || event.getY() < top || event.getRawY() > bootom) { +// // 隐藏键盘 + + return true; + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } +} diff --git a/app/src/main/res/drawable/shape_comment.xml b/app/src/main/res/drawable/shape_comment.xml new file mode 100644 index 0000000..276e1df --- /dev/null +++ b/app/src/main/res/drawable/shape_comment.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_comment_bg.xml b/app/src/main/res/drawable/shape_comment_bg.xml new file mode 100644 index 0000000..0432e62 --- /dev/null +++ b/app/src/main/res/drawable/shape_comment_bg.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_tab.xml b/app/src/main/res/layout/activity_main_tab.xml index 78d62c8..cdf39e0 100644 --- a/app/src/main/res/layout/activity_main_tab.xml +++ b/app/src/main/res/layout/activity_main_tab.xml @@ -1,101 +1,115 @@ + - - - - android:layout_height="match_parent"/> - + + + + - - - - + + - + + - - - - + android:layout_height="50dip" + + android:background="@color/white" + android:orientation="horizontal" + android:paddingTop="7dip"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_comment.xml b/app/src/main/res/layout/dialog_comment.xml new file mode 100644 index 0000000..ec854c1 --- /dev/null +++ b/app/src/main/res/layout/dialog_comment.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_discovery.xml b/app/src/main/res/layout/fragment_discovery.xml index 3c60b2b..81e3064 100644 --- a/app/src/main/res/layout/fragment_discovery.xml +++ b/app/src/main/res/layout/fragment_discovery.xml @@ -1,84 +1,159 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" - + + + android:layout_height="match_parent" + android:orientation="vertical"> - + + + + + + + + - /> + - + + + + + + + + + + + + + + + + + + + + + + - + android:layout_height="45dp" + android:layout_gravity="bottom" + android:background="#f6f6f6" + android:elevation="3dp" + android:gravity="center_vertical" + android:orientation="horizontal" + android:visibility="gone"> - + android:layout_centerVertical="true" + android:layout_marginLeft="15dp" + android:layout_marginRight="7dp" + android:layout_weight="1" + android:background="@drawable/shape_comment_bg" + android:ellipsize="end" + android:hint="说点什么" + android:maxLength="300" + android:paddingLeft="10dp" + android:singleLine="true" + android:textColorHint="#a2a2a2" + android:textSize="13sp" /> - - + + + - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_comment.xml b/app/src/main/res/layout/item_comment.xml new file mode 100644 index 0000000..8dbf757 --- /dev/null +++ b/app/src/main/res/layout/item_comment.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_discovery.xml b/app/src/main/res/layout/item_discovery.xml index 4240207..0283ff4 100644 --- a/app/src/main/res/layout/item_discovery.xml +++ b/app/src/main/res/layout/item_discovery.xml @@ -23,13 +23,14 @@ android:orientation="vertical"> kVK%vM|NRncvu#(L%Sx7YH&(tiGvLG}5tc)5-VIhhvOhnlr84G{H zf+-7Z$dpoIp=PB==j-0Dx7+viefOGX7Upd3;=b=W&wHNpJnt)}I5frenFdhrfbCnr zW?*&$T3!SDB)!f5*&YBkR-o`RFe+&%_SOK{z6cy>k?fG9a|wW#z}gA`@+}7?UCIF% z_z3Kh6sN6+?HxdL=Wh0W0dxUpYbTIO&5`XjzztxAq-8095lNkmPL$CTK#Flj(vh-V zu>Az+2=HwI$Y=`Aw*sqyXTUv4gJp|nxyl2mQmEOUN*(w=0Ti?z`u!qlz;*}F51f!R zlJI&QI0>AV^f*&cZ*jQWrXT|lg+d*9(IvoQAO@*30T5E&02~9xB=y*S9@0(yqtp=Q z075Oc_W)Oc<-q(V0Kyp;0hfWDz-?frq(233X-@@72lD;V@|=Q39SChdwLK2p1b#|7 zTpZx46hxjVx*vE4gcWy5x?_7T@EuqoX*9F;?Z8S&WB&{wqaZBwRSX_*9{2%VleE`% zFK`rCDrr2Wu8FgjrXVIgPWccRl=Lm3C;qJhhJv2NHT#?06Kzw_%6u|8#if6@SCmU=2Pp}g*ONxQ3nC`EzoZE^P} zg+hj5&k@6ty32xS1R#IkT?rpAB#gGN2gW7MN+$hN=sxp>G8h&DJ()`CFQP5LgBDr( zBwa`Vgc-ZPkU&6!jbI~! z*#yKuQUr-2c1P|yZ(SBvePs7x@oupXc4qGRn7QxGxgv$_DPRET&HiiS^A}K&^eHqH zKek^2n{5000AjNkltQQ|G?!3?5$C<+QG@*(o&AOG>&!}iQRbI#c_%`7-@_Wstl)^D$Ged}9$i%G=x zO+fv37Wf(X3itxpFX@ja6SnUKZU(Lf<^UG}p8%f$$0Qx?=2~40-VHnk+&CFD@B{FY zq|r*x_9H-k*Yucs7tN?W*>-JkC$Lk}i7wGxR3fstVf+B_qNGo|%)K1g06bca zOB!bx|6}_|d4lL&+YP4EiS588vbO?%0_!Bb(PQbxhHWQmTY=kv@raE<*?zW==W>yx z{rwoN<2`XS*J)u}HlK+?m}a>GrmUr#jDe%F7kN`++(IT$zNEv}vlw+s?QBF|ZIg z8K{4N3xOq)Qdee0Y`+GqOd191Hy}lErKHzqh3H%bi0>7^Ux7-wzX8}KY56Qd9W1r( z>p(qUj)qf`=FKA1FTiEMXrS%_-YqZ>NZLKqV7BiE-YR|X_1c3b^=gWs0`SC6IfPArlqjjeg&vDQ6tc#Pz9_yk8-(3QhM-KVms|o z+N8!Ms~c@xzPf_#7l6mhy|g*^Ny@8M-%>l*dII%~ROQw7Fz{r#PA4%W=}bRVw(|n= za6b{M?DdRP4J=zWeR$-f60y^hf!WRr#6v}Alcc;P^pw7#V##(LEN{A5%3qtj*xm&^ zSjN^%N*eSf13@)_rR~X5{?w6&In=97u}0GNzG#Zlz)%ff`K}PK9OjAUULfBQA}b_S zXKLSEt)LpfPNokkON!{4}1e`k(Axp aTK)qte^$ttrue - - +