From 4b9f34b946e9cf42454712730f4d5f85a43164c8 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 5 Apr 2025 10:52:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=97=E8=A1=A8=E9=A1=B9?= =?UTF-8?q?=E5=AE=BD=E5=BA=A6=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- positions/build.properties | 4 +- .../adapters/PostionModelAdapter.java | 247 ++++++++++++++++++ .../positions/fragments/LogFragment.java | 14 +- .../fragments/PositionsFragment.java | 49 ++-- .../studio/positions/models/PostionModel.java | 42 +++ .../{views => utils}/PostionUtils.java | 16 +- .../positions/views/LeftScrollView.java | 219 ++++++++++++++++ .../res/drawable/recycler_view_border.xml | 8 + .../main/res/layout/fragment_positions.xml | 162 +++++------- .../src/main/res/layout/view_left_scroll.xml | 57 ++++ .../src/main/res/layout/view_position.xml | 68 +++++ .../main/res/layout/view_position_simple.xml | 15 ++ positions/src/main/res/values/colors.xml | 6 + 13 files changed, 782 insertions(+), 125 deletions(-) create mode 100644 positions/src/main/java/cc/winboll/studio/positions/adapters/PostionModelAdapter.java rename positions/src/main/java/cc/winboll/studio/positions/{views => utils}/PostionUtils.java (84%) create mode 100644 positions/src/main/java/cc/winboll/studio/positions/views/LeftScrollView.java create mode 100644 positions/src/main/res/drawable/recycler_view_border.xml create mode 100644 positions/src/main/res/layout/view_left_scroll.xml create mode 100644 positions/src/main/res/layout/view_position.xml create mode 100644 positions/src/main/res/layout/view_position_simple.xml diff --git a/positions/build.properties b/positions/build.properties index 5ca19ca..e71b720 100644 --- a/positions/build.properties +++ b/positions/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri Apr 04 05:21:19 GMT 2025 +#Sat Apr 05 02:50:45 GMT 2025 stageCount=0 libraryProject= baseVersion=1.0 publishVersion=1.0.0 -buildCount=412 +buildCount=438 baseBetaVersion=1.0.1 diff --git a/positions/src/main/java/cc/winboll/studio/positions/adapters/PostionModelAdapter.java b/positions/src/main/java/cc/winboll/studio/positions/adapters/PostionModelAdapter.java new file mode 100644 index 0000000..5c30f19 --- /dev/null +++ b/positions/src/main/java/cc/winboll/studio/positions/adapters/PostionModelAdapter.java @@ -0,0 +1,247 @@ +package cc.winboll.studio.positions.adapters; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/04/04 13:38:13 + */ +import android.content.Context; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Switch; +import android.widget.TextView; +import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog; +import cc.winboll.studio.libappbase.utils.ToastUtils; +import cc.winboll.studio.positions.R; +import cc.winboll.studio.positions.models.PostionModel; +import cc.winboll.studio.positions.utils.PostionUtils; +import cc.winboll.studio.positions.views.LeftScrollView; +import java.util.ArrayList; + +public class PostionModelAdapter extends RecyclerView.Adapter { + + public static final String TAG = "PostionModelAdapter"; + + private static final int VIEW_TYPE_SIMPLE = 0; + private static final int VIEW_TYPE_EDIT = 1; + + private Context context; + private ArrayList mPostionList; + + public PostionModelAdapter(Context context, ArrayList postionList) { + this.context = context; + this.mPostionList = postionList; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater inflater = LayoutInflater.from(context); + if (viewType == VIEW_TYPE_SIMPLE) { + View view = inflater.inflate(R.layout.view_position_simple, parent, false); + return new SimpleViewHolder(parent, view); + } else { + View view = inflater.inflate(R.layout.view_position, parent, false); + return new EditViewHolder(parent, view); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) { + final PostionModel model = mPostionList.get(position); + if (holder instanceof SimpleViewHolder) { + final SimpleViewHolder simpleViewHolder = (SimpleViewHolder) holder; + String szView = model.getComments().trim().equals("") ?"[NULL]": model.getComments(); + simpleViewHolder.tvComments.setText(szView); + simpleViewHolder.scrollView.setOnActionListener(new LeftScrollView.OnActionListener(){ + + @Override + public void onUp() { + ArrayList list = mPostionList; + if (position > 0) { + ToastUtils.show("onUp"); + simpleViewHolder.scrollView.smoothScrollTo(0, 0); +// PhoneConnectRuleModel newBean = new PhoneConnectRuleModel(); +// newBean.setRuleText(list.get(position).getRuleText()); +// newBean.setIsAllowConnection(list.get(position).isAllowConnection()); +// newBean.setIsEnable(list.get(position).isEnable()); +// newBean.setIsSimpleView(list.get(position).isSimpleView()); + list.add(position - 1, list.get(position)); + list.remove(position + 1); + PostionUtils.getInstance(context).savePostionModelList(); + notifyDataSetChanged(); + } + } + + @Override + public void onDown() { + ArrayList list = mPostionList; + if (position < list.size() - 1) { + ToastUtils.show("onDown"); + simpleViewHolder.scrollView.smoothScrollTo(0, 0); +// PhoneConnectRuleModel newBean = new PhoneConnectRuleModel(); +// newBean.setRuleText(list.get(position).getRuleText()); +// newBean.setIsAllowConnection(list.get(position).isAllowConnection()); +// newBean.setIsEnable(list.get(position).isEnable()); +// newBean.setIsSimpleView(list.get(position).isSimpleView()); + list.add(position + 2, list.get(position)); + list.remove(position); + PostionUtils.getInstance(context).savePostionModelList(); + notifyDataSetChanged(); + } + } + + @Override + public void onEdit() { + simpleViewHolder.scrollView.smoothScrollTo(0, 0); + model.setIsSimpleView(false); + notifyDataSetChanged(); + //notifyItemChanged(position); + } + + @Override + public void onDelete() { + YesNoAlertDialog.show(simpleViewHolder.scrollView.getContext(), "删除确认", "是否删除该通话规则?", new YesNoAlertDialog.OnDialogResultListener(){ + + @Override + public void onYes() { + simpleViewHolder.scrollView.smoothScrollTo(0, 0); + model.setIsSimpleView(true); + ArrayList list = mPostionList; + list.remove(position); + PostionUtils.getInstance(context).savePostionModelList(); + notifyDataSetChanged(); + //notifyItemChanged(position); + } + + @Override + public void onNo() { + } + }); + + } + }); +// simpleViewHolder.editButton.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// model.setIsSimpleView(false); +// notifyItemChanged(position); +// } +// }); +// simpleViewHolder.deleteButton.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// model.setIsSimpleView(false); +// ArrayList list = Rules.getInstance(context).getPhoneBlacRuleBeanList(); +// list.remove(position); +// Rules.getInstance(context).saveRules(); +// notifyItemChanged(position); +// } +// }); +// // 触摸事件处理 +// simpleViewHolder.contentLayout.setOnTouchListener(new View.OnTouchListener() { +// @Override +// public boolean onTouch(View v, MotionEvent event) { +// switch (event.getAction()) { +// case MotionEvent.ACTION_DOWN: +// simpleViewHolder.startX = event.getX(); +// simpleViewHolder.isSwiping = true; +// break; +// case MotionEvent.ACTION_MOVE: +// if (simpleViewHolder.isSwiping) { +// float deltaX = simpleViewHolder.startX - event.getX(); +// if (deltaX > 0) { // 左滑 +// float translationX = Math.max(-simpleViewHolder.actionLayout.getWidth(), -deltaX); +// simpleViewHolder.contentLayout.setTranslationX(translationX); +// simpleViewHolder.actionLayout.setVisibility(View.VISIBLE); +// } +// } +// break; +// case MotionEvent.ACTION_UP: +// simpleViewHolder.isSwiping = false; +// if (simpleViewHolder.contentLayout.getTranslationX() < -simpleViewHolder.actionLayout.getWidth() / 2) { +// // 保持按钮显示 +// simpleViewHolder.contentLayout.setTranslationX(-actionLayout.getWidth()); +// } else { +// // 恢复原状 +// simpleViewHolder.contentLayout.animate().translationX(0).setDuration(200).start(); +// simpleViewHolder.actionLayout.setVisibility(View.INVISIBLE); +// } +// break; +// } +// return true; +// } +// }); + } else if (holder instanceof EditViewHolder) { + final EditViewHolder editViewHolder = (EditViewHolder) holder; + editViewHolder.etComments.setText(model.getComments()); + editViewHolder.swEnable.setChecked(model.isEnable()); + editViewHolder.btnConfirm.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + model.setComments(editViewHolder.etComments.getText().toString()); + model.setIsEnable(editViewHolder.swEnable.isChecked()); + model.setIsSimpleView(true); + PostionUtils.getInstance(context).savePostionModelList(); + notifyItemChanged(position); + Toast.makeText(context, "保存成功", Toast.LENGTH_SHORT).show(); + } + }); + } + } + + @Override + public int getItemCount() { + return mPostionList.size(); + } + + @Override + public int getItemViewType(int position) { + PostionModel model = mPostionList.get(position); + // 这里可以根据模型的状态来决定视图类型,简单起见,假设点击按钮后进入编辑视图 + return model.isSimpleView() ? VIEW_TYPE_SIMPLE : VIEW_TYPE_EDIT; + } + + static class SimpleViewHolder extends RecyclerView.ViewHolder { + + private final LeftScrollView scrollView; + private final TextView tvComments; + + + public SimpleViewHolder(@NonNull ViewGroup parent, @NonNull View itemView) { + super(itemView); + scrollView = itemView.findViewById(R.id.scrollView); + //tvRuleText = itemView.findViewById(R.id.ruletext_tv); + tvComments = new TextView(itemView.getContext()); + //tvComments.setBackgroundColor(Color.GRAY); + LogUtils.d(TAG, String.format("getWidth() %d", parent.getWidth())); + scrollView.setContentWidth(parent.getWidth()); + //scrollView.setContentWidth(600); + scrollView.addContentLayout(tvComments); + } + + } + + static class EditViewHolder extends RecyclerView.ViewHolder { + EditText etComments; + Switch swEnable; + Button btnMoveCarema; + Button btnConfirm; + + public EditViewHolder(@NonNull ViewGroup parent, @NonNull View itemView) { + super(itemView); + etComments = itemView.findViewById(R.id.comments_et); + swEnable = itemView.findViewById(R.id.enable_sw); + btnMoveCarema = itemView.findViewById(R.id.movecarema_btn); + btnConfirm = itemView.findViewById(R.id.confirm_btn); + } + } +} + diff --git a/positions/src/main/java/cc/winboll/studio/positions/fragments/LogFragment.java b/positions/src/main/java/cc/winboll/studio/positions/fragments/LogFragment.java index c9729cc..dfc3be3 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/fragments/LogFragment.java +++ b/positions/src/main/java/cc/winboll/studio/positions/fragments/LogFragment.java @@ -21,6 +21,8 @@ public class LogFragment extends Fragment { private static final String ARG_PAGE = "ARG_PAGE"; private int mPage; + + LogView mLogView; // public static LogFragment newInstance(int page) { // Bundle args = new Bundle(); @@ -43,8 +45,16 @@ public class LogFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_log, container, false); -// LogView logView = view.findViewById(R.id.logview); -// logView.start(); + mLogView = view.findViewById(R.id.logview); + mLogView.start(); return view; } + + @Override + public void onResume() { + super.onResume(); + mLogView.start(); + } + + } diff --git a/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java b/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java index 02b9527..65ec7df 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java +++ b/positions/src/main/java/cc/winboll/studio/positions/fragments/PositionsFragment.java @@ -6,13 +6,16 @@ package cc.winboll.studio.positions.fragments; * @Describe 联系人 */ import android.Manifest; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; +import android.os.IBinder; import android.os.SystemClock; import android.view.LayoutInflater; import android.view.Menu; @@ -21,28 +24,26 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.EditText; +import android.widget.Switch; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.utils.ToastUtils; -import cc.winboll.studio.positions.R; -import cc.winboll.studio.positions.models.PostionFixModel; -import cc.winboll.studio.positions.utils.LocationFusion; -import cc.winboll.studio.positions.utils.TimeUtils; -import android.widget.EditText; -import android.widget.Switch; -import android.content.Intent; -import cc.winboll.studio.positions.services.GPSService; -import android.content.Context; -import android.content.ServiceConnection; -import android.content.ComponentName; -import android.os.IBinder; -import cc.winboll.studio.positions.listeners.OnGPSRTLocationListener; import cc.winboll.studio.positions.MainActivity; -import cc.winboll.studio.positions.views.PostionUtils; +import cc.winboll.studio.positions.R; +import cc.winboll.studio.positions.adapters.PostionModelAdapter; +import cc.winboll.studio.positions.listeners.OnGPSRTLocationListener; +import cc.winboll.studio.positions.models.PostionFixModel; +import cc.winboll.studio.positions.models.PostionModel; +import cc.winboll.studio.positions.services.GPSService; +import cc.winboll.studio.positions.utils.LocationFusion; +import cc.winboll.studio.positions.utils.PostionUtils; +import java.util.ArrayList; public class PositionsFragment extends Fragment { @@ -52,6 +53,7 @@ public class PositionsFragment extends Fragment { private int mPage; private LocationManager locationManager; + //MyHandler mMyHandler; @@ -63,6 +65,9 @@ public class PositionsFragment extends Fragment { Button mbtnAdd; Location mLocationTX; Location mLocationPhoneGPS; + private RecyclerView recyclerView; + private PostionModelAdapter adapter; + private ArrayList mPostionList; TextView mtvPostionFixModelInfo; TextView mtvLockPostionInfo; @@ -135,6 +140,15 @@ public class PositionsFragment extends Fragment { postionUtils.addPostion(mLocationPhoneGPS); } }); + + recyclerView = viewMain.findViewById(R.id.recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + + mPostionList = PostionUtils.getInstance(getActivity()).getPostionModelList(); + + adapter = new PostionModelAdapter(getActivity(), mPostionList); + recyclerView.setAdapter(adapter); + // metLockLatitude = viewMain.findViewById(R.id.locklatitude_et); // metLockLongitude = viewMain.findViewById(R.id.locklongitude_et); @@ -174,7 +188,6 @@ public class PositionsFragment extends Fragment { //showLocationPhoneGPS(); //showPostionFixModelInfo(); - return viewMain; } diff --git a/positions/src/main/java/cc/winboll/studio/positions/models/PostionModel.java b/positions/src/main/java/cc/winboll/studio/positions/models/PostionModel.java index a78076d..ea593ba 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/models/PostionModel.java +++ b/positions/src/main/java/cc/winboll/studio/positions/models/PostionModel.java @@ -27,6 +27,9 @@ public class PostionModel extends BaseBean { // 精确度 private double accuracy; private String provider; + private String comments; + private boolean isEnable; + private boolean isSimpleView; public PostionModel() { this.uuid = UUID.randomUUID().toString(); @@ -35,6 +38,9 @@ public class PostionModel extends BaseBean { this.timestamp = 0L; this.accuracy = 0.0f; this.provider = ""; + this.comments = ""; + this.isEnable = false; + this.isSimpleView = true; } public PostionModel(Location location) { @@ -44,6 +50,33 @@ public class PostionModel extends BaseBean { this.timestamp = location.getTime(); this.accuracy = location.getAccuracy(); this.provider = location.getProvider(); + this.comments = ""; + this.isEnable = false; + this.isSimpleView = true; + } + + public void setIsEnable(boolean isEnable) { + this.isEnable = isEnable; + } + + public boolean isEnable() { + return isEnable; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public String getComments() { + return comments; + } + + public void setIsSimpleView(boolean isSimpleView) { + this.isSimpleView = isSimpleView; + } + + public boolean isSimpleView() { + return isSimpleView; } public void setUuid(String uuid) { @@ -109,6 +142,9 @@ public class PostionModel extends BaseBean { jsonWriter.name("timestamp").value(getTimestamp()); jsonWriter.name("accuracy").value(getAccuracy()); jsonWriter.name("provider").value(getProvider()); + jsonWriter.name("comments").value(getComments()); + jsonWriter.name("isEnable").value(isEnable()); + jsonWriter.name("isSimpleView").value(isSimpleView()); } @@ -127,6 +163,12 @@ public class PostionModel extends BaseBean { setAccuracy(jsonReader.nextDouble()); } else if (name.equals("provider")) { setProvider(jsonReader.nextString()); + } else if (name.equals("comments")) { + setComments(jsonReader.nextString()); + } else if (name.equals("isEnable")) { + setIsEnable(jsonReader.nextBoolean()); + } else if (name.equals("isSimpleView")) { + setIsSimpleView(jsonReader.nextBoolean()); } else { return false; } diff --git a/positions/src/main/java/cc/winboll/studio/positions/views/PostionUtils.java b/positions/src/main/java/cc/winboll/studio/positions/utils/PostionUtils.java similarity index 84% rename from positions/src/main/java/cc/winboll/studio/positions/views/PostionUtils.java rename to positions/src/main/java/cc/winboll/studio/positions/utils/PostionUtils.java index 86241d6..7253eb3 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/views/PostionUtils.java +++ b/positions/src/main/java/cc/winboll/studio/positions/utils/PostionUtils.java @@ -1,4 +1,4 @@ -package cc.winboll.studio.positions.views; +package cc.winboll.studio.positions.utils; /** * @Author ZhanGSKen@AliYun.Com @@ -23,7 +23,7 @@ public class PostionUtils { mContext = context; PostionModel.loadBeanList(mContext, mPostionModelList, PostionModel.class); } - + public synchronized static PostionUtils getInstance(Context context) { if (_PostionUtils == null) { _PostionUtils = new PostionUtils(context); @@ -31,11 +31,19 @@ public class PostionUtils { return _PostionUtils; } + public ArrayList getPostionModelList() { + return mPostionModelList; + } + + public void savePostionModelList() { + PostionModel.saveBeanList(mContext, mPostionModelList, PostionModel.class); + } + public void addPostion(PostionModel item) { mPostionModelList.add(item); PostionModel.saveBeanList(mContext, mPostionModelList, PostionModel.class); } - + public void addPostion(Location location) { PostionModel item = new PostionModel(); item.setLatitude(location.getLatitude()); @@ -43,7 +51,7 @@ public class PostionUtils { item.setTimestamp(location.getTime()); item.setAccuracy(location.getAccuracy()); item.setProvider(location.getProvider()); - + mPostionModelList.add(item); PostionModel.saveBeanList(mContext, mPostionModelList, PostionModel.class); } diff --git a/positions/src/main/java/cc/winboll/studio/positions/views/LeftScrollView.java b/positions/src/main/java/cc/winboll/studio/positions/views/LeftScrollView.java new file mode 100644 index 0000000..e59e6c8 --- /dev/null +++ b/positions/src/main/java/cc/winboll/studio/positions/views/LeftScrollView.java @@ -0,0 +1,219 @@ +package cc.winboll.studio.positions.views; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/04 10:51:50 + * @Describe CustomHorizontalScrollView + */ +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.TextView; +import cc.winboll.studio.positions.R; +import cc.winboll.studio.libappbase.LogUtils; + +public class LeftScrollView extends HorizontalScrollView { + + public static final String TAG = "LeftScrollView"; + + private LinearLayout contentLayout; + private LinearLayout toolLayout; + private TextView textView; + private Button editButton; + private Button deleteButton; + private Button upButton; + private Button downButton; + private float mStartX; + private float mEndX; + private boolean isScrolling = false; + private int nScrollAcceptSize; + + public LeftScrollView(Context context) { + super(context); + init(); + } + + public LeftScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public LeftScrollView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + public void addContentLayout(TextView textView) { + contentLayout.addView(textView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); + } + + public void setContentWidth(int contentWidth) { + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) contentLayout.getLayoutParams(); + layoutParams.width = contentWidth; + contentLayout.setLayoutParams(layoutParams); + + } + + private void init() { + View viewMain = inflate(getContext(), R.layout.view_left_scroll, null); + + // 创建内容布局 + contentLayout = viewMain.findViewById(R.id.content_layout); + toolLayout = viewMain.findViewById(R.id.action_layout); + + //LogUtils.d(TAG, String.format("getWidth() %d", getWidth())); + + addView(viewMain); + + // 创建编辑按钮 + editButton = viewMain.findViewById(R.id.edit_btn); + // 创建删除按钮 + deleteButton = viewMain.findViewById(R.id.delete_btn); + // 向上按钮 + upButton = viewMain.findViewById(R.id.up_btn); + // 向下按钮 + downButton = viewMain.findViewById(R.id.down_btn); + + // 编辑按钮点击事件 + editButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (onActionListener != null) { + onActionListener.onEdit(); + } + } + }); + + // 删除按钮点击事件 + deleteButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (onActionListener != null) { + onActionListener.onDelete(); + } + } + }); + // 编辑按钮点击事件 + upButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (onActionListener != null) { + onActionListener.onUp(); + } + } + }); + + // 删除按钮点击事件 + downButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (onActionListener != null) { + onActionListener.onDown(); + } + } + }); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + LogUtils.d(TAG, "ACTION_DOWN"); + mStartX = event.getX(); +// isScrolling = false; + break; + case MotionEvent.ACTION_MOVE: + //LogUtils.d(TAG, "ACTION_MOVE"); +// float currentX = event.getX(); +// float deltaX = mStartX - currentX; +// //mLastX = currentX; +// if (Math.abs(deltaX) > 0) { +// isScrolling = true; +// } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + if (getScrollX() > 0) { + LogUtils.d(TAG, "ACTION_UP"); + mEndX = event.getX(); + LogUtils.d(TAG, String.format("mStartX %f, mEndX %f", mStartX, mEndX)); + if (mEndX < mStartX) { + LogUtils.d(TAG, String.format("mEndX >= mStartX \ngetScrollX() %d", getScrollX())); + //if (getScrollX() > editButton.getWidth()) { + if (Math.abs(mStartX - mEndX) > editButton.getWidth()) { + smoothScrollToRight(); + } else { + smoothScrollToLeft(); + } + } else { + LogUtils.d(TAG, String.format("mEndX >= mStartX \ngetScrollX() %d", getScrollX())); + //if (getScrollX() > deleteButton.getWidth()) { + if (Math.abs(mEndX - mStartX) > deleteButton.getWidth()) { + smoothScrollToLeft(); + } else { + smoothScrollToRight(); + } + } + } + break; + } + return super.onTouchEvent(event); + } + + void smoothScrollToRight() { + mEndX = 0; + mStartX = 0; + View childView = getChildAt(0); + if (childView != null) { + // 计算需要滑动到最右边的距离 + int scrollToX = childView.getWidth() - getWidth(); + // 确保滑动距离不小于0 + final int scrollToX2 = Math.max(0, scrollToX); + // 平滑滑动到最右边 + post(new Runnable() { + @Override + public void run() { + smoothScrollTo(scrollToX2, 0); + LogUtils.d(TAG, "smoothScrollTo(0, 0);"); + } + }); + LogUtils.d(TAG, "smoothScrollTo(scrollToX, 0);"); + } + } + + void smoothScrollToLeft() { + mEndX = 0; + mStartX = 0; + // 在手指抬起时,使用 post 方法调用 smoothScrollTo(0, 0) + post(new Runnable() { + @Override + public void run() { + smoothScrollTo(0, 0); + LogUtils.d(TAG, "smoothScrollTo(0, 0);"); + } + }); + } + + // 设置文本内容 + public void setText(CharSequence text) { + textView.setText(text); + } + + // 定义回调接口 + public interface OnActionListener { + void onEdit(); + void onDelete(); + void onUp(); + void onDown(); + } + + private OnActionListener onActionListener; + + public void setOnActionListener(OnActionListener listener) { + this.onActionListener = listener; + } +} diff --git a/positions/src/main/res/drawable/recycler_view_border.xml b/positions/src/main/res/drawable/recycler_view_border.xml new file mode 100644 index 0000000..0af4a58 --- /dev/null +++ b/positions/src/main/res/drawable/recycler_view_border.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/positions/src/main/res/layout/fragment_positions.xml b/positions/src/main/res/layout/fragment_positions.xml index 4acf7ec..af9bd81 100644 --- a/positions/src/main/res/layout/fragment_positions.xml +++ b/positions/src/main/res/layout/fragment_positions.xml @@ -9,113 +9,77 @@ + android:layout_height="80dp" + android:padding="10dp" + android:gravity="center_vertical"> - + android:layout_height="match_parent"> - + android:text="Text" + android:id="@+id/txmylocationinfo_tv"/> - - - - - - - - - - - - -