diff --git a/app/src/main/java/com/huanchengfly/tieba/post/Extensions.kt b/app/src/main/java/com/huanchengfly/tieba/post/Extensions.kt index f51aa405..e0c0dabe 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/Extensions.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/Extensions.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.content.res.ColorStateList +import android.content.res.Configuration import android.view.View import android.view.ViewGroup import android.widget.Toast @@ -89,4 +90,10 @@ fun ViewGroup.enableChangingLayoutTransition() { fun View.getLocationInWindow(): IntArray { return IntArray(2).apply { getLocationInWindow(this) } -} \ No newline at end of file +} + +val Configuration.isPortrait: Boolean + get() = orientation == Configuration.ORIENTATION_PORTRAIT + +val Configuration.isLandscape: Boolean + get() = orientation == Configuration.ORIENTATION_LANDSCAPE \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/BaseActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/BaseActivity.kt index da56a236..a28c2066 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/BaseActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/BaseActivity.kt @@ -6,6 +6,7 @@ import android.app.Activity import android.app.Dialog import android.content.Context import android.content.res.ColorStateList +import android.content.res.Configuration import android.content.res.Resources import android.graphics.Color import android.os.Bundle @@ -112,6 +113,11 @@ abstract class BaseActivity : SwipeBackActivity(), ExtraRefreshable, CoroutineSc } } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + getDeviceDensity() + } + private fun fixBackground() { val decor = window.decorView as ViewGroup val decorChild = decor.getChildAt(0) as ViewGroup diff --git a/app/src/main/java/com/huanchengfly/tieba/post/adapters/MainForumListAdapter.kt b/app/src/main/java/com/huanchengfly/tieba/post/adapters/MainForumListAdapter.kt index 6082157f..17f039e7 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/adapters/MainForumListAdapter.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/adapters/MainForumListAdapter.kt @@ -54,14 +54,14 @@ class MainForumListAdapter( viewHolder.itemView.backgroundTintList = ColorStateListUtils.createColorStateList(context, R.color.default_color_card) } } - //双列左 + //多列第一个 position % spanCount == 0 -> { viewHolder.itemView.backgroundTintList = ColorStateListUtils.createColorStateList(context, R.color.default_color_card) viewHolder.itemView.background = wrapRipple( Util.getColorByAttr(context, R.attr.colorControlHighlight, R.color.transparent), when (position) { //最后一行,左 - getCount() - 2 -> getRadiusDrawable(bottomLeftPx = cardRadius) + getCount() - spanCount -> getRadiusDrawable(bottomLeftPx = cardRadius) //最后一项 getCount() - 1 -> getRadiusDrawable(bottomLeftPx = cardRadius, bottomRightPx = cardRadius) //其他 @@ -69,7 +69,7 @@ class MainForumListAdapter( } ) } - //双列右 + //多列右 else -> { viewHolder.itemView.backgroundTintList = ColorStateListUtils.createColorStateList(context, R.color.default_color_card) viewHolder.itemView.background = wrapRipple( diff --git a/app/src/main/java/com/huanchengfly/tieba/post/adapters/PersonalizedFeedAdapter.java b/app/src/main/java/com/huanchengfly/tieba/post/adapters/PersonalizedFeedAdapter.java index d8ede4f5..dea2a93c 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/adapters/PersonalizedFeedAdapter.java +++ b/app/src/main/java/com/huanchengfly/tieba/post/adapters/PersonalizedFeedAdapter.java @@ -13,6 +13,7 @@ import androidx.gridlayout.widget.GridLayout; import com.bumptech.glide.Glide; import com.huanchengfly.tieba.post.BaseApplication; +import com.huanchengfly.tieba.post.ExtensionsKt; import com.huanchengfly.tieba.post.R; import com.huanchengfly.tieba.post.api.models.ForumPageBean; import com.huanchengfly.tieba.post.api.models.PersonalizedBean; @@ -69,11 +70,19 @@ public class PersonalizedFeedAdapter extends MultiBaseAdapter @JvmOverloads constructor( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder = MyViewHolder(context, getItemLayoutId(viewType)) override fun onBindViewHolder(holder: MyViewHolder, position: Int) { - holder.setItemOnClickListener(View.OnClickListener { + holder.setItemOnClickListener { onItemClickListener?.onClick(holder, getItem(position), position) - }) - holder.setItemOnLongClickListener(View.OnLongClickListener { + } + holder.setItemOnLongClickListener { onItemLongClickListener?.onLongClick(holder, getItem(position), position) ?: false - }) + } convert(holder, getItem(position), position, getItemViewType(position)) } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/adapters/forum/NewForumAdapter.java b/app/src/main/java/com/huanchengfly/tieba/post/adapters/forum/NewForumAdapter.java index f8fc678a..85b7809f 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/adapters/forum/NewForumAdapter.java +++ b/app/src/main/java/com/huanchengfly/tieba/post/adapters/forum/NewForumAdapter.java @@ -1,5 +1,7 @@ package com.huanchengfly.tieba.post.adapters.forum; +import static com.huanchengfly.tieba.post.activities.PhotoViewActivity.OBJ_TYPE_FORUM_PAGE; + import android.content.Context; import android.content.Intent; import android.text.TextUtils; @@ -13,7 +15,9 @@ import androidx.annotation.NonNull; import androidx.cardview.widget.CardView; import androidx.gridlayout.widget.GridLayout; +import com.alibaba.android.vlayout.LayoutHelper; import com.alibaba.android.vlayout.layout.LinearLayoutHelper; +import com.alibaba.android.vlayout.layout.StaggeredGridLayoutHelper; import com.bumptech.glide.Glide; import com.huanchengfly.tieba.post.BaseApplication; import com.huanchengfly.tieba.post.R; @@ -43,8 +47,6 @@ import java.util.Objects; import cn.jzvd.Jzvd; -import static com.huanchengfly.tieba.post.activities.PhotoViewActivity.OBJ_TYPE_FORUM_PAGE; - public class NewForumAdapter extends BaseMultiTypeDelegateAdapter { public static final String TAG = NewForumAdapter.class.getSimpleName(); public static final int TYPE_THREAD_COMMON = 11; @@ -55,6 +57,16 @@ public class NewForumAdapter extends BaseMultiTypeDelegateAdapter userBeanMap; private List ids; + @NonNull + @Override + public LayoutHelper onCreateLayoutHelper() { + if (getContext().getResources().getBoolean(R.bool.is_tablet)) { + return new StaggeredGridLayoutHelper(2); + } else { + return new LinearLayoutHelper(); + } + } + public NewForumAdapter(Context context) { super(context, new LinearLayoutHelper()); ids = new ArrayList<>(); @@ -73,11 +85,19 @@ public class NewForumAdapter extends BaseMultiTypeDelegateAdapter { + 1 + } + resources.getBoolean(R.bool.is_tablet) -> { + 3 + } + else -> { + 2 + } } private fun toggleTopForum(forumId: String) { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/PersonalizedFeedFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/PersonalizedFeedFragment.kt index 8964515c..cef696d0 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/PersonalizedFeedFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/PersonalizedFeedFragment.kt @@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.fragments import android.animation.Animator import android.animation.AnimatorListenerAdapter +import android.content.res.Configuration import android.os.Bundle import android.view.MenuItem import android.view.View @@ -10,6 +11,7 @@ import android.widget.Toast import androidx.appcompat.widget.Toolbar import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener +import androidx.recyclerview.widget.StaggeredGridLayoutManager import butterknife.BindView import cn.jzvd.Jzvd import com.bumptech.glide.Glide @@ -22,8 +24,11 @@ import com.huanchengfly.tieba.post.api.models.PersonalizedBean import com.huanchengfly.tieba.post.api.retrofit.exception.TiebaException import com.huanchengfly.tieba.post.components.MyLinearLayoutManager import com.huanchengfly.tieba.post.components.dividers.FeedDivider +import com.huanchengfly.tieba.post.components.dividers.StaggeredDividerItemDecoration import com.huanchengfly.tieba.post.goToActivity import com.huanchengfly.tieba.post.interfaces.Refreshable +import com.huanchengfly.tieba.post.isLandscape +import com.huanchengfly.tieba.post.isPortrait import com.huanchengfly.tieba.post.utils.* import com.huanchengfly.tieba.post.widgets.ShadowLayout import com.huanchengfly.tieba.post.widgets.VideoPlayerStandard @@ -65,7 +70,7 @@ class PersonalizedFeedFragment : BaseFragment(), PersonalizedFeedAdapter.OnRefre override fun hasOwnAppbar(): Boolean = true - public override fun getLayoutId(): Int = R.layout.fragment_personalized_feed + override fun getLayoutId(): Int = R.layout.fragment_personalized_feed override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -84,7 +89,6 @@ class PersonalizedFeedFragment : BaseFragment(), PersonalizedFeedAdapter.OnRefre onRefreshListener = this@PersonalizedFeedFragment } recyclerView.apply { - addItemDecoration(FeedDivider(attachContext)) if (!appPreferences.loadPictureWhenScroll) { addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { @@ -105,20 +109,51 @@ class PersonalizedFeedFragment : BaseFragment(), PersonalizedFeedAdapter.OnRefre addOnChildAttachStateChangeListener(object : OnChildAttachStateChangeListener { override fun onChildViewAttachedToWindow(view: View) {} override fun onChildViewDetachedFromWindow(view: View) { - val videoPlayerStandard: VideoPlayerStandard? = view.findViewById(R.id.forum_item_content_video) + val videoPlayerStandard: VideoPlayerStandard? = + view.findViewById(R.id.forum_item_content_video) if (videoPlayerStandard != null && Jzvd.CURRENT_JZVD != null && - videoPlayerStandard.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.currentUrl)) { + videoPlayerStandard.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.currentUrl) + ) { if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) { Jzvd.releaseAllVideos() } } } }) - layoutManager = MyLinearLayoutManager(attachContext) + layoutManager = if (!isTablet) { + addItemDecoration(FeedDivider(attachContext)) + MyLinearLayoutManager(attachContext) + } else { + addItemDecoration(StaggeredDividerItemDecoration(attachContext, 12)) + StaggeredGridLayoutManager(getSpanCount(), StaggeredGridLayoutManager.VERTICAL) + } adapter = this@PersonalizedFeedFragment.adapter } } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + if (recyclerView.layoutManager is StaggeredGridLayoutManager) { + (recyclerView.layoutManager as StaggeredGridLayoutManager).spanCount = + getSpanCount(newConfig) + } + } + + private fun getSpanCount(configuration: Configuration = attachContext.resources.configuration): Int { + return when { + isTablet && configuration.isPortrait -> { + 2 + } + isTablet && configuration.isLandscape -> { + 3 + } + else -> { + 1 + } + } + } + + fun refresh() { page = 1 TiebaApi.getInstance().personalized(1, page).enqueue(object : Callback { diff --git a/app/src/main/res/values-sw600dp/booleans.xml b/app/src/main/res/values-sw600dp/booleans.xml new file mode 100644 index 00000000..b9786656 --- /dev/null +++ b/app/src/main/res/values-sw600dp/booleans.xml @@ -0,0 +1,3 @@ + + true + \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/styles.xml b/app/src/main/res/values-sw600dp/styles.xml new file mode 100644 index 00000000..20faf8e5 --- /dev/null +++ b/app/src/main/res/values-sw600dp/styles.xml @@ -0,0 +1,21 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/booleans.xml b/app/src/main/res/values/booleans.xml new file mode 100644 index 00000000..0a99eb02 --- /dev/null +++ b/app/src/main/res/values/booleans.xml @@ -0,0 +1,3 @@ + + false + \ No newline at end of file