diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java index 698f151..5b6d672 100755 --- a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/base/BannerImageTextAllAdapter.java @@ -20,7 +20,7 @@ import java.util.List; * 邮箱: itgaojian@163.com * 描述: */ -public class BannerImageTextAllAdapter extends BannerAdapter { +public class BannerImageTextAllAdapter extends BannerAdapter { public BannerImageTextAllAdapter(List datas) { super(datas); @@ -28,13 +28,13 @@ public class BannerImageTextAllAdapter extends BannerAdapter mLimitLines); + } + + if (!mNeedExpend || mLineCount <= mLimitLines) { + //不需要展开功能 直接处理链接模块 + return dealLink(mFormatData, false); + } else { + return dealLink(mFormatData, true); + } + } + + /** + * 设置追加的内容 + * + * @param endExpendContent + */ + public void setEndExpendContent(String endExpendContent) { + this.mEndExpandContent = endExpendContent; + } + + /** + * 设置内容 + * + * @param content + */ + public void setContent(final String content) { + mContent = content; + if (isAttached) + doSetContent(); + } + + /** + * 实际设置内容的 + */ + private void doSetContent() { + if (mContent == null) { + return; + } + currentLines = mLimitLines; + + if (mWidth <= 0) { + if (getWidth() > 0) + mWidth = getWidth() - getPaddingLeft() - getPaddingRight(); + } + + if (mWidth <= 0) { + if (retryTime > 10) { + setText(DEFAULT_CONTENT); + } + this.post(new Runnable() { + @Override + public void run() { + retryTime++; + setContent(mContent.toString()); + } + }); + } else { + setRealContent(mContent.toString()); + } + } + + /** + * 设置最后的收起文案 + * + * @return + */ + private String getExpandEndContent() { + if (TextUtils.isEmpty(mEndExpandContent)) { + return String.format(Locale.getDefault(), " %s", + mContractString); + } else { + return String.format(Locale.getDefault(), " %s %s", + mEndExpandContent, mContractString); + } + } + + /** + * 设置展开的文案 + * + * @return + */ + private String getHideEndContent() { + if (TextUtils.isEmpty(mEndExpandContent)) { + return String.format(Locale.getDefault(), mNeedAlwaysShowRight ? " %s" : "... %s", + mExpandString); + } else { + return String.format(Locale.getDefault(), mNeedAlwaysShowRight ? " %s %s" : "... %s %s", + mEndExpandContent, mExpandString); + } + } + + /** + * 处理文字中的链接问题 + * + * @param formatData + * @param ignoreMore + */ + private SpannableStringBuilder dealLink(FormatData formatData, boolean ignoreMore) { + SpannableStringBuilder ssb = new SpannableStringBuilder(); + //获取存储的状态 + if (mModel != null && mModel.getStatus() != null) { + boolean isHide = false; + if (mModel.getStatus() != null) { + if (mModel.getStatus().equals(StatusType.STATUS_CONTRACT)) { + //收起 + isHide = true; + } else { + //展开 + isHide = false; + } + } + if (isHide) { + currentLines = mLimitLines + ((mLineCount - mLimitLines)); + } else { + if (mNeedContract) + currentLines = mLimitLines; + } + } + //处理折叠操作 + if (ignoreMore) { + if (currentLines < mLineCount) { + int index = currentLines - 1; + int endPosition = mDynamicLayout.getLineEnd(index); + int startPosition = mDynamicLayout.getLineStart(index); + float lineWidth = mDynamicLayout.getLineWidth(index); + + String endString = getHideEndContent(); + + //计算原内容被截取的位置下标 + int fitPosition = + getFitPosition(endString, endPosition, startPosition, lineWidth, mPaint.measureText(endString), 0); + String substring = formatData.getFormatedContent().substring(0, fitPosition); + if (substring.endsWith("\n")) { + substring = substring.substring(0, substring.length() - "\n".length()); + } + ssb.append(substring); + + if (mNeedAlwaysShowRight) { + //计算一下最后一行有没有充满 + float lastLineWidth = 0; + for (int i = 0; i < index; i++) { + lastLineWidth += mDynamicLayout.getLineWidth(i); + } + lastLineWidth = lastLineWidth / (index); + float emptyWidth = lastLineWidth - lineWidth - mPaint.measureText(endString); + if (emptyWidth > 0) { + float measureText = mPaint.measureText(Space); + int count = 0; + while (measureText * count < emptyWidth) { + count++; + } + count = count - 1; + for (int i = 0; i < count; i++) { + ssb.append(Space); + } + } + } + + //在被截断的文字后面添加 展开 文字 + ssb.append(endString); + + int expendLength = TextUtils.isEmpty(mEndExpandContent) ? 0 : 2 + mEndExpandContent.length(); + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (needRealExpandOrContract) { + if (mModel != null) { + mModel.setStatus(StatusType.STATUS_CONTRACT); + action(mModel.getStatus()); + } else { + action(); + } + } + if (expandOrContractClickListener != null) { + expandOrContractClickListener.onClick(StatusType.STATUS_EXPAND); + } + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setColor(mExpandTextColor); + ds.setUnderlineText(false); + } + }, ssb.length() - mExpandString.length() - expendLength, ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } else { + ssb.append(formatData.getFormatedContent()); + if (mNeedContract) { + String endString = getExpandEndContent(); + + if (mNeedAlwaysShowRight) { + //计算一下最后一行有没有充满 + int index = mDynamicLayout.getLineCount() - 1; + float lineWidth = mDynamicLayout.getLineWidth(index); + float lastLineWidth = 0; + for (int i = 0; i < index; i++) { + lastLineWidth += mDynamicLayout.getLineWidth(i); + } + lastLineWidth = lastLineWidth / (index); + float emptyWidth = lastLineWidth - lineWidth - mPaint.measureText(endString); + if (emptyWidth > 0) { + float measureText = mPaint.measureText(Space); + int count = 0; + while (measureText * count < emptyWidth) { + count++; + } + count = count - 1; + for (int i = 0; i < count; i++) { + ssb.append(Space); + } + } + } + + ssb.append(endString); + + int expendLength = TextUtils.isEmpty(mEndExpandContent) ? 0 : 2 + mEndExpandContent.length(); + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (mModel != null) { + mModel.setStatus(StatusType.STATUS_EXPAND); + action(mModel.getStatus()); + } else { + action(); + } + if (expandOrContractClickListener != null) { + expandOrContractClickListener.onClick(StatusType.STATUS_CONTRACT); + } + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setColor(mContractTextColor); + ds.setUnderlineText(false); + } + }, ssb.length() - mContractString.length() - expendLength, ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } else { + if (!TextUtils.isEmpty(mEndExpandContent)) { + ssb.append(mEndExpandContent); + ssb.setSpan(new ForegroundColorSpan(mEndExpandTextColor), ssb.length() - mEndExpandContent.length(), ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + } + } + } else { + ssb.append(formatData.getFormatedContent()); + if (!TextUtils.isEmpty(mEndExpandContent)) { + ssb.append(mEndExpandContent); + ssb.setSpan(new ForegroundColorSpan(mEndExpandTextColor), ssb.length() - mEndExpandContent.length(), ssb.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + } + //处理链接或者@用户 + List positionDatas = formatData.getPositionDatas(); + HH: + for (FormatData.PositionData data : positionDatas) { + if (ssb.length() >= data.getEnd()) { + if (data.getType().equals(LinkType.LINK_TYPE)) { + if (mNeedExpend && ignoreMore) { + int fitPosition = ssb.length() - getHideEndContent().length(); + if (data.getStart() < fitPosition) { + SelfImageSpan imageSpan = new SelfImageSpan(mLinkDrawable, ImageSpan.ALIGN_BASELINE); + //设置链接图标 + ssb.setSpan(imageSpan, data.getStart(), data.getStart() + 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + //设置链接文字样式 + int endPosition = data.getEnd(); + if (currentLines < mLineCount) { + if (fitPosition > data.getStart() + 1 && fitPosition < data.getEnd()) { + endPosition = fitPosition; + } + } + if (data.getStart() + 1 < fitPosition) { + addUrl(ssb, data, endPosition); + } + } + } else { + SelfImageSpan imageSpan = new SelfImageSpan(mLinkDrawable, ImageSpan.ALIGN_BASELINE); + //设置链接图标 + ssb.setSpan(imageSpan, data.getStart(), data.getStart() + 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + addUrl(ssb, data, data.getEnd()); + } + } else if (data.getType().equals(LinkType.MENTION_TYPE)) { + //如果需要展开 + if (mNeedExpend && ignoreMore) { + int fitPosition = ssb.length() - getHideEndContent().length(); + if (data.getStart() < fitPosition) { + int endPosition = data.getEnd(); + if (currentLines < mLineCount) { + if (fitPosition < data.getEnd()) { + endPosition = fitPosition; + } + } + addMention(ssb, data, endPosition); + } + } else { + addMention(ssb, data, data.getEnd()); + } + } else if (data.getType().equals(LinkType.SELF)) { + //自定义 + //如果需要展开 + if (mNeedExpend && ignoreMore) { + int fitPosition = ssb.length() - getHideEndContent().length(); + if (data.getStart() < fitPosition) { + int endPosition = data.getEnd(); + if (currentLines < mLineCount) { + if (fitPosition < data.getEnd()) { + endPosition = fitPosition; + } + } + addSelf(ssb, data, endPosition); + } + } else { + addSelf(ssb, data, data.getEnd()); + } + } + } + } + //清除链接点击时背景效果 + setHighlightColor(Color.TRANSPARENT); + //将内容设置到控件中 + setText(ssb); + return ssb; + } + + /** + * 获取需要插入的空格 + * + * @param emptyWidth + * @param endStringWidth + * @return + */ + private int getFitSpaceCount(float emptyWidth, float endStringWidth) { + float measureText = mPaint.measureText(Space); + int count = 0; + while (endStringWidth + measureText * count < emptyWidth) { + count++; + } + return --count; + } + + + /** + * 添加自定义规则 + * + * @param ssb + * @param data + * @param endPosition + */ + private void addSelf(SpannableStringBuilder ssb, final FormatData.PositionData data, int endPosition) { + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (linkClickListener != null) + linkClickListener.onLinkClickListener(LinkType.SELF, data.getSelfAim(), data.getSelfContent()); + } + + @Override + public void updateDrawState(TextPaint ds) { + ds.setColor(mSelfTextColor); + ds.setUnderlineText(false); + } + }, data.getStart(), endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + + /** + * 添加@用户的Span + * + * @param ssb + * @param data + * @param endPosition + */ + private void addMention(SpannableStringBuilder ssb, final FormatData.PositionData data, int endPosition) { + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (linkClickListener != null) + linkClickListener.onLinkClickListener(LinkType.MENTION_TYPE, data.getUrl(), null); + } + + @Override + public void updateDrawState(TextPaint ds) { + ds.setColor(mMentionTextColor); + ds.setUnderlineText(false); + } + }, data.getStart(), endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + /** + * 添加链接的span + * + * @param ssb + * @param data + * @param endPosition + */ + private void addUrl(SpannableStringBuilder ssb, final FormatData.PositionData data, int endPosition) { + ssb.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + if (linkClickListener != null) { + linkClickListener.onLinkClickListener(LinkType.LINK_TYPE, data.getUrl(), null); + } else { + //如果没有设置监听 则调用默认的打开浏览器显示连接 + Intent intent = new Intent(); + intent.setAction("android.intent.action.VIEW"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Uri url = Uri.parse(data.getUrl()); + intent.setData(url); + mContext.startActivity(intent); + } + } + + @Override + public void updateDrawState(TextPaint ds) { + ds.setColor(mLinkTextColor); + ds.setUnderlineText(false); + } + }, data.getStart() + 1, endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + /** + * 设置当前的状态 + * + * @param type + */ + public void setCurrStatus(StatusType type) { + action(type); + } + + private void action() { + action(null); + } + + /** + * 执行展开和收回的动作 + */ + private void action(StatusType type) { + boolean isHide = currentLines < mLineCount; + if (type != null) { + mNeedAnimation = false; + } + if (mNeedAnimation) { + ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); + final boolean finalIsHide = isHide; + valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + Float value = (Float) animation.getAnimatedValue(); + if (finalIsHide) { + currentLines = mLimitLines + (int) ((mLineCount - mLimitLines) * value); + } else { + if (mNeedContract) + currentLines = mLimitLines + (int) ((mLineCount - mLimitLines) * (1 - value)); + } + setText(setRealContent(mContent)); + } + }); + valueAnimator.setDuration(100); + valueAnimator.start(); + } else { + if (isHide) { + currentLines = mLimitLines + ((mLineCount - mLimitLines)); + } else { + if (mNeedContract) + currentLines = mLimitLines; + } + setText(setRealContent(mContent)); + } + } + + /** + * 计算原内容被裁剪的长度 + * + * @param endString + * @param endPosition 指定行最后文字的位置 + * @param startPosition 指定行文字开始的位置 + * @param lineWidth 指定行文字的宽度 + * @param endStringWith 最后添加的文字的宽度 + * @param offset 偏移量 + * @return + */ + private int getFitPosition(String endString, int endPosition, int startPosition, float lineWidth, + float endStringWith, float offset) { + //最后一行需要添加的文字的字数 + int position = (int) ((lineWidth - (endStringWith + offset)) * (endPosition - startPosition) + / lineWidth); + + if (position <= endString.length()) return endPosition; + + //计算最后一行需要显示的正文的长度 + float measureText = mPaint.measureText( + (mFormatData.getFormatedContent().substring(startPosition, startPosition + position))); + + //如果最后一行需要显示的正文的长度比最后一行的长减去“展开”文字的长度要短就可以了 否则加个空格继续算 + if (measureText <= lineWidth - endStringWith) { + return startPosition + position; + } else { + return getFitPosition(endString, endPosition, startPosition, lineWidth, endStringWith, offset + mPaint.measureText(Space)); + } + } + + /** + * 对传入的数据进行正则匹配并处理 + * + * @param content + * @return + */ + private FormatData formatData(CharSequence content) { + FormatData formatData = new FormatData(); + List datas = new ArrayList<>(); + //对链接进行正则匹配 +// Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE); + Pattern pattern = Pattern.compile(self_regex, Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(content); + StringBuffer newResult = new StringBuffer(); + int start = 0; + int end = 0; + int temp = 0; + Map convert = new HashMap<>(); + //对自定义的进行正则匹配 + if (mNeedSelf) { + List datasMention = new ArrayList<>(); + while (matcher.find()) { + start = matcher.start(); + end = matcher.end(); + newResult.append(content.toString().substring(temp, start)); + //将匹配到的内容进行统计处理 + String result = matcher.group(); + if (!TextUtils.isEmpty(result)) { + //解析数据 + String aimSrt = result.substring(result.indexOf("[") + 1, result.indexOf("]")); + String contentSrt = result.substring(result.indexOf("(") + 1, result.indexOf(")")); + String key = UUIDUtils.getUuid(aimSrt.length()); + datasMention.add(new FormatData.PositionData(newResult.length() + 1, newResult.length() + 2 + aimSrt.length(), aimSrt, contentSrt, LinkType.SELF)); + convert.put(key, aimSrt); + newResult.append(" " + key + " "); + temp = end; + } + } + datas.addAll(datasMention); + } + //重置状态 + newResult.append(content.toString().substring(end, content.toString().length())); + content = newResult.toString(); + newResult = new StringBuffer(); + start = 0; + end = 0; + temp = 0; + + if (mNeedLink) { + pattern = AUTOLINK_WEB_URL; + matcher = pattern.matcher(content); + while (matcher.find()) { + start = matcher.start(); + end = matcher.end(); + newResult.append(content.toString().substring(temp, start)); + if (mNeedConvertUrl) { + //将匹配到的内容进行统计处理 + datas.add(new FormatData.PositionData(newResult.length() + 1, newResult.length() + 2 + TARGET.length(), matcher.group(), LinkType.LINK_TYPE)); + newResult.append(" " + TARGET + " "); + } else { + String result = matcher.group(); + String key = UUIDUtils.getUuid(result.length()); + datas.add(new FormatData.PositionData(newResult.length(), newResult.length() + 2 + key.length(), result, LinkType.LINK_TYPE)); + convert.put(key, result); + newResult.append(" " + key + " "); + } + temp = end; + } + } + newResult.append(content.toString().substring(end, content.toString().length())); + //对@用户 进行正则匹配 + if (mNeedMention) { + pattern = Pattern.compile(regexp_mention, Pattern.CASE_INSENSITIVE); + matcher = pattern.matcher(newResult.toString()); + List datasMention = new ArrayList<>(); + while (matcher.find()) { + //将匹配到的内容进行统计处理 + datasMention.add(new FormatData.PositionData(matcher.start(), matcher.end(), matcher.group(), LinkType.MENTION_TYPE)); + } + datas.addAll(0, datasMention); + } + if (!convert.isEmpty()) { + String resultData = newResult.toString(); + for (Map.Entry entry : convert.entrySet()) { + resultData = resultData.replaceAll(entry.getKey(), entry.getValue()); + } + newResult = new StringBuffer(resultData); + } + formatData.setFormatedContent(newResult.toString()); + formatData.setPositionDatas(datas); + return formatData; + } + + /** + * 自定义ImageSpan 让Image 在行内居中显示 + */ + class SelfImageSpan extends ImageSpan { + private Drawable drawable; + + public SelfImageSpan(Drawable d, int verticalAlignment) { + super(d, verticalAlignment); + this.drawable = d; + } + + @Override + public Drawable getDrawable() { + return drawable; + } + + @Override + public void draw(@NonNull Canvas canvas, CharSequence text, + int start, int end, float x, + int top, int y, int bottom, @NonNull Paint paint) { + // image to draw + Drawable b = getDrawable(); + // font metrics of text to be replaced + Paint.FontMetricsInt fm = paint.getFontMetricsInt(); + int transY = (y + fm.descent + y + fm.ascent) / 2 + - b.getBounds().bottom / 2; + canvas.save(); + canvas.translate(x, transY); + b.draw(canvas); + canvas.restore(); + } + } + + /** + * 绑定状态 + * + * @param model + */ + public void bind(ExpandableStatusFix model) { + mModel = model; + } + + public static class LocalLinkMovementMethod extends LinkMovementMethod { + static LocalLinkMovementMethod sInstance; + + + public static LocalLinkMovementMethod getInstance() { + if (sInstance == null) + sInstance = new LocalLinkMovementMethod(); + + return sInstance; + } + + @Override + public boolean onTouchEvent(TextView widget, + Spannable buffer, MotionEvent event) { + int action = event.getAction(); + + if (action == MotionEvent.ACTION_UP || + action == MotionEvent.ACTION_DOWN) { + int x = (int) event.getX(); + int y = (int) event.getY(); + + x -= widget.getTotalPaddingLeft(); + y -= widget.getTotalPaddingTop(); + + x += widget.getScrollX(); + y += widget.getScrollY(); + + Layout layout = widget.getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + + ClickableSpan[] link = buffer.getSpans( + off, off, ClickableSpan.class); + + if (link.length != 0) { + if (action == MotionEvent.ACTION_UP) { + link[0].onClick(widget); + } else if (action == MotionEvent.ACTION_DOWN) { + Selection.setSelection(buffer, + buffer.getSpanStart(link[0]), + buffer.getSpanEnd(link[0])); + } + + if (widget instanceof ExpandableTextView) { + ((ExpandableTextView) widget).linkHit = true; + } + return true; + } else { + Selection.removeSelection(buffer); + Touch.onTouchEvent(widget, buffer, event); + return false; + } + } + return Touch.onTouchEvent(widget, buffer, event); + } + } + + boolean dontConsumeNonUrlClicks = true; + + @Override + public boolean onTouchEvent(MotionEvent event) { + int action = event.getAction(); + linkHit = false; + boolean res = super.onTouchEvent(event); + + if (dontConsumeNonUrlClicks) + return linkHit; + + //防止选择复制的状态不消失 + if (action == MotionEvent.ACTION_UP) { + this.setTextIsSelectable(false); + } + + return res; + } + + public interface OnLinkClickListener { + void onLinkClickListener(LinkType type, String content, String selfContent); + } + + public interface OnGetLineCountListener { + /** + * lineCount 预估可能占有的行数 + * canExpand 是否达到可以展开的条件 + */ + void onGetLineCount(int lineCount, boolean canExpand); + } + + private OnGetLineCountListener onGetLineCountListener; + + public OnGetLineCountListener getOnGetLineCountListener() { + return onGetLineCountListener; + } + + public void setOnGetLineCountListener(OnGetLineCountListener onGetLineCountListener) { + this.onGetLineCountListener = onGetLineCountListener; + } + + public interface OnExpandOrContractClickListener { + void onClick(StatusType type); + } + + public OnLinkClickListener getLinkClickListener() { + return linkClickListener; + } + + public void setLinkClickListener(OnLinkClickListener linkClickListener) { + this.linkClickListener = linkClickListener; + } + + public boolean ismNeedMention() { + return mNeedMention; + } + + public void setNeedMention(boolean mNeedMention) { + this.mNeedMention = mNeedMention; + } + + public Drawable getLinkDrawable() { + return mLinkDrawable; + } + + public void setLinkDrawable(Drawable mLinkDrawable) { + this.mLinkDrawable = mLinkDrawable; + } + + public boolean isNeedContract() { + return mNeedContract; + } + + public void setNeedContract(boolean mNeedContract) { + this.mNeedContract = mNeedContract; + } + + public boolean isNeedExpend() { + return mNeedExpend; + } + + public void setNeedExpend(boolean mNeedExpend) { + this.mNeedExpend = mNeedExpend; + } + + public boolean isNeedAnimation() { + return mNeedAnimation; + } + + public void setNeedAnimation(boolean mNeedAnimation) { + this.mNeedAnimation = mNeedAnimation; + } + + public int getExpandableLineCount() { + return mLineCount; + } + + public void setExpandableLineCount(int mLineCount) { + this.mLineCount = mLineCount; + } + + public int getExpandTextColor() { + return mExpandTextColor; + } + + public void setExpandTextColor(int mExpandTextColor) { + this.mExpandTextColor = mExpandTextColor; + } + + public int getExpandableLinkTextColor() { + return mLinkTextColor; + } + + public void setExpandableLinkTextColor(int mLinkTextColor) { + this.mLinkTextColor = mLinkTextColor; + } + + public int getContractTextColor() { + return mContractTextColor; + } + + public void setContractTextColor(int mContractTextColor) { + this.mContractTextColor = mContractTextColor; + } + + public String getExpandString() { + return mExpandString; + } + + public void setExpandString(String mExpandString) { + this.mExpandString = mExpandString; + } + + public String getContractString() { + return mContractString; + } + + public void setContractString(String mContractString) { + this.mContractString = mContractString; + } + + public int getEndExpandTextColor() { + return mEndExpandTextColor; + } + + public void setEndExpandTextColor(int mEndExpandTextColor) { + this.mEndExpandTextColor = mEndExpandTextColor; + } + + public boolean isNeedLink() { + return mNeedLink; + } + + public void setNeedLink(boolean mNeedLink) { + this.mNeedLink = mNeedLink; + } + + public int getSelfTextColor() { + return mSelfTextColor; + } + + public void setSelfTextColor(int mSelfTextColor) { + this.mSelfTextColor = mSelfTextColor; + } + + public boolean isNeedSelf() { + return mNeedSelf; + } + + public void setNeedSelf(boolean mNeedSelf) { + this.mNeedSelf = mNeedSelf; + } + + public boolean isNeedAlwaysShowRight() { + return mNeedAlwaysShowRight; + } + + public void setNeedAlwaysShowRight(boolean mNeedAlwaysShowRight) { + this.mNeedAlwaysShowRight = mNeedAlwaysShowRight; + } + + public OnExpandOrContractClickListener getExpandOrContractClickListener() { + return expandOrContractClickListener; + } + + public void setExpandOrContractClickListener(OnExpandOrContractClickListener expandOrContractClickListener) { + this.expandOrContractClickListener = expandOrContractClickListener; + } + + public void setExpandOrContractClickListener(OnExpandOrContractClickListener expandOrContractClickListener, boolean needRealExpandOrContract) { + this.expandOrContractClickListener = expandOrContractClickListener; + this.needRealExpandOrContract = needRealExpandOrContract; + } +} diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/FormatData.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/FormatData.java new file mode 100755 index 0000000..9b7a553 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/FormatData.java @@ -0,0 +1,102 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + + +import java.util.List; + +/** + * 记录可以点击的内容 和 位置 + */ + public class FormatData { + private String formatedContent; + private List positionDatas; + + public String getFormatedContent() { + return formatedContent; + } + + public void setFormatedContent(String formatedContent) { + this.formatedContent = formatedContent; + } + + public List getPositionDatas() { + return positionDatas; + } + + public void setPositionDatas(List positionDatas) { + this.positionDatas = positionDatas; + } + + public static class PositionData { + private int start; + private int end; + private String url; + private LinkType type; + //自定义法规则的aim + private String selfAim; + //自定义规则的内容 + private String selfContent; + + public String getSelfAim() { + return selfAim; + } + + public void setSelfAim(String selfAim) { + this.selfAim = selfAim; + } + + public String getSelfContent() { + return selfContent; + } + + public void setSelfContent(String selfContent) { + this.selfContent = selfContent; + } + + public LinkType getType() { + return type; + } + + public void setType(LinkType type) { + this.type = type; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public PositionData(int start, int end, String url, LinkType type) { + this.start = start; + this.end = end; + this.url = url; + this.type = type; + } + + public PositionData(int start, int end, String selfAim,String selfContent, LinkType type) { + this.start = start; + this.end = end; + this.selfAim = selfAim; + this.selfContent = selfContent; + this.type = type; + } + + public int getStart() { + return start; + } + + public void setStart(int start) { + this.start = start; + } + + public int getEnd() { + return end; + } + + public void setEnd(int end) { + this.end = end; + } + } + } diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/LinkType.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/LinkType.java new file mode 100755 index 0000000..10c390d --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/LinkType.java @@ -0,0 +1,11 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + +//定义类型的枚举类型 +public enum LinkType { + //普通链接 + LINK_TYPE, + //@用户 + MENTION_TYPE, + //自定义规则 + SELF +} \ No newline at end of file diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/StatusType.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/StatusType.java new file mode 100755 index 0000000..8b73220 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/StatusType.java @@ -0,0 +1,14 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + +/** + * @date: on 2018/9/20 + * @author: cretin + * @email: mxnzp_life@163.com + * @desc: 添加描述 + */ +public enum StatusType { + //展开 + STATUS_EXPAND, + //收起 + STATUS_CONTRACT +} diff --git a/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/UUIDUtils.java b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/UUIDUtils.java new file mode 100755 index 0000000..f261ff1 --- /dev/null +++ b/cm_utils/src/main/java/com/sucstepsoft/cm_utils/core/widget/views/expandabletextview/UUIDUtils.java @@ -0,0 +1,35 @@ +package com.sucstepsoft.cm_utils.core.widget.views.expandabletextview; + +import java.util.UUID; + +public class UUIDUtils { + /** + * 生成一个32位的不带-的不唯一的uuid + * + * @return + */ + public static String getUuid() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } + + public static String[] chars = new String[]{"a", "b", "c", "d", "e", "f", + "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z"}; + + + /** + * 生成一个32位的不带-的不唯一的uuid + * + * @return + */ + public static String getUuid(int length) { + StringBuilder stringBuilder = new StringBuilder(UUID.randomUUID().toString()); + while (stringBuilder.length() < length) { + stringBuilder.append(UUID.randomUUID().toString()); + } + return stringBuilder.substring(0,length); + } +} \ No newline at end of file diff --git a/cm_utils/src/main/res/drawable-xhdpi/link.png b/cm_utils/src/main/res/drawable-xhdpi/link.png new file mode 100755 index 0000000..3b3c1f7 Binary files /dev/null and b/cm_utils/src/main/res/drawable-xhdpi/link.png differ diff --git a/cm_utils/src/main/res/layout/item_banner_text_all.xml b/cm_utils/src/main/res/layout/item_banner_text_all.xml index f47a645..8d9610c 100755 --- a/cm_utils/src/main/res/layout/item_banner_text_all.xml +++ b/cm_utils/src/main/res/layout/item_banner_text_all.xml @@ -1,5 +1,6 @@ - + android:layout_height="220dp" + android:layout_alignParentBottom="true"> + + + + + + + + + + + + \ No newline at end of file diff --git a/cm_utils/src/main/res/values/attrs.xml b/cm_utils/src/main/res/values/attrs.xml index 4353921..312b274 100755 --- a/cm_utils/src/main/res/values/attrs.xml +++ b/cm_utils/src/main/res/values/attrs.xml @@ -96,6 +96,43 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cm_utils/src/main/res/values/strings.xml b/cm_utils/src/main/res/values/strings.xml index 12b7d44..b50b665 100755 --- a/cm_utils/src/main/res/values/strings.xml +++ b/cm_utils/src/main/res/values/strings.xml @@ -31,4 +31,8 @@ 正在检查版本 安卓%1$s%2$s%3$s + + 收起 + 展开 + 网页链接 diff --git a/moduleijkplayer/src/main/java/com/tengshisoft/moduleijkplayer/controller/AudioPrepareView.java b/moduleijkplayer/src/main/java/com/tengshisoft/moduleijkplayer/controller/AudioPrepareView.java new file mode 100755 index 0000000..b5fb280 --- /dev/null +++ b/moduleijkplayer/src/main/java/com/tengshisoft/moduleijkplayer/controller/AudioPrepareView.java @@ -0,0 +1,136 @@ +package com.tengshisoft.moduleijkplayer.controller; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.animation.Animation; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.tengshisoft.moduleijkplayer.R; +import com.tengshisoft.moduleijkplayer.player.VideoView; +import com.tengshisoft.moduleijkplayer.player.VideoViewManager; + +/** + * 准备播放界面 + */ +public class AudioPrepareView extends FrameLayout implements IControlComponent { + + private ControlWrapper mControlWrapper; + + private ImageView mThumb; + private ImageView mStartPlay; + private ProgressBar mLoading; + private FrameLayout mNetWarning; + private TextView mTvState; + + public AudioPrepareView(@NonNull Context context) { + super(context); + } + + public AudioPrepareView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public AudioPrepareView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + { + LayoutInflater.from(getContext()).inflate(R.layout.dkplayer_layout_prepare_view, this, true); + mThumb = findViewById(R.id.thumb); + mTvState = findViewById(R.id.tv_state); + mStartPlay = findViewById(R.id.start_play); + mLoading = findViewById(R.id.loading); + mNetWarning = findViewById(R.id.net_warning_layout); + findViewById(R.id.status_btn).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + mNetWarning.setVisibility(GONE); + VideoViewManager.instance().setPlayOnMobileNetwork(true); + mControlWrapper.start(); + } + }); + } + + /** + * 设置点击此界面开始播放 + */ + public void setClickStart() { + setOnClickListener(v -> mControlWrapper.start()); + } + + @Override + public void attach(@NonNull ControlWrapper controlWrapper) { + mControlWrapper = controlWrapper; + } + + @Override + public View getView() { + return this; + } + + @Override + public void onVisibilityChanged(boolean isVisible, Animation anim) { + + } + + public void setState(String state) { + mTvState.setText(state); + } + + @Override + public void onPlayStateChanged(int playState) { + switch (playState) { + case VideoView.STATE_PREPARING: + bringToFront(); + setVisibility(VISIBLE); + mStartPlay.setVisibility(View.GONE); + mNetWarning.setVisibility(GONE); + mLoading.setVisibility(View.VISIBLE); + break; + case VideoView.STATE_PLAYING: + case VideoView.STATE_PAUSED: + case VideoView.STATE_ERROR: + case VideoView.STATE_BUFFERING: + case VideoView.STATE_BUFFERED: + case VideoView.STATE_PLAYBACK_COMPLETED: + setVisibility(GONE); + break; + case VideoView.STATE_IDLE: + setVisibility(VISIBLE); + bringToFront(); + mLoading.setVisibility(View.GONE); + mNetWarning.setVisibility(GONE); + mStartPlay.setVisibility(View.VISIBLE); + mThumb.setVisibility(View.VISIBLE); + break; + case VideoView.STATE_START_ABORT: + setVisibility(VISIBLE); + mNetWarning.setVisibility(VISIBLE); + mNetWarning.bringToFront(); + break; + } + } + + @Override + public void onPlayerStateChanged(int playerState) { + + } + + @Override + public void setProgress(int duration, int position) { + + } + + @Override + public void onLockStateChanged(boolean isLocked) { + + } +} diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java index 16c0723..b97d859 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsListActivity.java @@ -37,6 +37,9 @@ import io.reactivex.annotations.NonNull; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +/** + * 新闻只有一级 + */ @Route(path = PathConfig.PATH_MODULE_MAIN_NEWS_LIST) public class NewsListActivity extends BaseActivity { @BindView(R2.id.srl_content) @@ -223,6 +226,8 @@ public class NewsListActivity extends BaseActivity { mAdapter.setData(mNewsDatas); } } + mSrlContent.finishRefresh(); + mSrlContent.finishLoadMore(); } @Override @@ -275,7 +280,7 @@ public class NewsListActivity extends BaseActivity { url = rowsBean.getTemplateRecordUrl(); } ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) .withString("id", rowsBean.getNewsContentId()) .withString("url", url) .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java index bddc114..0b01296 100644 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsLocalDetailActivity.java @@ -40,7 +40,6 @@ import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.sucstepsoft.cm_utils.constant.PathConfig; import com.sucstepsoft.cm_utils.core.beans.AddPhotoBean; import com.sucstepsoft.cm_utils.core.beans.BaseImageBean; -import com.sucstepsoft.cm_utils.core.beans.BaseSuccessBean; import com.sucstepsoft.cm_utils.core.retrofit_net.BaseUrlApi; import com.sucstepsoft.cm_utils.core.retrofit_net.RetrofitManager; import com.sucstepsoft.cm_utils.core.widget.base.BannerImageTextAllAdapter; @@ -51,18 +50,30 @@ import com.sucstepsoft.cm_utils.core.widget.views.ButtomDialogView; import com.sucstepsoft.cm_utils.core.widget.views.ItemSplitDivider; import com.sucstepsoft.cm_utils.core.widget.views.NestedScrollWebView; import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; +import com.sucstepsoft.cm_utils.utils.ConvertUtils; import com.sucstepsoft.cm_utils.utils.ExceptionHandler; import com.sucstepsoft.cm_utils.utils.FileUtils; import com.sucstepsoft.cm_utils.utils.LogUtils; import com.sucstepsoft.cm_utils.utils.ProiderUtil; +import com.sucstepsoft.cm_utils.utils.ScreenUtils; import com.sucstepsoft.cm_utils.utils.TimeUtils; import com.sucstepsoft.cm_utils.utils.UIUtil; import com.sucstepsoft.cm_utils.utils.UserLgUtils; import com.sucstepsoft.cm_utils.utils.toast.ToastUtils; +import com.tengshisoft.moduleijkplayer.controller.AudioControlView; +import com.tengshisoft.moduleijkplayer.controller.AudioPrepareView; +import com.tengshisoft.moduleijkplayer.controller.CompleteView; +import com.tengshisoft.moduleijkplayer.controller.ErrorView; +import com.tengshisoft.moduleijkplayer.controller.GestureView; +import com.tengshisoft.moduleijkplayer.controller.PrepareView; +import com.tengshisoft.moduleijkplayer.controller.StandardVideoController; +import com.tengshisoft.moduleijkplayer.controller.TitleView; +import com.tengshisoft.moduleijkplayer.controller.VodControlView; import com.tengshisoft.moduleijkplayer.player.VideoView; import com.tengshisoft.mudulemain.R; import com.tengshisoft.mudulemain.R2; import com.tengshisoft.mudulemain.cultural.adapter.CommentAdapter; +import com.tengshisoft.mudulemain.cultural.adapter.NewsCategoryAdapter; import com.tengshisoft.mudulemain.cultural.beans.BaseUserBean; import com.tengshisoft.mudulemain.cultural.beans.CollectBean; import com.tengshisoft.mudulemain.cultural.beans.CommentListBean; @@ -145,8 +156,18 @@ public class NewsLocalDetailActivity extends BaseActivity { TypeFaceTextView mTvPublishTime; @BindView(R2.id.ll_title_view) LinearLayout mLlTitleView; - - + @BindView(R2.id.ll_audio)//音频 + LinearLayout mLlAudio; + @BindView(R2.id.vv_audio) + VideoView mAudio; + @BindView(R2.id.rlv_audio_category) + RecyclerView mRlvAudioCategory; + @BindView(R2.id.tv_audio_txt) + TypeFaceTextView mTvAudioTxt; + @BindView(R2.id.iv_banner_left) + ImageView mIvImgLeft; + @BindView(R2.id.iv_banner_right) + ImageView mIvImgRight; private AddPhotoBean mCurrentBean; private String mPicPath; private Unbinder mBind; @@ -168,6 +189,7 @@ public class NewsLocalDetailActivity extends BaseActivity { private String mTitle; private String mPhoto; private File mDestFile; + private NewsCategoryAdapter mCategoryAdapter; @Override protected int setLayoutId() { @@ -302,7 +324,6 @@ public class NewsLocalDetailActivity extends BaseActivity { } - /** * 获取新闻详情 */ @@ -356,14 +377,17 @@ public class NewsLocalDetailActivity extends BaseActivity { createImgView(newsDetailBean); break; case "3"://音频 + createAudioView(newsDetailBean); break; case "4"://视频 + createVideoView(newsDetailBean); break; case "5"://PDF break; case "6"://6链接 + createWebView(newsDetailBean); break; - case "1": + case "1"://文章 default: mLlTitleView.setVisibility(View.VISIBLE); mTvTitle.setText(newsDetailBean.getNewsContentTitle()); @@ -486,8 +510,13 @@ public class NewsLocalDetailActivity extends BaseActivity { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } - String data = b.getNewsContentContent(); - mWvContent.loadData(data, "text/html", "utf-8"); + if ("6".equals(b.getNewsContentType())) { + mWvContent.loadUrl(b.getNewsContentContent()); + } else { + String data = b.getNewsContentContent(); + mWvContent.loadDataWithBaseURL(null, getHtmlData(data), "text/html", "utf-8", null); +// mWvContent.loadData(data, "text/html", "utf-8"); + } mWvContent.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { @@ -499,7 +528,12 @@ public class NewsLocalDetailActivity extends BaseActivity { super.onPageFinished(view, url); mContentSkeleton.hide(); view.getSettings().setBlockNetworkImage(false);//开启页面图片加载 - runOnUiThread(() -> mWvContent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT))); + runOnUiThread(() -> { +// imgReset(); +// pSection(); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + mWvContent.setLayoutParams(params); + }); } @Override @@ -510,16 +544,16 @@ public class NewsLocalDetailActivity extends BaseActivity { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { - if (url.contains(BaseUrlApi.BASE_SYSTEM_IP + "news/route/file/download/true")) { - //TODO 数图资源 - ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_PDF) - .withString("title", mTitle) - .withString("url", url) - .navigation(); - } else { - view.loadUrl(url); - } +// if (url.contains(BaseUrlApi.BASE_SYSTEM_IP + "news/route/file/download/true")) { +// //TODO 数图资源 +// ARouter.getInstance() +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_PDF) +// .withString("title", mTitle) +// .withString("url", url) +// .navigation(); +// } else { +// view.loadUrl(url); +// } return true; } }); @@ -532,44 +566,215 @@ public class NewsLocalDetailActivity extends BaseActivity { }); } + // {margin-left:5px;margin-right:5px;margin-top:10px;} + private String getHtmlData(String content) { + String head = "" + + "" + + "" + + ""; + return "" + head + "" + content + ""; + } + + /** + * 对图片进行重置大小,宽度就是手机屏幕宽度,高度根据宽度比便自动缩放 + **/ + private void imgReset() { + mWvContent.loadUrl("javascript:(function(){" + + "var objs = document.getElementsByTagName('img'); " + + "for(var i=0;i fileList = b.getFileList(); + if (i == 0) { + fileList.get(i).setCheck(true); + } else { + fileList.get(i).setCheck(false); + } + } + mCategoryAdapter = new NewsCategoryAdapter(mActivity, b.getFileList()); + mRlvAudioCategory.setLayoutManager(new LinearLayoutManager(mActivity, LinearLayoutManager.HORIZONTAL, false)); + mRlvAudioCategory.setAdapter(mCategoryAdapter); + mCategoryAdapter.addOnItemClickListener(fileListBean -> { + for (int i = 0; i < b.getFileList().size(); i++) { + NewsDetailBean.FileListBean fileBean = b.getFileList().get(i); + if (fileBean.getContentFileFileId().equals(fileListBean.getContentFileFileId())) { + fileBean.setCheck(true); + } else { + fileBean.setCheck(false); + } + } + mCategoryAdapter.setData(b.getFileList()); + setAudioUrl(fileListBean); + }); + StandardVideoController controller = new StandardVideoController(mActivity); + controller.setEnableOrientation(true); + AudioPrepareView prepareView = new AudioPrepareView(this);//准备播放界面 + ImageView thumb = prepareView.findViewById(com.tengshisoft.moduleijkplayer.R.id.thumb);//封面图 + Glide.with(mActivity).load(com.tengshisoft.moduleijkplayer.R.drawable.ic_img_default).into(thumb); + controller.addControlComponent(prepareView); + prepareView.setClickStart(); + CompleteView completeView = new CompleteView(this); + controller.addControlComponent(completeView);//自动完成播放界面 + ErrorView errorView = new ErrorView(this); + controller.addControlComponent(errorView);//错误界面 + TitleView titleView = new TitleView(this);//标题栏 + controller.addControlComponent(titleView); + //根据是否为直播设置不同的底部控制条 + AudioControlView vodControlView = new AudioControlView(this);//点播控制条 + controller.addControlComponent(vodControlView); + GestureView gestureControlView = new GestureView(this);//滑动控制视图 + controller.addControlComponent(gestureControlView); + controller.setCanChangePosition(false); + //设置标题 + titleView.setTitle(mTitle); + mAudio.setVideoController(controller); + mAudio.setUrl(BaseUrlApi.BASE_IMG_URL + b.getFileList().get(0).getContentFileFileId()); + mAudio.setLooping(true); + mTvAudioTxt.setText(b.getFileList().get(0).getContentFileText()); + } + + /** + * 设置音频Url + */ + private void setAudioUrl(NewsDetailBean.FileListBean b) { + if (mAudio == null) { + return; + } + if (mAudio.isPlaying()) { + mAudio.pause(); + mAudio.release(); + } + mAudio.setUrl(BaseUrlApi.BASE_IMG_URL + b.getContentFileFileId()); + mAudio.start(); + mTvAudioTxt.setText(b.getContentFileText()); } /** * 加载视频新闻 */ - private void createVideoView() { + private void createVideoView(NewsDetailBean b) { + mLlVideo.setVisibility(View.VISIBLE); + for (int i = 0; i < b.getFileList().size(); i++) { + List fileList = b.getFileList(); + if (i == 0) { + fileList.get(i).setCheck(true); + } else { + fileList.get(i).setCheck(false); + } + } + mCategoryAdapter = new NewsCategoryAdapter(mActivity, b.getFileList()); + mRlvVideoCategory.setLayoutManager(new LinearLayoutManager(mActivity, LinearLayoutManager.HORIZONTAL, false)); + mRlvVideoCategory.setAdapter(mCategoryAdapter); + mCategoryAdapter.addOnItemClickListener(fileListBean -> { + for (int i = 0; i < b.getFileList().size(); i++) { + NewsDetailBean.FileListBean fileBean = b.getFileList().get(i); + if (fileBean.getContentFileFileId().equals(fileListBean.getContentFileFileId())) { + fileBean.setCheck(true); + } else { + fileBean.setCheck(false); + } + } + mCategoryAdapter.setData(b.getFileList()); + setVideoUrl(fileListBean); + }); + StandardVideoController controller = new StandardVideoController(mActivity); + controller.setEnableOrientation(true); + PrepareView prepareView = new PrepareView(this);//准备播放界面 + ImageView thumb = prepareView.findViewById(com.tengshisoft.moduleijkplayer.R.id.thumb);//封面图 + Glide.with(mActivity).load(com.tengshisoft.moduleijkplayer.R.drawable.ic_img_default).into(thumb); + controller.addControlComponent(prepareView); + prepareView.setClickStart(); + CompleteView completeView = new CompleteView(this); + controller.addControlComponent(completeView);//自动完成播放界面 + ErrorView errorView = new ErrorView(this); + controller.addControlComponent(errorView);//错误界面 + TitleView titleView = new TitleView(this);//标题栏 + controller.addControlComponent(titleView); + //根据是否为直播设置不同的底部控制条 + VodControlView vodControlView = new VodControlView(this);//点播控制条 + controller.addControlComponent(vodControlView); + GestureView gestureControlView = new GestureView(this);//滑动控制视图 + controller.addControlComponent(gestureControlView); + controller.setCanChangePosition(false); + //设置标题 + titleView.setTitle(mTitle); + mVideo.setVideoController(controller); + mVideo.setUrl(BaseUrlApi.BASE_IMG_URL + b.getFileList().get(0).getContentFileFileId()); + mTvVideoTxt.setText(b.getFileList().get(0).getContentFileText()); +// mVideo.addOnStateChangeListener(mOnStateChangeListener); +// mVideo.start(); } + /** + * 设置视频URL + */ + private void setVideoUrl(NewsDetailBean.FileListBean b) { + if (mVideo == null) { + return; + } + if (mVideo.isPlaying()) { + mVideo.pause(); + mVideo.release(); + } + mVideo.setUrl(BaseUrlApi.BASE_IMG_URL + b.getContentFileFileId()); + mVideo.start(); + mTvVideoTxt.setText(b.getContentFileText()); + } + + /** * 加载图片新闻 */ private void createImgView(NewsDetailBean b) { mRlImg.setVisibility(View.VISIBLE); List mBannerList = new ArrayList<>(); + int screenHeight = ScreenUtils.getScreenHeight(); + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(mBnImg.getLayoutParams()); + LogUtils.e(screenHeight); + params.height = screenHeight - ConvertUtils.dp2px(96) - 50; + mBnImg.setLayoutParams(params); for (int i = 0; i < b.getFileList().size(); i++) { NewsDetailBean.FileListBean fileListBean = b.getFileList().get(i); BaseImageBean bannerBean = new BaseImageBean(); -// bannerBean.setPhoto(BaseUrlApi.BASE_NEWS_IMG_URL + fileListBean.getContentFileFileId()); - if (i / 2 == 0) { -// bannerBean.setPhoto(BaseUrlApi.BASE_NEWS_IMG_URL + fileListBean.getContentFileFileId()); - bannerBean.setImgUrl("https://lmg.jj20.com/up/allimg/tp08/46042223542701-lp.jpg"); - } else { - bannerBean.setImgUrl("https://www.ssfiction.com/wp-content/uploads/2020/08/20200805_5f2b1669e9a24.jpg"); - } + bannerBean.setImgUrl(BaseUrlApi.BASE_NEWS_IMG_URL + fileListBean.getContentFileFileId()); bannerBean.setName(fileListBean.getContentFileText()); mBannerList.add(bannerBean); } BannerImageTextAllAdapter mBannerImageAdapter = new BannerImageTextAllAdapter(mBannerList); mBnImg.setAdapter(mBannerImageAdapter); mBnImg.setPageTransformer(new ScaleInTransformer()); - mBnImg.setDelayTime(10000L); + mBnImg.setDelayTime(12000L); mBnImg.start(); + + mIvImgLeft.setOnClickListener(v -> mBnImg.setCurrentItem(mBnImg.getCurrentItem() - 1)); + mIvImgRight.setOnClickListener(v -> mBnImg.setCurrentItem(mBnImg.getCurrentItem() + 1)); } /** @@ -1205,9 +1410,48 @@ public class NewsLocalDetailActivity extends BaseActivity { buttomDialogView.show(); } + + @Override + protected void onResume() { + super.onResume(); + if (mLlAudio.getVisibility() == View.VISIBLE) { + if (mAudio != null) { + mAudio.pause(); + } + } + if (mLlVideo.getVisibility() == View.VISIBLE) { + if (mVideo != null) { + mVideo.pause(); + } + } + } + + @Override + protected void onPause() { + super.onPause(); + if (mLlAudio.getVisibility() == View.VISIBLE) { + if (mAudio != null) { + mAudio.pause(); + } + } + if (mLlVideo.getVisibility() == View.VISIBLE) { + if (mVideo != null) { + mVideo.pause(); + } + } + } + @Override protected void onDestroy() { mContentView = null; + if (mAudio != null) { + mAudio.pause(); + mAudio.release(); + } + if (mVideo != null) { + mVideo.pause(); + mVideo.release(); + } if (mBind != null) { mBind.unbind(); } diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java index 3e0965f..a8b16c0 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsMainActivity.java @@ -94,7 +94,7 @@ public class NewsMainActivity extends BaseActivity { if (newsTabBeans != null && newsTabBeans.size() > 0) { NewsTabBean allBean = new NewsTabBean(); allBean.setDirectoriesName("全部"); - allBean.setNewsDirectoriesId(""); + allBean.setNewsDirectoriesId(mPId); allBean.setDirectoriesParentId(mPId); allBean.setDirectoriesView("2"); newsTabBeans.add(0, allBean); @@ -103,6 +103,7 @@ public class NewsMainActivity extends BaseActivity { for (int i = 0; i < newsTabBeans.size(); i++) { Bundle bundle = new Bundle(); bundle.putString("type", newsTabBeans.get(i).getNewsDirectoriesId()); + bundle.putBoolean("isAll","全部".equals(newsTabBeans.get(i).getDirectoriesName())); bundle.putString("pId", ""); BaseFragment fragment = null; //0 外部链接 1存在子集 2没有子集 diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java index 99246b4..59635a7 100644 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/activitys/news/NewsSearchActivity.java @@ -142,45 +142,46 @@ public class NewsSearchActivity extends BaseActivity { * @param type */ private void showNewsDetail(NewsItemBean.RowsBean rowsBean, int type) { - String url = ""; - if ("6".equals(rowsBean.getNewsContentType())) { - ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_WEB) - .withString("title", rowsBean.getNewsContentTitle()) - .withString("url", rowsBean.getNewsContentContent()) - .navigation(); - } else { - int newsType = 0; - if (type == 1) { - //1自定义列表 - //3列表详情 - if ("1".equals(rowsBean.getNewsConfigWebSwitch())) { - //列表 - url = rowsBean.getTemplateRecordUrl(); - newsType = 0; - } else { - //内容 - url = rowsBean.getNewsConfigDescriptionText(); - newsType = 1; - } - } else { - newsType = 0; - url = rowsBean.getTemplateRecordUrl(); - } - ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) //TODO 连接 -// .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE)//TODO 接口方式 - .withString("id", rowsBean.getNewsContentId()) - .withString("url", url) - .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 - .withString("isCommentImg", rowsBean.getNewsConfigCommentImage())//评论是否可以上传图片 - .withString("isCollect", rowsBean.getNewsContentCollectStatus()) - .withString("photo", - BaseUrlApi.BASE_NEWS_IMG_URL + rowsBean.getNewsContentCoverList().get(0).getContentCoverId()) - .withString("title", rowsBean.getNewsContentTitle()) - .withInt("type", newsType) - .navigation(); - } + ARouter.getInstance() +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) //TODO 连接 + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE)//TODO 接口方式 + .withString("id", rowsBean.getNewsContentId()) + .withString("url", "") + .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 + .withString("isCommentImg", rowsBean.getNewsConfigCommentImage())//评论是否可以上传图片 + .withString("isCollect", rowsBean.getNewsContentCollectStatus()) + .withString("photo", + BaseUrlApi.BASE_NEWS_IMG_URL + rowsBean.getNewsContentCoverList().get(0).getContentCoverId()) + .withString("title", rowsBean.getNewsContentTitle()) + .withInt("type", 2) + .navigation(); +// String url = ""; +// if ("6".equals(rowsBean.getNewsContentType())) { +// ARouter.getInstance() +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_WEB) +// .withString("title", rowsBean.getNewsContentTitle()) +// .withString("url", rowsBean.getNewsContentContent()) +// .navigation(); +// } else { +// int newsType = 0; +// if (type == 1) { +// //1自定义列表 +// //3列表详情 +// if ("1".equals(rowsBean.getNewsConfigWebSwitch())) { +// //列表 +// url = rowsBean.getTemplateRecordUrl(); +// newsType = 0; +// } else { +// //内容 +// url = rowsBean.getNewsConfigDescriptionText(); +// newsType = 1; +// } +// } else { +// newsType = 0; +// url = rowsBean.getTemplateRecordUrl(); +// } + +// } } /** diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsAdapter.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsAdapter.java index 2774ada..01b8232 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsAdapter.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/adapter/NewsAdapter.java @@ -50,7 +50,7 @@ public class NewsAdapter extends BaseRecyclerAdapter { + + public NewsCategoryAdapter(Context ctx, List list) { + super(ctx, list); + } + + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public NewsCategoryHolder createHolder(ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_news_category, parent, false); + return new NewsCategoryHolder(itemView); + } + + @Override + public void bindHolder(NewsCategoryHolder h, int i) { + NewsDetailBean.FileListBean b = mData.get(i); + if (b.isCheck()) { + h.mTvName.setBackgroundResource(R.drawable.shape_red_line_ra_2); + } else { + h.mTvName.setBackgroundResource(0); + } + h.mTvName.setText(String.valueOf(i + 1)); + } + + +} diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsDetailBean.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsDetailBean.java index 0a06f9e..d85fda1 100644 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsDetailBean.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/beans/NewsDetailBean.java @@ -338,6 +338,8 @@ public class NewsDetailBean { private String contentFileText; private String newsContentFileId; private String newsContentId; + private boolean isCheck; + public String getContentFileFileId() { return contentFileFileId; @@ -378,6 +380,15 @@ public class NewsDetailBean { public void setNewsContentId(String newsContentId) { this.newsContentId = newsContentId; } + + + public boolean isCheck() { + return isCheck; + } + + public void setCheck(boolean check) { + isCheck = check; + } } public static class NewsContentCoverListBean { diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java index 36a2eb0..e9db19a 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/HomeFragment.java @@ -101,6 +101,10 @@ public class HomeFragment extends BaseFragment { // LinearLayout mLlMainNews; @BindView(R2.id.ll_news_content) LinearLayout mLlNewsContent; + @BindView(R2.id.rl_main_func) + RelativeLayout mRlMainFunc; + @BindView(R2.id.rl_commend) + RelativeLayout mRlCommend; private Unbinder mBind; private List mFuncBeans = new ArrayList<>(); private List mBannerList = new ArrayList<>(); @@ -109,11 +113,13 @@ public class HomeFragment extends BaseFragment { private NewsAdapter mMAdapter; private ViewSkeletonScreen mNewsSkeleton; private MainCommendAdapter mCommendAdapter; - private RecyclerViewSkeletonScreen mCommendSkeleton; private ViewSkeletonScreen mBannerSkeleton; private RecyclerViewSkeletonScreen mLiveSkeleton; private LiveAdapter mLiveAdapter; private BannerImageTextAdapter mBannerImageAdapter; + private ViewSkeletonScreen mFuncSkeleton; + private MainFuncAdapter mFuncAdapter; + private ViewSkeletonScreen mCommendSkeleton; @Override protected void setDataToView(View dataView) { @@ -182,10 +188,6 @@ public class HomeFragment extends BaseFragment { mNewsSkeleton = Skeleton.bind(mLlNewsContent) .load(R.layout.item_skeleton_news_content) .show(); - mCommendSkeleton = Skeleton.bind(mRlvCommend) - .adapter(mCommendAdapter) - .load(R.layout.item_skeleton_image) - .show(); mBannerSkeleton = Skeleton.bind(mBanner) .load(R.layout.item_skeleton_banner) @@ -195,6 +197,14 @@ public class HomeFragment extends BaseFragment { .count(5) .load(R.layout.item_skeleton_live_grid) .show(); + + mFuncSkeleton = Skeleton.bind(mRlMainFunc) + .load(R.layout.item_skeleton_main_func_grid) + .show(); + mCommendSkeleton = Skeleton.bind(mRlCommend) + .load(R.layout.item_skeleton_main_func_grid) + .show(); + buildMainFuncMenu(null); buildBannerData(); getMainFuncMenu();//获取首页功能按钮 @@ -214,7 +224,7 @@ public class HomeFragment extends BaseFragment { } else { if (!TextUtils.isEmpty(bean.getId())) { ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) .withString("id", bean.getId()) .withString("url", bean.getUrl()) .withString("isComment", bean.getIsComment())//是否可以评论 @@ -278,6 +288,7 @@ public class HomeFragment extends BaseFragment { * 获取首页功能 */ private void getMainFuncMenu() { + mFuncSkeleton.show(); RetrofitManager.getInstance() .create(HomeApi.class) .getMainFunc() @@ -291,21 +302,21 @@ public class HomeFragment extends BaseFragment { @Override public void onNext(List newsTabBeans) { - if (newsTabBeans != null && newsTabBeans.size() > 0) { - buildMainFuncMenu(newsTabBeans); - } else { - - } + buildMainFuncMenu(newsTabBeans); } @Override public void onError(Throwable e) { e.printStackTrace(); + buildMainFuncMenu(null); } @Override public void onComplete() { mSrlView.finishRefresh(); + if (mFuncSkeleton != null) { + mFuncSkeleton.hide(); + } } }); } @@ -315,6 +326,9 @@ public class HomeFragment extends BaseFragment { * 3条场馆 3条活动 */ private void getMainCommendList() { + if (mCommendSkeleton != null) { + mCommendSkeleton.show(); + } Observable[] mObservales = new Observable[2]; Observable hot = RetrofitManager.getInstance() .create(HomeApi.class) @@ -387,6 +401,9 @@ public class HomeFragment extends BaseFragment { @Override public void onComplete() { mSrlView.finishRefresh(); + if (mCommendSkeleton != null) { + mCommendSkeleton.hide(); + } } }); @@ -479,8 +496,8 @@ public class HomeFragment extends BaseFragment { url = rowsBean.getTemplateRecordUrl(); } ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) //TODO 连接 -// .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE)//TODO 接口方式 +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) //TODO 连接 + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE)//TODO 接口方式 .withString("id", rowsBean.getNewsContentId()) .withString("url", url) .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 @@ -789,7 +806,9 @@ public class HomeFragment extends BaseFragment { */ private void buildMainFuncMenu(List list) { mFuncBeans.clear(); - + if (mFuncSkeleton != null) { + mFuncSkeleton.hide(); + } // MainFuncBean showBean = new MainFuncBean(); // showBean.setIconRes(R.drawable.ic_show_icon); @@ -836,12 +855,12 @@ public class HomeFragment extends BaseFragment { mFuncBeans.add(culturalBean); mFuncBeans.add(movieBean); - MainFuncAdapter funcAdapter = new MainFuncAdapter(getActivity(), mFuncBeans); + mFuncAdapter = new MainFuncAdapter(getActivity(), mFuncBeans); LinearLayoutManager manager = new LinearLayoutManager(mActivity, LinearLayoutManager.HORIZONTAL, false); mRlvMainFunc.setLayoutManager(manager); - mRlvMainFunc.setAdapter(funcAdapter); + mRlvMainFunc.setAdapter(mFuncAdapter); - funcAdapter.addOnItemClickListener(this::chooseFuncPage); + mFuncAdapter.addOnItemClickListener(this::chooseFuncPage); mRlvMainFunc.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java index f44f9b0..98b23ed 100755 --- a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/fragment/NewsFragment.java @@ -65,6 +65,7 @@ public class NewsFragment extends BaseFragment { private Disposable mD1; private Disposable mD2; private Disposable mDMenu; + private boolean mIsAll; @Override protected void setDataToView(View dataView) { @@ -73,6 +74,7 @@ public class NewsFragment extends BaseFragment { mAdapter = new NewsAdapter(mActivity, mNewsDatas); mType = getArguments().getString("type"); mPid = getArguments().getString("pId"); + mIsAll = getArguments().getBoolean("isAll"); mCurrentPage = 1; mTotalPage = 0; mNewsDatas.clear(); @@ -88,7 +90,9 @@ public class NewsFragment extends BaseFragment { .adapter(mAdapter) .load(R.layout.item_skeleton_news) .show(); - getNewsSubMenu(mType); + if (!mIsAll) { + getNewsSubMenu(mType); + } if (!TextUtils.isEmpty(UserLgUtils.getToken())) { getNewsListByTypeToken(mCurrentPage); @@ -137,8 +141,8 @@ public class NewsFragment extends BaseFragment { url = rowsBean.getTemplateRecordUrl(); } ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) -// .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) +// .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL)//TODO 详情模板 + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE)//TODO 接口方式 .withString("id", rowsBean.getNewsContentId()) .withString("url", url) .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 @@ -154,7 +158,7 @@ public class NewsFragment extends BaseFragment { private void getNewsListByTypeToken(int page) { RetrofitManager.getInstance() .create(HomeApi.class) - .getNewsListByToken(mType, "", page + "", UserLgUtils.getToken()) + .getNewsListByToken(mIsAll ? "" : mType, mIsAll ? mType : "", page + "", UserLgUtils.getToken()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -172,24 +176,24 @@ public class NewsFragment extends BaseFragment { if (newsItemBean != null && newsItemBean.getRows().size() > 0) { mTotalPage = newsItemBean.getTotal(); getCommentCount(1, newsItemBean); -// mNewsDatas = newsItemBean.getRows(); +// mNewsDatas.addAll(newsItemBean.getRows()); // mAdapter.setData(mNewsDatas); -// setStateView(STATE_SUCCESS); + setStateView(STATE_SUCCESS); } else { setStateView(STATE_EMPTY); } - mSrlView.finishRefresh(); + } else { if (newsItemBean != null) { // mNewsDatas.addAll(newsItemBean.getRows()); // mAdapter.setData(mNewsDatas); getCommentCount(2, newsItemBean); - mSrlView.finishLoadMore(); } else { mSrlView.setNoMoreData(true); } } - + mSrlView.finishLoadMore(); + mSrlView.finishRefresh(); } @Override @@ -218,7 +222,6 @@ public class NewsFragment extends BaseFragment { * @param id */ private void getNewsSubMenu(String id) { - RetrofitManager.getInstance() .create(HomeApi.class) .getNewsTabListByPid(id) @@ -262,7 +265,7 @@ public class NewsFragment extends BaseFragment { private void getNewsListByType(int page) { RetrofitManager.getInstance() .create(HomeApi.class) - .getNewsList(mType, "", page + "") + .getNewsList(mIsAll ? "" : mType, mIsAll ? mType : "", page + "") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { diff --git a/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/holder/NewsCategoryHolder.java b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/holder/NewsCategoryHolder.java new file mode 100755 index 0000000..681d633 --- /dev/null +++ b/modulemain/src/main/java/com/tengshisoft/mudulemain/cultural/holder/NewsCategoryHolder.java @@ -0,0 +1,24 @@ +package com.tengshisoft.mudulemain.cultural.holder; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.sucstepsoft.cm_utils.core.widget.views.TypeFaceTextView; +import com.tengshisoft.mudulemain.R; + +/** + * 作者: adam + * 日期: 2020/5/28 - 10:18 AM + * 邮箱: itgaojian@163.com + * 描述: + */ +public class NewsCategoryHolder extends RecyclerView.ViewHolder { + public TypeFaceTextView mTvName; + + public NewsCategoryHolder(@NonNull View itemView) { + super(itemView); + mTvName = itemView.findViewById(R.id.tv_category); + } +} diff --git a/modulemain/src/main/res/drawable-xhdpi/ic_audio_rotate_icon.png b/modulemain/src/main/res/drawable-xhdpi/ic_audio_rotate_icon.png new file mode 100644 index 0000000..2b85d63 Binary files /dev/null and b/modulemain/src/main/res/drawable-xhdpi/ic_audio_rotate_icon.png differ diff --git a/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_left.png b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_left.png new file mode 100644 index 0000000..af43ca2 Binary files /dev/null and b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_left.png differ diff --git a/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_right.png b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_right.png new file mode 100644 index 0000000..bc942d5 Binary files /dev/null and b/modulemain/src/main/res/drawable-xhdpi/ic_img_arrow_right.png differ diff --git a/modulemain/src/main/res/drawable/shape_white_line_ra_2.xml b/modulemain/src/main/res/drawable/shape_white_line_ra_2.xml new file mode 100755 index 0000000..bf9ad9b --- /dev/null +++ b/modulemain/src/main/res/drawable/shape_white_line_ra_2.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/modulemain/src/main/res/layout/activity_news_local_detail.xml b/modulemain/src/main/res/layout/activity_news_local_detail.xml index 814c367..b84c88d 100644 --- a/modulemain/src/main/res/layout/activity_news_local_detail.xml +++ b/modulemain/src/main/res/layout/activity_news_local_detail.xml @@ -97,16 +97,33 @@ android:layout_width="match_parent" android:layout_height="240dp" /> - + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="center_horizontal" + android:orientation="vertical"> + + + + + + android:visibility="gone" + tools:visibility="gone"> + + + + + android:visibility="gone" + tools:visibility="gone"> - + android:layout_height="240dp"> - + + + + + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:gravity="center_horizontal" + android:orientation="vertical"> + + + + + + android:layout_marginTop="10dp" + android:orientation="vertical" + android:paddingLeft="10dp" + android:paddingRight="10dp"> + @@ -93,6 +94,7 @@ android:background="@color/gray_line" /> diff --git a/modulemain/src/main/res/layout/fragment_news.xml b/modulemain/src/main/res/layout/fragment_news.xml index 7fe1cce..daf69b3 100755 --- a/modulemain/src/main/res/layout/fragment_news.xml +++ b/modulemain/src/main/res/layout/fragment_news.xml @@ -1,6 +1,5 @@ - + android:layout_height="match_parent" + android:fillViewport="true"> - + + + + + + + \ No newline at end of file diff --git a/modulemain/src/main/res/layout/item_news_category.xml b/modulemain/src/main/res/layout/item_news_category.xml new file mode 100644 index 0000000..c7f4f9d --- /dev/null +++ b/modulemain/src/main/res/layout/item_news_category.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/modulemain/src/main/res/layout/item_skeleton_main_func_grid.xml b/modulemain/src/main/res/layout/item_skeleton_main_func_grid.xml new file mode 100755 index 0000000..cebf4d0 --- /dev/null +++ b/modulemain/src/main/res/layout/item_skeleton_main_func_grid.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modulemine/src/main/java/com/tengshisoft/modulemine/activity/CollectActivity.java b/modulemine/src/main/java/com/tengshisoft/modulemine/activity/CollectActivity.java index c4084cd..ec4bbb5 100755 --- a/modulemine/src/main/java/com/tengshisoft/modulemine/activity/CollectActivity.java +++ b/modulemine/src/main/java/com/tengshisoft/modulemine/activity/CollectActivity.java @@ -92,7 +92,7 @@ public class CollectActivity extends BaseActivity { url = rowsBean.getTemplateRecordUrl(); } ARouter.getInstance() - .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL) + .build(PathConfig.PATH_MODULE_MAIN_NEWS_DETAIL_INTERFACE) .withString("id", rowsBean.getNewsContentId()) .withString("url", url) .withString("isComment", rowsBean.getNewsConfigComment())//是否可以评论 diff --git a/moduleplace/src/main/java/com/tengshisoft/moduleplace/adapter/PlaceFuncAdapter.java b/moduleplace/src/main/java/com/tengshisoft/moduleplace/adapter/PlaceFuncAdapter.java index 1e34857..cefb008 100755 --- a/moduleplace/src/main/java/com/tengshisoft/moduleplace/adapter/PlaceFuncAdapter.java +++ b/moduleplace/src/main/java/com/tengshisoft/moduleplace/adapter/PlaceFuncAdapter.java @@ -6,6 +6,7 @@ import android.view.View; import android.view.ViewGroup; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.sucstepsoft.cm_utils.core.retrofit_net.BaseUrlApi; import com.sucstepsoft.cm_utils.core.widget.base.BaseRecyclerAdapter; import com.tengshisoft.moduleplace.R; @@ -36,6 +37,7 @@ public class PlaceFuncAdapter extends BaseRecyclerAdapter + android:orientation="horizontal" + android:padding="5dp"> - + android:layout_height="match_parent" + android:fillViewport="true"> + + +