From 38d14d89d4ed04a46166d937dda1a84881555444 Mon Sep 17 00:00:00 2001 From: HuanChengFly <609486518@qq.com> Date: Mon, 5 Oct 2020 21:02:14 +0800 Subject: [PATCH] =?UTF-8?q?pref:=20=E4=BF=AE=E6=94=B9=E5=90=A7=E5=86=85?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/activities/SearchPostActivity.kt | 226 +++++++++--------- .../tieba/post/adapters/SearchPostAdapter.kt | 99 ++++---- .../tieba/post/api/models/SearchPostBean.kt | 2 - .../main/res/layout/activity_search_post.xml | 79 ++++-- app/src/main/res/layout/item_search_posts.xml | 58 +++++ 5 files changed, 283 insertions(+), 181 deletions(-) create mode 100644 app/src/main/res/layout/item_search_posts.xml diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt index aedda536..a86cf628 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt @@ -1,139 +1,131 @@ -package com.huanchengfly.tieba.post.activities; +package com.huanchengfly.tieba.post.activities -import android.content.Intent; -import android.graphics.Color; -import android.os.Bundle; -import android.view.ViewGroup; +import android.graphics.Color +import android.os.Bundle +import android.view.ViewGroup +import android.view.inputmethod.EditorInfo +import android.widget.EditText +import androidx.recyclerview.widget.RecyclerView +import butterknife.BindView +import com.google.android.material.textfield.TextInputLayout +import com.huanchengfly.tieba.post.R +import com.huanchengfly.tieba.post.adapters.SearchPostAdapter +import com.huanchengfly.tieba.post.api.TiebaApi.getInstance +import com.huanchengfly.tieba.post.api.models.SearchPostBean +import com.huanchengfly.tieba.post.components.MyLinearLayoutManager +import com.huanchengfly.tieba.post.components.dividers.SpacesItemDecoration +import com.huanchengfly.tieba.post.dpToPx +import com.huanchengfly.tieba.post.utils.ThemeUtil +import com.huanchengfly.tieba.post.utils.Util +import com.scwang.smart.refresh.layout.SmartRefreshLayout +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +class SearchPostActivity : BaseActivity() { + @BindView(R.id.search_post_refresh_layout) + lateinit var refreshLayout: SmartRefreshLayout -import com.huanchengfly.tieba.post.api.TiebaApi; -import com.huanchengfly.tieba.post.api.models.SearchPostBean; -import com.huanchengfly.tieba.post.R; -import com.huanchengfly.tieba.post.adapters.SearchPostAdapter; -import com.huanchengfly.tieba.post.components.MyLinearLayoutManager; -import com.huanchengfly.tieba.post.components.dividers.RecycleViewDivider; -import com.huanchengfly.tieba.post.utils.ThemeUtil; -import com.huanchengfly.tieba.post.utils.Util; -import com.lapism.searchview.Search; -import com.lapism.searchview.widget.SearchView; + @BindView(R.id.search_post_recycler_view) + lateinit var recyclerView: RecyclerView -import org.jetbrains.annotations.NotNull; + @BindView(R.id.search_bar) + lateinit var searchBar: TextInputLayout -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; + @BindView(R.id.search_edit_text) + lateinit var editText: EditText -public class SearchPostActivity extends BaseActivity implements Search.OnQueryTextListener { - public static final String TAG = SearchPostActivity.class.getSimpleName(); - public static final String PARAM_FORUM = "forum_name"; - public static final String PARAM_KEYWORD = "keyword"; - private SwipeRefreshLayout refreshLayout; - private RecyclerView recyclerView; - private SearchPostAdapter searchPostAdapter; - private String forumName; - private String keyword; - private int page; - private SearchView searchView; + lateinit var searchPostAdapter: SearchPostAdapter + private var forumName: String? = null + private var keyword: String? = null + set(value) { + field = value + if (value != null) refreshLayout.autoRefresh() + } + private var page = 1 - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_search_post); - ThemeUtil.setTranslucentThemeBackground(findViewById(R.id.background)); - Util.setStatusBarTransparent(this); - getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - getWindow().getDecorView().setBackgroundColor(Color.TRANSPARENT); - getWindow().setBackgroundDrawableResource(R.drawable.bg_trans); - Intent intent = getIntent(); - forumName = intent.getStringExtra(PARAM_FORUM); + override fun getLayoutId(): Int = R.layout.activity_search_post + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + ThemeUtil.setTranslucentThemeBackground(findViewById(R.id.background)) + Util.setStatusBarTransparent(this) + window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + window.decorView.setBackgroundColor(Color.TRANSPARENT) + window.setBackgroundDrawableResource(R.drawable.bg_trans) + val intent = intent + forumName = intent.getStringExtra(PARAM_FORUM) if (forumName == null) { - finish(); + finish() } - findView(); - initView(); - keyword = intent.getStringExtra(PARAM_KEYWORD); + initView() + keyword = intent.getStringExtra(PARAM_KEYWORD) if (keyword != null) { - searchView.setText(keyword); - refresh(); + editText.setText(keyword) } } - private void findView() { - searchView = (SearchView) findViewById(R.id.toolbar_search_view); - refreshLayout = (SwipeRefreshLayout) findViewById(R.id.search_post_refresh_layout); - recyclerView = (RecyclerView) findViewById(R.id.search_post_recycler_view); - } - - private void initView() { - ThemeUtil.setThemeForSwipeRefreshLayout(refreshLayout); - searchPostAdapter = new SearchPostAdapter(this); - searchPostAdapter.setLoadingView(R.layout.layout_footer_loading); - searchPostAdapter.setLoadEndView(R.layout.layout_footer_loadend); - searchPostAdapter.setLoadFailedView(R.layout.layout_footer_load_failed); - searchPostAdapter.setOnLoadMoreListener(this::loadMore); - recyclerView.setLayoutManager(new MyLinearLayoutManager(this)); - recyclerView.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.VERTICAL, R.drawable.drawable_divider_8dp)); - recyclerView.setAdapter(searchPostAdapter); - refreshLayout.setOnRefreshListener(this::refresh); - searchView.setHint(getString(R.string.hint_search_in_ba, forumName)); - searchView.setOnQueryTextListener(this); - searchView.setOnLogoClickListener(this::finish); - } - - public void refresh() { - refreshLayout.setRefreshing(true); - page = 1; - TiebaApi.getInstance().searchPost(keyword, forumName, false, page, 30).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) { - SearchPostBean data = response.body(); - if (!"1".equals(data.getPage().getHasMore())) { - searchPostAdapter.loadEnd(); - } - searchPostAdapter.setNewData(data.getPostList()); - refreshLayout.setRefreshing(false); - } - - @Override - public void onFailure(@NotNull Call call, @NotNull Throwable t) { - searchPostAdapter.loadFailed(); - refreshLayout.setRefreshing(false); - } - }); - } - - public void loadMore(boolean isReload) { - if (!isReload) { - page += 1; + private fun initView() { + refreshLayout.apply { + ThemeUtil.setThemeForSmartRefreshLayout(this) + setOnLoadMoreListener { loadMore() } + setOnRefreshListener { refresh() } } - TiebaApi.getInstance().searchPost(keyword, forumName, false, page, 30).enqueue(new Callback() { - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) { - SearchPostBean data = response.body(); - if (!"1".equals(data.getPage().getHasMore())) { - searchPostAdapter.loadEnd(); - } - searchPostAdapter.setLoadMoreData(data.getPostList()); + searchPostAdapter = SearchPostAdapter(this) + searchPostAdapter.setOnItemClickListener { _, item, _ -> + ThreadActivity.launch(this, item.tid!!, item.pid) + } + recyclerView.apply { + layoutManager = MyLinearLayoutManager(this@SearchPostActivity) + addItemDecoration(SpacesItemDecoration(0, 0, 0, 8.dpToPx())) + adapter = searchPostAdapter + } + searchBar.setStartIconOnClickListener { finish() } + editText.setOnEditorActionListener { v, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + keyword = v.text.toString() + return@setOnEditorActionListener true + } + return@setOnEditorActionListener false + } + editText.hint = getString(R.string.hint_search_in_ba, forumName) + } + + fun refresh() { + page = 1 + getInstance().searchPost(keyword!!, forumName!!, false, page, 30).enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + val data = response.body() + searchPostAdapter.setData(data!!.postList) + refreshLayout.finishRefresh() + refreshLayout.setNoMoreData("1" != data.page!!.hasMore) } - @Override - public void onFailure(@NotNull Call call, @NotNull Throwable t) { - searchPostAdapter.loadFailed(); + override fun onFailure(call: Call, t: Throwable) { + refreshLayout.finishRefresh(false) } - }); + }) } - @Override - public boolean onQueryTextSubmit(CharSequence query) { - keyword = query.toString(); - refresh(); - return true; + private fun loadMore() { + getInstance().searchPost(keyword!!, forumName!!, false, page + 1, 30).enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + val data = response.body() + page += 1 + data!!.postList?.let { searchPostAdapter.insert(it) } + refreshLayout.finishLoadMore() + refreshLayout.setNoMoreData("1" != data.page!!.hasMore) + } + + override fun onFailure(call: Call, t: Throwable) { + refreshLayout.finishLoadMore(false) + } + }) } - @Override - public void onQueryTextChange(CharSequence newText) { + companion object { + val TAG = SearchPostActivity::class.java.simpleName + const val PARAM_FORUM = "forum_name" + const val PARAM_KEYWORD = "keyword" } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/adapters/SearchPostAdapter.kt b/app/src/main/java/com/huanchengfly/tieba/post/adapters/SearchPostAdapter.kt index a4bb5f79..fcccb6ea 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/adapters/SearchPostAdapter.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/adapters/SearchPostAdapter.kt @@ -1,50 +1,63 @@ -package com.huanchengfly.tieba.post.adapters; +package com.huanchengfly.tieba.post.adapters -import android.content.Context; -import android.widget.TextView; +import android.content.Context +import android.graphics.Color +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.core.text.HtmlCompat +import com.huanchengfly.tieba.post.R +import com.huanchengfly.tieba.post.adapters.base.BaseSingleTypeAdapter +import com.huanchengfly.tieba.post.api.models.SearchPostBean +import com.huanchengfly.tieba.post.components.MyViewHolder +import com.huanchengfly.tieba.post.ui.theme.utils.ThemeUtils +import com.huanchengfly.tieba.post.utils.TimeUtils.getRelativeTimeString -import androidx.core.text.HtmlCompat; - -import com.huanchengfly.tieba.post.R; -import com.huanchengfly.tieba.post.api.models.SearchPostBean; -import com.huanchengfly.tieba.post.utils.NavigationHelper; -import com.huanchengfly.tieba.post.utils.TimeUtils; -import com.othershe.baseadapter.ViewHolder; -import com.othershe.baseadapter.base.CommonBaseAdapter; - -import java.util.HashMap; -import java.util.Map; - -public class SearchPostAdapter extends CommonBaseAdapter { - private NavigationHelper navigationHelper; - - public SearchPostAdapter(Context context) { - super(context, null, true); - navigationHelper = NavigationHelper.newInstance(context); - } - - @Override - protected void convert(ViewHolder viewHolder, SearchPostBean.ThreadInfoBean threadInfoBean, int position) { - viewHolder.setOnClickListener(R.id.item_search_thread, (view) -> { - Map map = new HashMap<>(); - map.put("tid", threadInfoBean.getTid()); - map.put("pid", threadInfoBean.getPid()); - navigationHelper.navigationByData(NavigationHelper.ACTION_THREAD, map); - }); - TextView contentTextView = viewHolder.getView(R.id.item_search_thread_content); - TextView titleTextView = viewHolder.getView(R.id.item_search_thread_title); - titleTextView.setText(HtmlCompat.fromHtml(threadInfoBean.getTitle(), HtmlCompat.FROM_HTML_MODE_COMPACT)); - contentTextView.setText(HtmlCompat.fromHtml(threadInfoBean.getContent(), HtmlCompat.FROM_HTML_MODE_COMPACT)); - viewHolder.setText(R.id.user_name, threadInfoBean.getAuthor().getNameShow()); - if (threadInfoBean.getForumName() == null) { - viewHolder.setText(R.id.user_content, TimeUtils.getRelativeTimeString(mContext, threadInfoBean.getTime())); +class SearchPostAdapter(context: Context) : BaseSingleTypeAdapter(context) { + override fun convert(viewHolder: MyViewHolder, item: SearchPostBean.ThreadInfoBean, position: Int) { + val contentTextView = viewHolder.getView(R.id.item_search_thread_content) + val titleTextView = viewHolder.getView(R.id.item_search_thread_title) + titleTextView.text = HtmlCompat.fromHtml(item.title!!.getReplaced(), HtmlCompat.FROM_HTML_MODE_COMPACT) + contentTextView.text = HtmlCompat.fromHtml(item.content!!.getReplaced(), HtmlCompat.FROM_HTML_MODE_COMPACT) + viewHolder.setText(R.id.item_search_thread_user, item.author!!.nameShow) + if (item.forumName == null) { + viewHolder.setText(R.id.item_search_thread_info, getRelativeTimeString(context, item.time!!)) } else { - viewHolder.setText(R.id.user_content, mContext.getString(R.string.template_two_string, threadInfoBean.getForumName(), TimeUtils.getRelativeTimeString(mContext, threadInfoBean.getTime()))); + viewHolder.setText(R.id.item_search_thread_info, context.getString(R.string.template_two_string, item.forumName, getRelativeTimeString(context, item.time!!))) } } - @Override - protected int getItemLayoutId() { - return R.layout.item_search_thread; + private fun String.getReplaced(): String { + return replace("", "").replace("", "") } -} + + override fun getItemLayoutId(): Int { + return R.layout.item_search_posts + } + + companion object { + fun toString(red: Int, green: Int, blue: Int): String { + val hr = Integer.toHexString(red) + val hg = Integer.toHexString(green) + val hb = Integer.toHexString(blue) + return "#" + fixHexString(hr) + fixHexString(hg) + fixHexString(hb) + } + + private fun fixHexString(hex: String): String { + var hexString = hex + if (hexString.isEmpty()) { + hexString = "00" + } + if (hexString.length == 1) { + hexString = "0$hexString" + } + if (hexString.length > 2) { + hexString = hexString.substring(0, 2) + } + return hexString + } + + fun toString(@ColorInt color: Int): String { + return toString(Color.red(color), Color.green(color), Color.blue(color)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/models/SearchPostBean.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/models/SearchPostBean.kt index e1989a9a..fb45ffa7 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/models/SearchPostBean.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/models/SearchPostBean.kt @@ -45,7 +45,6 @@ class SearchPostBean { @SerializedName("fname") val forumName: String? = null val author: AuthorBean? = null - } class AuthorBean { @@ -53,6 +52,5 @@ class SearchPostBean { @SerializedName("name_show") val nameShow: String? = null - } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_post.xml b/app/src/main/res/layout/activity_search_post.xml index fa1f9846..d97a955f 100644 --- a/app/src/main/res/layout/activity_search_post.xml +++ b/app/src/main/res/layout/activity_search_post.xml @@ -6,35 +6,76 @@ android:id="@+id/background" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/transparent" + app:backgroundTint="@color/default_color_window_background" tools:context=".activities.SearchPostActivity"> - - - + android:stateListAnimator="@animator/appbar_elevation" + app:backgroundTint="@color/default_color_toolbar"> - + + + + + + + - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_search_posts.xml b/app/src/main/res/layout/item_search_posts.xml new file mode 100644 index 00000000..95f43869 --- /dev/null +++ b/app/src/main/res/layout/item_search_posts.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + \ No newline at end of file