diff --git a/app/src/main/java/com/lsp/view/bean/Post.kt b/app/src/main/java/com/lsp/view/bean/Post.kt index 955aecd..e0bdd14 100644 --- a/app/src/main/java/com/lsp/view/bean/Post.kt +++ b/app/src/main/java/com/lsp/view/bean/Post.kt @@ -10,6 +10,7 @@ open class Post( open val fileUrl:String, open val sampleHeight: Int, open val sampleWidth: Int, + open val tags:String? ): Parcelable { constructor(parcel: Parcel) : this( parcel.readString()!!, @@ -17,7 +18,8 @@ open class Post( parcel.readString()!!, parcel.readString()!!, parcel.readInt(), - parcel.readInt() + parcel.readInt(), + parcel.readString()!! ) override fun describeContents(): Int { @@ -31,6 +33,7 @@ open class Post( dest.writeString(fileUrl) dest.writeInt(sampleHeight) dest.writeInt(sampleWidth) + dest.writeString(tags) } companion object { diff --git a/app/src/main/java/com/lsp/view/bean/YandPost.kt b/app/src/main/java/com/lsp/view/bean/YandPost.kt index fb3e887..08b1426 100644 --- a/app/src/main/java/com/lsp/view/bean/YandPost.kt +++ b/app/src/main/java/com/lsp/view/bean/YandPost.kt @@ -7,8 +7,7 @@ class YandPost( @SerializedName("sample_url") override val sampleUrl: String, @SerializedName("sample_height") override val sampleHeight : Int, @SerializedName("sample_width") override val sampleWidth: Int, - @SerializedName("file_ext") val fileExt: String, - @SerializedName("file_size") val fileSize: String, @SerializedName("id") override val postId: String, - rating: String -):Post(postId, rating, sampleUrl,fileUrl,sampleHeight,sampleWidth) \ No newline at end of file + rating: String, + tags:String? +):Post(postId, rating, sampleUrl,fileUrl,sampleHeight,sampleWidth,tags) \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/repository/datasource/model/Collect.kt b/app/src/main/java/com/lsp/view/repository/datasource/model/Collect.kt index 1b790f2..704f6cd 100644 --- a/app/src/main/java/com/lsp/view/repository/datasource/model/Collect.kt +++ b/app/src/main/java/com/lsp/view/repository/datasource/model/Collect.kt @@ -16,8 +16,9 @@ data class Collect( @ColumnInfo(name = "file_url")override val fileUrl:String, @ColumnInfo(name = "sampleHeight") override val sampleHeight:Int, @ColumnInfo(name = "sampleWeight") override val sampleWidth:Int, - @ColumnInfo(name = "type")val type:String -):Post(postId,rating,sampleUrl,fileUrl,sampleHeight,sampleWidth){ + @ColumnInfo(name = "type")val type:String, + @ColumnInfo(name = "tags") override val tags:String? +):Post(postId,rating,sampleUrl,fileUrl,sampleHeight,sampleWidth,tags){ constructor( postId: String, sampleUrl:String, @@ -25,10 +26,11 @@ data class Collect( fileUrl:String, sampleHeight:Int, sampleWeight:Int, + tags:String? ): this(0, postId, sampleUrl, rating, fileUrl, sampleHeight, sampleWeight, - YandViewApplication.context?.getSharedPreferences("com.lsp.view_preferences",Context.MODE_PRIVATE)?.getString("source_name", "yande.re")!!) + YandViewApplication.context?.getSharedPreferences("com.lsp.view_preferences",Context.MODE_PRIVATE)?.getString("source_name", "yande.re")!!,tags) companion object{ - fun Post.toCollect():Collect = Collect(this.postId,this.sampleUrl,this.rating,this.fileUrl,this.sampleHeight,this.sampleWidth ) + fun Post.toCollect():Collect = Collect(this.postId,this.sampleUrl,this.rating,this.fileUrl,this.sampleHeight,this.sampleWidth ,this.tags) } } diff --git a/app/src/main/java/com/lsp/view/ui/MainViewModel.kt b/app/src/main/java/com/lsp/view/ui/MainViewModel.kt index 4390abd..840f59a 100644 --- a/app/src/main/java/com/lsp/view/ui/MainViewModel.kt +++ b/app/src/main/java/com/lsp/view/ui/MainViewModel.kt @@ -52,6 +52,9 @@ class MainViewModel(private val repository: PostRepository, context: Context):Vi } @Volatile private var isProcessing = false + private val _tagsList = MutableLiveData>() + val tagsList get() = _tagsList as LiveData> + companion object { fun provideFactory( diff --git a/app/src/main/java/com/lsp/view/ui/fragment/CollectFragment.kt b/app/src/main/java/com/lsp/view/ui/fragment/CollectFragment.kt index aff9c04..7765230 100644 --- a/app/src/main/java/com/lsp/view/ui/fragment/CollectFragment.kt +++ b/app/src/main/java/com/lsp/view/ui/fragment/CollectFragment.kt @@ -56,14 +56,7 @@ class CollectFragment : Fragment() { collectAdapter.setOnListItemClick(object : PostAdapter.OnListItemClick { override fun setOnListItemClick(post: Post) { - val bundle = Bundle() - bundle.putParcelable("post",post) - Navigation.findNavController(view).navigate(R.id.action_collectFragment_to_imageFragment,bundle) - val slideOutAnimation = AnimationUtils.loadAnimation(context, - R.anim.slide_out_bottom - ) - activityContext.bottomNav.startAnimation(slideOutAnimation) - activityContext.bottomNav.visibility = View.GONE + ImageFragment.navigationToImageFragment(activityContext,post,view,R.id.action_collectFragment_to_imageFragment) } }) diff --git a/app/src/main/java/com/lsp/view/ui/fragment/ImageFragment.kt b/app/src/main/java/com/lsp/view/ui/fragment/ImageFragment.kt index 34c1ab1..4379277 100644 --- a/app/src/main/java/com/lsp/view/ui/fragment/ImageFragment.kt +++ b/app/src/main/java/com/lsp/view/ui/fragment/ImageFragment.kt @@ -13,9 +13,11 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.view.animation.AnimationUtils import android.widget.ImageView import androidx.core.content.FileProvider import androidx.lifecycle.lifecycleScope +import androidx.navigation.Navigation import com.bumptech.glide.Glide import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.LazyHeaders @@ -74,6 +76,12 @@ class ImageFragment : Fragment() { } true } + R.id.tags_menu_btn -> { + val tagBottomSheet = TagBottomSheet(post?.tags) + tagBottomSheet.show(activityContext.supportFragmentManager,TagBottomSheet.TAG) + + true + } else -> {false} } @@ -114,6 +122,7 @@ class ImageFragment : Fragment() { } + private fun collectIt(collect: Collect){ activityContext.viewModel.addCollect(collect) collectBtn.setIcon(R.drawable.ic_baseline_favorite_24) @@ -201,6 +210,26 @@ class ImageFragment : Fragment() { } + companion object{ + fun navigationToImageFragment(context:MainActivity ,post:Post,view:View,fragmentId:Int){ + val bundle = Bundle() + bundle.putParcelable("post",post) + val tags = post.tags?.split(",")?.toList() + + context.viewModel.tagsList.value?.apply { + clear() + tags?.let { addAll(it) } + } + + Navigation.findNavController(view).navigate(fragmentId,bundle) + val slideOutAnimation = AnimationUtils.loadAnimation(context, + R.anim.slide_out_bottom + ) + context.bottomNav.startAnimation(slideOutAnimation) + context.bottomNav.visibility = View.GONE + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/ui/fragment/PostListFragment.kt b/app/src/main/java/com/lsp/view/ui/fragment/PostListFragment.kt index 6934cef..318d85e 100644 --- a/app/src/main/java/com/lsp/view/ui/fragment/PostListFragment.kt +++ b/app/src/main/java/com/lsp/view/ui/fragment/PostListFragment.kt @@ -87,14 +87,7 @@ class PostListFragment:Fragment() { viewModel.adapter.setOnListItemClick(object : PostAdapter.OnListItemClick { override fun setOnListItemClick(post: Post) { - val bundle = Bundle() - bundle.putParcelable("post",post) - Navigation.findNavController(view).navigate(R.id.action_postListFragment_to_imageFragment,bundle) - val slideOutAnimation = AnimationUtils.loadAnimation(context, - R.anim.slide_out_bottom - ) - activityContext.bottomNav.startAnimation(slideOutAnimation) - activityContext.bottomNav.visibility = View.GONE + ImageFragment.navigationToImageFragment(activityContext,post,view,R.id.action_postListFragment_to_imageFragment) } }) diff --git a/app/src/main/java/com/lsp/view/ui/fragment/TagBottomSheet.kt b/app/src/main/java/com/lsp/view/ui/fragment/TagBottomSheet.kt new file mode 100644 index 0000000..2a3a463 --- /dev/null +++ b/app/src/main/java/com/lsp/view/ui/fragment/TagBottomSheet.kt @@ -0,0 +1,49 @@ +package com.lsp.view.ui.fragment + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.lsp.view.R +import com.lsp.view.ui.activity.MainActivity +import com.lsp.view.ui.fragment.adapter.TagsAdapter + +class TagBottomSheet(val tags:String?): BottomSheetDialogFragment() { + private val activityContext : MainActivity by lazy { + requireActivity() as MainActivity + } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_bottom_sheet, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val tagList = view.findViewById(R.id.tag_list) +// val layoutManager = LinearLayoutManager(activityContext) + val flManager = FlexboxLayoutManager(activityContext) + flManager.flexWrap = FlexWrap.WRAP + flManager.flexDirection = FlexDirection.ROW + + Log.e(TAG,tags.toString()) + val split = tags?.split(" ")?.toList() + if (split!=null){ + val adapter = TagsAdapter(split) + tagList.layoutManager = flManager + tagList.adapter = adapter + } + + } + companion object { + const val TAG = "TagBottomSheet" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lsp/view/ui/fragment/adapter/PostAdapter.kt b/app/src/main/java/com/lsp/view/ui/fragment/adapter/PostAdapter.kt index bea93f1..c7f0a0f 100644 --- a/app/src/main/java/com/lsp/view/ui/fragment/adapter/PostAdapter.kt +++ b/app/src/main/java/com/lsp/view/ui/fragment/adapter/PostAdapter.kt @@ -18,7 +18,6 @@ class PostAdapter(val context: Context,private val postList: ArrayList = A RecyclerView.Adapter() { val TAG = this::class.java.simpleName private var inBottom:Boolean = false//当前列表是否在底部 - @Volatile private var isProcess:Boolean = false inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val picImage: ImageView = view.findViewById(R.id.image) @@ -26,24 +25,20 @@ class PostAdapter(val context: Context,private val postList: ArrayList = A } fun pushNewData(list: List) { - if (!isProcess) { - isProcess = true - if (inBottom) { - //在底部,则追加数据 - val pos = postList.size - postList.addAll(list) - notifyItemRangeInserted(pos - 1, list.size) - } else { - //不在则刷新数据 - val oldSize = postList.size - postList.clear() - notifyItemRangeRemoved(0, oldSize) - postList.addAll(list) - notifyItemRangeInserted(0, list.size) - } + if (inBottom) { + //在底部,则追加数据 + val pos = postList.size + postList.addAll(list) + notifyItemRangeInserted(pos - 1, list.size) + } else { + //不在则刷新数据 + val oldSize = postList.size + postList.clear() + notifyItemRangeRemoved(0, oldSize) + postList.addAll(list) + notifyItemRangeInserted(0, list.size) } - isProcess = false inBottom = false//加入新数据后不在底部,若仍在底部说明无更多数据,也不必处理 } diff --git a/app/src/main/java/com/lsp/view/ui/fragment/adapter/TagsAdapter.kt b/app/src/main/java/com/lsp/view/ui/fragment/adapter/TagsAdapter.kt new file mode 100644 index 0000000..7bdd13e --- /dev/null +++ b/app/src/main/java/com/lsp/view/ui/fragment/adapter/TagsAdapter.kt @@ -0,0 +1,28 @@ +package com.lsp.view.ui.fragment.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.lsp.view.R + +class TagsAdapter(private val tagList:List):RecyclerView.Adapter() { + inner class ViewHolder(view:View):RecyclerView.ViewHolder(view) { + val tagItem = view.findViewById(R.id.tag) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = + LayoutInflater.from(parent.context).inflate(R.layout.tags_item_layout, parent, false) + val viewHolder = ViewHolder(view) + + return viewHolder + } + + override fun getItemCount() = tagList.size + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.tagItem.text = tagList[position] + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_label_24.xml b/app/src/main/res/drawable/ic_baseline_label_24.xml new file mode 100644 index 0000000..77c818d --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_label_24.xml @@ -0,0 +1,6 @@ + + + diff --git a/app/src/main/res/layout/fragment_bottom_sheet.xml b/app/src/main/res/layout/fragment_bottom_sheet.xml new file mode 100644 index 0000000..7e00c3c --- /dev/null +++ b/app/src/main/res/layout/fragment_bottom_sheet.xml @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_image.xml b/app/src/main/res/layout/fragment_image.xml index a9ab0f0..e8937ab 100644 --- a/app/src/main/res/layout/fragment_image.xml +++ b/app/src/main/res/layout/fragment_image.xml @@ -14,8 +14,6 @@ android:id="@+id/image_content" android:layout_width="match_parent" android:layout_height="match_parent"/> - - + diff --git a/app/src/main/res/layout/tags_item_layout.xml b/app/src/main/res/layout/tags_item_layout.xml new file mode 100644 index 0000000..b28b0ac --- /dev/null +++ b/app/src/main/res/layout/tags_item_layout.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/image_bottom_menu.xml b/app/src/main/res/menu/image_bottom_menu.xml index 25f4939..66df53b 100644 --- a/app/src/main/res/menu/image_bottom_menu.xml +++ b/app/src/main/res/menu/image_bottom_menu.xml @@ -10,5 +10,10 @@ android:title="@string/title_collect" android:icon="@drawable/ic_baseline_favorite_24" app:showAsAction="ifRoom"/> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0a7d39f..66e0254 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,4 +28,5 @@ Start download Share Collect + Tags \ No newline at end of file