From 39d0f0b59778d9fd216b024e8e5052b0a4b1d878 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Tue, 3 Jan 2023 09:15:22 +0800 Subject: [PATCH] =?UTF-8?q?version:=20fix:=20update:=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=B5=84=E8=AE=AF=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../uiuios/aios/activity/ArticleActivity.java | 106 ++++++++++++++ .../aios/activity/InfoListActivity.java | 82 ++++++++++- .../uiuios/aios/adapter/ArticleAdapter.java | 16 ++- .../com/uiuios/aios/view/ExpandTextView.java | 135 ++++++++++++++++++ app/src/main/res/layout/activity_articl.xml | 94 ++++++++++++ .../main/res/layout/activity_info_list.xml | 102 ++++++++++++- app/src/main/res/layout/item_article.xml | 4 +- 8 files changed, 530 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/uiuios/aios/activity/ArticleActivity.java create mode 100644 app/src/main/java/com/uiuios/aios/view/ExpandTextView.java create mode 100644 app/src/main/res/layout/activity_articl.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f7db56a..e2b8090 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,6 +78,7 @@ + () { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + int imgWidth = resource.getWidth(); + int imgHeight = resource.getHeight(); + iv_img.setImageBitmap(resource); + Log.e("into", "onResourceReady: width = " + imgWidth + "height = " + imgHeight); + ViewGroup.LayoutParams layoutParams = iv_img.getLayoutParams(); + int width = iv_img.getWidth(); + layoutParams.height = (int) (imgHeight * (1.0f * width /imgWidth )); + iv_img.setLayoutParams(layoutParams); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + } + + @Override + public void initData() { + + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java b/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java index 6fd7d09..cc1ecf1 100644 --- a/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/InfoListActivity.java @@ -1,21 +1,101 @@ package com.uiuios.aios.activity; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.trello.rxlifecycle4.android.FragmentEvent; import com.uiuios.aios.R; +import com.uiuios.aios.adapter.ArticleAdapter; import com.uiuios.aios.base.BaseActivity; +import com.uiuios.aios.bean.ArticleInfo; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.network.NetInterfaceManager; +import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; public class InfoListActivity extends BaseActivity { + @BindView(R.id.iv_back) + ImageView iv_back; + @BindView(R.id.iv1) + ImageView iv1; + @BindView(R.id.recyclerView) + RecyclerView recyclerView; + + private ArticleAdapter mArticleAdapter; + @Override public int getLayoutId() { + UltimateBarX.statusBar(this) + .transparent() + .colorRes(R.color.colorPrimaryDark) + .light(true) + .apply(); + UltimateBarX.navigationBar(this) + .transparent() + .colorRes(R.color.colorPrimaryDark) + .light(true) + .apply(); return R.layout.activity_info_list; } @Override public void initView() { - + ButterKnife.bind(this); + mArticleAdapter = new ArticleAdapter(); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(mArticleAdapter); + iv_back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); } @Override public void initData() { + NetInterfaceManager.getInstance().getArticleListObservable() + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getArticle", "onSubscribe: "); + } + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getArticle", "onNext: " + listBaseResponse); + List articleInfoList = listBaseResponse.data; + if (articleInfoList != null && articleInfoList.size() != 0) { + iv1.setVisibility(android.view.View.GONE); + mArticleAdapter.setArticleBeanList(articleInfoList); + } else { + iv1.setVisibility(android.view.View.VISIBLE); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getArticle", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getArticle", "onComplete: "); + } + }); } } diff --git a/app/src/main/java/com/uiuios/aios/adapter/ArticleAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/ArticleAdapter.java index d9a7e70..93b57fe 100644 --- a/app/src/main/java/com/uiuios/aios/adapter/ArticleAdapter.java +++ b/app/src/main/java/com/uiuios/aios/adapter/ArticleAdapter.java @@ -1,10 +1,10 @@ package com.uiuios.aios.adapter; import android.content.Context; +import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.shehuan.niv.NiceImageView; import com.uiuios.aios.R; +import com.uiuios.aios.activity.ArticleActivity; import com.uiuios.aios.bean.ArticleInfo; import java.util.List; @@ -40,6 +41,14 @@ public class ArticleAdapter extends RecyclerView.Adapter Glide.with(holder.iv_img).load(articleInfo.getImg()).into(holder.iv_img); holder.tv_title.setText(articleInfo.getTitle()); holder.tv_content.setText(articleInfo.getContent()); + holder.tv_read.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(mContext, ArticleActivity.class); + intent.putExtra("ArticleInfo", articleInfo); + mContext.startActivity(intent); + } + }); } @Override @@ -49,13 +58,16 @@ public class ArticleAdapter extends RecyclerView.Adapter class Holder extends RecyclerView.ViewHolder { NiceImageView iv_img; - TextView tv_title, tv_content; + TextView tv_title; + TextView tv_content; + TextView tv_read; public Holder(@NonNull View itemView) { super(itemView); iv_img = itemView.findViewById(R.id.iv_img); tv_title = itemView.findViewById(R.id.tv_title); tv_content = itemView.findViewById(R.id.tv_content); + tv_read = itemView.findViewById(R.id.tv_read); } } } diff --git a/app/src/main/java/com/uiuios/aios/view/ExpandTextView.java b/app/src/main/java/com/uiuios/aios/view/ExpandTextView.java new file mode 100644 index 0000000..cb14e1e --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/view/ExpandTextView.java @@ -0,0 +1,135 @@ +package com.uiuios.aios.view; + +import android.content.Context; +import android.graphics.Rect; +import android.text.Layout; +import android.text.StaticLayout; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +public class ExpandTextView extends AppCompatTextView { + /** + * true:展开,false:收起 + */ + boolean mExpanded; + /** + * 状态回调 + */ + Callback mCallback; + /** + * 源文字内容 + */ + String mText = ""; + /** + * 最多展示的行数 + */ + final int maxLineCount = 3; + /** + * 省略文字 + */ + final String ellipsizeText = "..."; + + public ExpandTextView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + // 文字计算辅助工具 + StaticLayout sl = new StaticLayout(mText, getPaint(), getMeasuredWidth() - getPaddingLeft() - getPaddingRight() + , Layout.Alignment.ALIGN_CENTER, 1, 0, true); + // 总计行数 + int lineCount = sl.getLineCount(); + if (lineCount > maxLineCount) { + if (mExpanded) { + setText(mText); + mCallback.onExpand(); + } else { + lineCount = maxLineCount; + + // 省略文字的宽度 + float dotWidth = getPaint().measureText(ellipsizeText); + + // 找出第 showLineCount 行的文字 + int start = sl.getLineStart(lineCount - 1); + int end = sl.getLineEnd(lineCount - 1); + String lineText = mText.substring(start, end); + + // 将第 showLineCount 行最后的文字替换为 ellipsizeText + int endIndex = 0; + for (int i = lineText.length() - 1; i >= 0; i--) { + String str = lineText.substring(i, lineText.length()); + // 找出文字宽度大于 ellipsizeText 的字符 + if (getPaint().measureText(str) >= dotWidth) { + endIndex = i; + break; + } + } + + // 新的第 showLineCount 的文字 + String newEndLineText = lineText.substring(0, endIndex) + ellipsizeText; + // 最终显示的文字 + setText(mText.substring(0, start) + newEndLineText); + + mCallback.onCollapse(); + } + } else { + setText(mText); + mCallback.onLoss(); + } + + // 重新计算高度 + int lineHeight = 0; + for (int i = 0; i < lineCount; i++) { + Rect lineBound = new Rect(); + sl.getLineBounds(i, lineBound); + lineHeight += lineBound.height(); + } + lineHeight += getPaddingTop() + getPaddingBottom(); + setMeasuredDimension(getMeasuredWidth(), lineHeight); + } + + /** + * 设置要显示的文字以及状态 + * @param text + * @param expanded true:展开,false:收起 + * @param callback + */ + public void setText(String text, boolean expanded, Callback callback) { + mText = text; + mExpanded = expanded; + mCallback = callback; + + // 设置要显示的文字,这一行必须要,否则 onMeasure 宽度测量不正确 + setText(text); + } + + /** + * 展开收起状态变化 + * @param expanded + */ + public void setChanged(boolean expanded) { + mExpanded = expanded; + requestLayout(); + } + + public interface Callback { + /** + * 展开状态 + */ + void onExpand(); + + /** + * 收起状态 + */ + void onCollapse(); + + /** + * 行数小于最小行数,不满足展开或者收起条件 + */ + void onLoss(); + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_articl.xml b/app/src/main/res/layout/activity_articl.xml new file mode 100644 index 0000000..30f8c74 --- /dev/null +++ b/app/src/main/res/layout/activity_articl.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_info_list.xml b/app/src/main/res/layout/activity_info_list.xml index 8903711..b4942bb 100644 --- a/app/src/main/res/layout/activity_info_list.xml +++ b/app/src/main/res/layout/activity_info_list.xml @@ -1,10 +1,102 @@ - + + + + + + + + + + + + + + + + + + + + + + + + - + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tabLayout" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_article.xml b/app/src/main/res/layout/item_article.xml index 15f0fcb..3a135eb 100644 --- a/app/src/main/res/layout/item_article.xml +++ b/app/src/main/res/layout/item_article.xml @@ -35,13 +35,13 @@ android:layout_height="0dp" android:text="中医专家谈寒露养生 “晨饮盐水晚喝蜂蜜”更健康" android:textSize="@dimen/sp_9" - app:layout_constraintBottom_toTopOf="@+id/tv_buying" + app:layout_constraintBottom_toTopOf="@+id/tv_read" app:layout_constraintEnd_toEndOf="@+id/tv_title" app:layout_constraintStart_toStartOf="@+id/tv_title" app:layout_constraintTop_toBottomOf="@+id/tv_title" />