From 83f232274ad9ea291b1ad6ef2fb376bfe44a1155 Mon Sep 17 00:00:00 2001 From: niushuai233 Date: Fri, 12 Apr 2024 15:05:52 +0800 Subject: [PATCH] feat: :wrench: project --- .../niushuai/dididone/biz/dao/ProjectDao.java | 7 +- .../niushuai/dididone/biz/vo/ProjectIcon.java | 50 +++++++++ .../project/GridViewAdapter4Project.java | 58 ++++++++++ .../ui/setting/project/ProjectFragment.java | 103 ++++++++++++++++++ .../java/cc/niushuai/dididone/util/XLog.java | 45 ++++++++ app/src/main/res/layout/fragment_project.xml | 15 ++- app/src/main/res/layout/project_grid_item.xml | 30 +++++ 7 files changed, 301 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/cc/niushuai/dididone/biz/vo/ProjectIcon.java create mode 100644 app/src/main/java/cc/niushuai/dididone/ui/setting/project/GridViewAdapter4Project.java create mode 100644 app/src/main/java/cc/niushuai/dididone/util/XLog.java create mode 100644 app/src/main/res/layout/project_grid_item.xml diff --git a/app/src/main/java/cc/niushuai/dididone/biz/dao/ProjectDao.java b/app/src/main/java/cc/niushuai/dididone/biz/dao/ProjectDao.java index 4e2500a..c45a9e8 100644 --- a/app/src/main/java/cc/niushuai/dididone/biz/dao/ProjectDao.java +++ b/app/src/main/java/cc/niushuai/dididone/biz/dao/ProjectDao.java @@ -26,9 +26,12 @@ public interface ProjectDao { @Insert Completable insertAll(Project... projects); + @Query("update t_project set deleted = 1 where id = :id") + void deleteById(Long id); + @Delete - void delete(Project project); + void physicsDelete(Project project); @Query("delete from t_project where id = :id") - void deleteById(Long id); + void physicsDeleteById(Long id); } diff --git a/app/src/main/java/cc/niushuai/dididone/biz/vo/ProjectIcon.java b/app/src/main/java/cc/niushuai/dididone/biz/vo/ProjectIcon.java new file mode 100644 index 0000000..8e75bba --- /dev/null +++ b/app/src/main/java/cc/niushuai/dididone/biz/vo/ProjectIcon.java @@ -0,0 +1,50 @@ +package cc.niushuai.dididone.biz.vo; + +import cc.niushuai.dididone.util.Snowflake; + +public class ProjectIcon { + + private Long id = Snowflake.next_id(); + private String projectName; + private String icon; + private String color; + + public ProjectIcon(Long id, String projectName, String icon, String color) { + this.id = id; + this.projectName = projectName; + this.icon = icon; + this.color = color; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } +} diff --git a/app/src/main/java/cc/niushuai/dididone/ui/setting/project/GridViewAdapter4Project.java b/app/src/main/java/cc/niushuai/dididone/ui/setting/project/GridViewAdapter4Project.java new file mode 100644 index 0000000..9bf12f1 --- /dev/null +++ b/app/src/main/java/cc/niushuai/dididone/ui/setting/project/GridViewAdapter4Project.java @@ -0,0 +1,58 @@ +package cc.niushuai.dididone.ui.setting.project; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.mikepenz.iconics.IconicsDrawable; + +import java.util.List; + +import cc.niushuai.dididone.R; +import cc.niushuai.dididone.biz.vo.ProjectIcon; + +public class GridViewAdapter4Project extends BaseAdapter { + + private Context context; + protected List projectIconList; + public GridViewAdapter4Project(Context context, List projectIconList) { + this.context = context; + this.projectIconList = projectIconList; + } + + @Override + public int getCount() { + return projectIconList.size(); + } + + @Override + public ProjectIcon getItem(int position) { + return projectIconList.get(position); + } + + @Override + public long getItemId(int position) { + return getItem(position).getId(); + } + + @Override + public View getView(int position, View view, ViewGroup parent) { + + ProjectIcon iconData = projectIconList.get(position); + + if (view == null) { + view = LayoutInflater.from(context).inflate(R.layout.project_grid_item, parent, false); + } + ImageView icon = view.findViewById(R.id.grid_project_item_icon); + icon.setImageDrawable(new IconicsDrawable(context).icon(iconData.getIcon()).color(Integer.parseInt(iconData.getColor())).sizeDp(50)); + + TextView txt = view.findViewById(R.id.grid_project_item_txt); + txt.setText(iconData.getProjectName()); + + return view; + } +} diff --git a/app/src/main/java/cc/niushuai/dididone/ui/setting/project/ProjectFragment.java b/app/src/main/java/cc/niushuai/dididone/ui/setting/project/ProjectFragment.java index 62f753d..50208ac 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/setting/project/ProjectFragment.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/setting/project/ProjectFragment.java @@ -1,20 +1,35 @@ package cc.niushuai.dididone.ui.setting.project; +import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; +import com.mikepenz.iconics.IconicsDrawable; +import com.mikepenz.ionicons_typeface_library.Ionicons; + +import java.util.ArrayList; +import java.util.List; + +import cc.niushuai.dididone.biz.roomx.DBManager; +import cc.niushuai.dididone.biz.vo.ProjectIcon; import cc.niushuai.dididone.databinding.FragmentProjectBinding; import cc.niushuai.dididone.ui.base.InitAndSetListener; +import cc.niushuai.dididone.util.Toasts; +import cc.niushuai.dididone.util.XLog; +import cn.hutool.core.util.StrUtil; public class ProjectFragment extends Fragment implements InitAndSetListener { private FragmentProjectBinding binding; + private GridViewAdapter4Project gridViewAdapter4Project; @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -34,6 +49,25 @@ public class ProjectFragment extends Fragment implements InitAndSetListener { @Override public void init() { + initProjectGrid(); + } + + private void initProjectGrid() { + gridViewAdapter4Project = new GridViewAdapter4Project(getContext(), getDataList()); + binding.gridProject.setAdapter(gridViewAdapter4Project); + } + + private List getDataList() { + ArrayList list = new ArrayList<>(); + + + // 最后一个要添加 + 符号 + list.add(defaultAddProject()); + return list; + } + + private ProjectIcon defaultAddProject() { + return new ProjectIcon(0L, "添加", "faw_plus", String.valueOf(Color.BLACK)); } /** @@ -42,5 +76,74 @@ public class ProjectFragment extends Fragment implements InitAndSetListener { @Override public void setListeners() { + // 添加点击事件 + this.addGridItemClickListener(); + } + + private void addGridItemClickListener() { + + binding.gridProject.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + if (id == 0) { + addProjectClick(); + return; + } + + // 其他的被点击 + ProjectIcon item = gridViewAdapter4Project.getItem(position); + Toasts.shortShow(getContext(), item.getProjectName()); + } + }); + + + // 长按事件 用于删除 + binding.gridProject.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + + if (id == 0) { + // 添加被点击 跳过 + return false; + } + + ProjectIcon item = gridViewAdapter4Project.getItem(position); + + AlertDialog alertDialog = new AlertDialog.Builder(getContext()) + .setTitle(StrUtil.format("确定要删除 [{}]", item.getProjectName())) + .setIcon(new IconicsDrawable(getContext()).icon(Ionicons.Icon.ion_android_warning).color(Color.RED)) + .setPositiveButton("确定", (dialog, which) -> { + // 删除 + deleteProject(item); + // 更新视图 + gridViewAdapter4Project.projectIconList.remove(position); + gridViewAdapter4Project.notifyDataSetChanged(); + }) + .setNegativeButton("取消", ((dialog, which) -> dialog.dismiss())) + .create(); + alertDialog.show(); + + return true; + } + }); + } + + /** + * 删除该项内容 + * + * @param item + */ + private void deleteProject(ProjectIcon item) { + // 删除 + DBManager.INSTANCE.projectDao().deleteById(item.getId()); + XLog.d("删除项{}, id: {}", item.getProjectName(), item.getId()); + } + + /** + * 添加 被点击 + */ + private void addProjectClick() { + } } diff --git a/app/src/main/java/cc/niushuai/dididone/util/XLog.java b/app/src/main/java/cc/niushuai/dididone/util/XLog.java new file mode 100644 index 0000000..8fc0659 --- /dev/null +++ b/app/src/main/java/cc/niushuai/dididone/util/XLog.java @@ -0,0 +1,45 @@ +package cc.niushuai.dididone.util; + +import android.util.Log; + +import cn.hutool.core.util.StrUtil; + +public class XLog { + private static final String LOG_TAG = "DaringDone"; + + private XLog() { + } + + private static void log(int priority, String message, Object... args) { + + message = StrUtil.format(message, args); + + if (args.length > 0 && args[args.length - 1] instanceof Throwable) { + Throwable throwable = (Throwable) args[args.length - 1]; + String stacktraceStr = Log.getStackTraceString(throwable); + message += '\n' + stacktraceStr; + } + + Log.println(priority, LOG_TAG, message); + } + + public static void v(String message, Object... args) { + log(Log.VERBOSE, message, args); + } + + public static void d(String message, Object... args) { + log(Log.DEBUG, message, args); + } + + public static void i(String message, Object... args) { + log(Log.INFO, message, args); + } + + public static void w(String message, Object... args) { + log(Log.WARN, message, args); + } + + public static void e(String message, Object... args) { + log(Log.ERROR, message, args); + } +} diff --git a/app/src/main/res/layout/fragment_project.xml b/app/src/main/res/layout/fragment_project.xml index 417f4f4..4aa1e08 100644 --- a/app/src/main/res/layout/fragment_project.xml +++ b/app/src/main/res/layout/fragment_project.xml @@ -1,5 +1,5 @@ - - + android:numColumns="3" + android:padding="5dp" + android:horizontalSpacing="10dp" + android:verticalSpacing="10dp" + > - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/project_grid_item.xml b/app/src/main/res/layout/project_grid_item.xml new file mode 100644 index 0000000..692e93c --- /dev/null +++ b/app/src/main/res/layout/project_grid_item.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file