Commit 232a8705 by 段启岩

动态列表接入

parent 64224296
......@@ -56,8 +56,8 @@ dependencies {
implementation 'com.github.hackware1993:MagicIndicator:1.5.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
implementation 'org.jetbrains:annotations:15.0'
implementation 'org.projectlombok:lombok:1.16.8' //添加lombok依赖
implementation 'org.jetbrains:annotations:19.0.0'
implementation 'org.projectlombok:lombok:1.18.12' //添加lombok依赖
implementation 'org.glassfish:javax.annotation:10.0-b28' //java注解
implementation 'com.google.dagger:dagger:2.26'
annotationProcessor 'com.google.dagger:dagger-compiler:2.26'
......
package cn.yunliyunwai.beyondclouds.adapter;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.databinding.BlogItemBinding;
import cn.yunliyunwai.beyondclouds.util.DateUtils;
import cn.yunliyunwai.beyondclouds.util.GlideRoundTransform;
public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseViewHolder> {
private static final GlideRoundTransform glideRoundTransform = new GlideRoundTransform(3);
public DynamicListRecyclerViewAdapter(int layoutResId) {
super(layoutResId);
}
@Override
protected void convert(BaseViewHolder helper, Post post) {
BlogItemBinding binding = BlogItemBinding.bind(helper.itemView);
binding.txtTitle.setText(post.getContent());
binding.txtAbstract.setText(post.getContent());
binding.txtAuthor.setText(post.getUserNick());
binding.txtCreateTime.setText(DateUtils.format(post.getCreateTime()));
/*if (null != post.getCover() && !TextUtils.isEmpty(post.getCover().trim()) && post.getCover().startsWith("http")) {
binding.blogCover.setVisibility(View.VISIBLE);
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.pre_load_blog)
.error(R.drawable.pre_load_blog)
.priority(Priority.HIGH)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.transform(glideRoundTransform);
Glide.with(binding.getRoot()).applyDefaultRequestOptions(options).load(post.getCover()).into(binding.blogCover);
} else {
binding.blogCover.setVisibility(View.GONE);
}*/
}
}
\ No newline at end of file
......@@ -12,6 +12,16 @@ public class CommonCategory implements Parcelable {
private static final String CATEGORY_NAME_LATEST = "最新";
private static final String CATEGORY_NAME_FOLLOW = "关注";
private static final String CATEGORY_NAME_MY = "我的";
private static final String CATEGORY_NAME_WORDS = "文字";
private static final String CATEGORY_NAME_VIDEOS = "视频";
private static final String CATEGORY_NAME_PHOTOS = "图片";
private static final String CATEGORY_NAME_HOTS = "热门";
protected CommonCategory(Parcel in) {
......@@ -46,18 +56,77 @@ public class CommonCategory implements Parcelable {
private String categoryName;
private CategoryType categoryType;
/**
* 推荐
* @return
*/
public static CommonCategory recommend() {
return new CommonCategory(null, CATEGORY_NAME_RECOMMEND, CategoryType.RECOMMEND);
}
/**
* 最新
* @return
*/
public static CommonCategory latest() {
return new CommonCategory(null, CATEGORY_NAME_LATEST, CategoryType.LATEST);
}
/**
* 关注
* @return
*/
public static CommonCategory follow() {
return new CommonCategory(null, CATEGORY_NAME_FOLLOW, CategoryType.FOLLOW);
}
/**
* 我的
* @return
*/
public static CommonCategory my() {
return new CommonCategory(null, CATEGORY_NAME_MY, CategoryType.MY);
}
/**
* 视频
* @return
*/
public static CommonCategory videos() {
return new CommonCategory(null, CATEGORY_NAME_VIDEOS, CategoryType.VIDEOS);
}
/**
* 文字
* @return
*/
public static CommonCategory words() {
return new CommonCategory(null, CATEGORY_NAME_WORDS, CategoryType.WORDS);
}
/**
* 图片
* @return
*/
public static CommonCategory photos() {
return new CommonCategory(null, CATEGORY_NAME_PHOTOS, CategoryType.PHOTOS);
}
/**
* 热门
* @return
*/
public static CommonCategory hots() {
return new CommonCategory(null, CATEGORY_NAME_HOTS, CategoryType.HOTS);
}
/**
* 实际栏目
* @param categoryId
* @param categoryName
* @return
*/
public static CommonCategory real(Integer categoryId, String categoryName) {
return new CommonCategory(categoryId, categoryName, CategoryType.REAL);
}
......@@ -75,15 +144,15 @@ public class CommonCategory implements Parcelable {
}
public enum CategoryType implements Parcelable {
RECOMMEND(0),
HOTS(1),
LATEST(2),
REAL(3);
private int value;
CategoryType(int value) {
this.value = value;
}
RECOMMEND,
HOTS,
LATEST,
FOLLOW,
MY,
VIDEOS,
WORDS,
PHOTOS,
REAL;
public static final Creator<CategoryType> CREATOR = new Creator<CategoryType>() {
@Override
......
package cn.yunliyunwai.beyondclouds.data.model;
import java.util.Date;
import java.util.List;
import lombok.Data;
@Data
public class Post {
private String postId;
private String userNick;
private String userAvatar;
private String video;
private List<String> pictures;
private String content;
private Date createTime;
}
package cn.yunliyunwai.beyondclouds.data.source;
import androidx.lifecycle.LiveData;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.data.model.Result;
public interface IPostRepository {
LiveData<Result<Page<Post>>> getLatestPostList(Integer type, Integer page, int pageSize);
LiveData<Result<Page<Post>>> getRecommendPostList(Integer page, int pageSize);
}
package cn.yunliyunwai.beyondclouds.data.source;
package cn.yunliyunwai.beyondclouds.data.source.impl;
import androidx.lifecycle.LiveData;
......@@ -11,6 +11,7 @@ import cn.yunliyunwai.beyondclouds.data.model.Blog;
import cn.yunliyunwai.beyondclouds.data.model.BlogCategory;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.source.IBlogRepository;
import cn.yunliyunwai.beyondclouds.data.source.local.database.BlogDatabase;
import cn.yunliyunwai.beyondclouds.data.source.remote.BlogApiStore;
......
package cn.yunliyunwai.beyondclouds.data.source.impl;
import androidx.lifecycle.LiveData;
import javax.inject.Inject;
import javax.inject.Singleton;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.source.IPostRepository;
import cn.yunliyunwai.beyondclouds.data.source.remote.PostApiStore;
@Singleton
public class PostRepositoryImpl implements IPostRepository {
PostApiStore postApiStore;
@Inject
public PostRepositoryImpl(PostApiStore postApiStore) {
this.postApiStore = postApiStore;
}
@Override
public LiveData<Result<Page<Post>>> getLatestPostList(Integer type, Integer page, int pageSize) {
return postApiStore.getLatestPostList(type, page, pageSize);
}
@Override
public LiveData<Result<Page<Post>>> getRecommendPostList(Integer page, int pageSize) {
return postApiStore.getRecommendBlogList(page, pageSize);
}
}
package cn.yunliyunwai.beyondclouds.data.source;
package cn.yunliyunwai.beyondclouds.data.source.impl;
import androidx.lifecycle.LiveData;
......@@ -11,6 +11,7 @@ import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Project;
import cn.yunliyunwai.beyondclouds.data.model.ProjectCategory;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.source.IProjectRepository;
import cn.yunliyunwai.beyondclouds.data.source.local.database.ProjectDatabase;
import cn.yunliyunwai.beyondclouds.data.source.remote.ProjectApiStore;
......
package cn.yunliyunwai.beyondclouds.data.source.remote;
import androidx.lifecycle.LiveData;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface PostApiStore {
/**
* 推荐动态
* @param page
* @param pageSize
* @return
*/
@GET("post/recommends")
LiveData<Result<Page<Post>>> getRecommendBlogList(@Query("page") Integer page,
@Query("size") int pageSize);
/**
* 最新动态
* @param page
* @param pageSize
* @return
*/
@GET("posts")
LiveData<Result<Page<Post>>> getLatestPostList(@Query("type") Integer type, @Query("page") Integer page,
@Query("size") int pageSize);
}
......@@ -8,6 +8,8 @@ import cn.yunliyunwai.beyondclouds.MainActivity;
import cn.yunliyunwai.beyondclouds.di.module.AppModule;
import cn.yunliyunwai.beyondclouds.di.module.AppModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.BlogListFragmentModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.DynamicFragmentModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.DynamicListFragmentModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.HomeFragmentModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.ProjectFragmentModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.ProjectListFragmentModuleBinds;
......@@ -23,8 +25,10 @@ import dagger.Component;
ViewModelFactory.ViewModelBuilderModule.class,
HomeFragmentModuleBinds.class,
ProjectFragmentModuleBinds.class,
DynamicFragmentModuleBinds.class,
BlogListFragmentModuleBinds.class,
ProjectListFragmentModuleBinds.class,
DynamicListFragmentModuleBinds.class,
SplashActivityModuleBinds.class
})
public interface AppComponent {
......@@ -38,6 +42,10 @@ public interface AppComponent {
ProjectFragmentComponent.Factory projectFragmentComponent();
DynamicFragmentComponent.Factory dynamicFragmentComponent();
DynamicListFragmentComponent.Factory dynamicListFragmentComponent();
SplashActivityComponent.Factory splashActivityComponent();
BlogListFragmentComponent.Factory blogListFragmentComponent();
......
package cn.yunliyunwai.beyondclouds.di.component;
import cn.yunliyunwai.beyondclouds.ui.DynamicFragment;
import dagger.Subcomponent;
@Subcomponent
public interface DynamicFragmentComponent {
@Subcomponent.Factory
interface Factory {
DynamicFragmentComponent create();
}
void inject(DynamicFragment dynamicFragment);
}
package cn.yunliyunwai.beyondclouds.di.component;
import cn.yunliyunwai.beyondclouds.ui.DynamicFragment;
import dagger.Subcomponent;
@Subcomponent
public interface DynamicListFragmentComponent {
@Subcomponent.Factory
interface Factory {
DynamicListFragmentComponent create();
}
void inject(DynamicFragment.DynamicListFragment dynamicListFragment);
}
......@@ -21,6 +21,7 @@ import cn.yunliyunwai.beyondclouds.adapter.common.LiveDataCallAdapterFactory;
import cn.yunliyunwai.beyondclouds.data.source.local.database.BlogDatabase;
import cn.yunliyunwai.beyondclouds.data.source.local.database.ProjectDatabase;
import cn.yunliyunwai.beyondclouds.data.source.remote.BlogApiStore;
import cn.yunliyunwai.beyondclouds.data.source.remote.PostApiStore;
import cn.yunliyunwai.beyondclouds.data.source.remote.ProjectApiStore;
import cn.yunliyunwai.beyondclouds.util.AppExecutors;
import dagger.Module;
......@@ -46,6 +47,12 @@ public class AppModule {
@Singleton
@Provides
public PostApiStore providePostApiRemoteDataSource(Retrofit retrofit) {
return retrofit.create(PostApiStore.class);
}
@Singleton
@Provides
BlogDatabase provideBlogDatabase(Context context) {
return Room
.databaseBuilder(context.getApplicationContext(),
......
......@@ -4,10 +4,12 @@ import androidx.lifecycle.ViewModel;
import javax.inject.Singleton;
import cn.yunliyunwai.beyondclouds.data.source.BlogRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.IBlogRepository;
import cn.yunliyunwai.beyondclouds.data.source.IPostRepository;
import cn.yunliyunwai.beyondclouds.data.source.IProjectRepository;
import cn.yunliyunwai.beyondclouds.data.source.ProjectRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.impl.BlogRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.impl.PostRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.impl.ProjectRepositoryImpl;
import cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel;
import dagger.Binds;
import dagger.Module;
......@@ -25,6 +27,10 @@ public abstract class AppModuleBinds {
@Binds
abstract IProjectRepository bindProjectRepository(ProjectRepositoryImpl projectRepository);
@Singleton
@Binds
abstract IPostRepository bindPostRepository(PostRepositoryImpl postRepository);
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(MainActivityViewModel.class)
......
......@@ -9,11 +9,11 @@ import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = BlogListFragmentComponent.class)
public abstract class BlogListFragmentModuleBinds {
public interface BlogListFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(BlogListFragmentViewModel.class)
abstract ViewModel bindBlogListFragmentViewModel(BlogListFragmentViewModel blogListFragmentViewModel);
ViewModel bindBlogListFragmentViewModel(BlogListFragmentViewModel blogListFragmentViewModel);
}
package cn.yunliyunwai.beyondclouds.di.module;
import androidx.lifecycle.ViewModel;
import cn.yunliyunwai.beyondclouds.di.component.DynamicFragmentComponent;
import cn.yunliyunwai.beyondclouds.viewmodel.DynamicFragmentViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = DynamicFragmentComponent.class)
public interface DynamicFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(DynamicFragmentViewModel.class)
ViewModel bindDynamicFragmentViewModel(DynamicFragmentViewModel dynamicFragmentViewModel);
}
package cn.yunliyunwai.beyondclouds.di.module;
import androidx.lifecycle.ViewModel;
import cn.yunliyunwai.beyondclouds.di.component.DynamicListFragmentComponent;
import cn.yunliyunwai.beyondclouds.viewmodel.DynamicListFragmentViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = DynamicListFragmentComponent.class)
public interface DynamicListFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(DynamicListFragmentViewModel.class)
ViewModel bindDynamicListFragmentViewModel(DynamicListFragmentViewModel dynamicListFragmentViewModel);
}
......@@ -9,11 +9,11 @@ import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = HomeFragmentComponent.class)
public abstract class HomeFragmentModuleBinds {
public interface HomeFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(HomeFragmentViewModel.class)
abstract ViewModel bindHomeFragmentViewModel(HomeFragmentViewModel homeFragmentViewModel);
ViewModel bindHomeFragmentViewModel(HomeFragmentViewModel homeFragmentViewModel);
}
......@@ -9,11 +9,11 @@ import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = ProjectFragmentComponent.class)
public abstract class ProjectFragmentModuleBinds {
public interface ProjectFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(ProjectFragmentViewModel.class)
abstract ViewModel bindProjectFragmentViewModel(ProjectFragmentViewModel projectFragmentViewModel);
ViewModel bindProjectFragmentViewModel(ProjectFragmentViewModel projectFragmentViewModel);
}
......@@ -9,11 +9,11 @@ import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = ProjectListFragmentComponent.class)
public abstract class ProjectListFragmentModuleBinds {
public interface ProjectListFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(ProjectListFragmentViewModel.class)
abstract ViewModel bindProjectListFragmentViewModel(ProjectListFragmentViewModel projectListFragmentViewModel);
ViewModel bindProjectListFragmentViewModel(ProjectListFragmentViewModel projectListFragmentViewModel);
}
......@@ -9,11 +9,11 @@ import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = SplashActivityComponent.class)
public abstract class SplashActivityModuleBinds {
public interface SplashActivityModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(SplashActivityViewModel.class)
abstract ViewModel bindSplashActivityViewModel(SplashActivityViewModel splashActivityViewModel);
ViewModel bindSplashActivityViewModel(SplashActivityViewModel splashActivityViewModel);
}
......@@ -7,32 +7,77 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.R;
import cn.yunliyunwai.beyondclouds.adapter.DynamicListRecyclerViewAdapter;
import cn.yunliyunwai.beyondclouds.base.BaseFragment;
import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.databinding.FragmentDynamicBinding;
import cn.yunliyunwai.beyondclouds.ui.common.FragmentFactory;
import cn.yunliyunwai.beyondclouds.ui.common.RefreshableFragment;
import cn.yunliyunwai.beyondclouds.util.CategoryViewpagerUtils;
import cn.yunliyunwai.beyondclouds.util.ContextUtils;
import cn.yunliyunwai.beyondclouds.viewmodel.DynamicFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.DynamicListFragmentViewModel;
public class DynamicFragment extends BaseFragment<DynamicFragmentViewModel, FragmentDynamicBinding> {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Inject
ViewModelProvider.Factory factory;
@Override
protected void initInject() {
ContextUtils.getAppComponent(requireActivity()).dynamicFragmentComponent().create().inject(this);
}
@Override
protected DynamicFragmentViewModel initViewModel() {
return new ViewModelProvider(this, DynamicFragmentViewModel.factory).get(DynamicFragmentViewModel.class);
return new ViewModelProvider(this, factory).get(DynamicFragmentViewModel.class);
}
@Override
protected FragmentDynamicBinding initDataBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
return FragmentDynamicBinding.inflate(inflater, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
CategoryViewpagerUtils.bindViewPager(this, new FragmentFactory() {
@Override
public Fragment create() {
return new DynamicListFragment();
}
}, binding.magicIndicator, binding.viewPager, viewModel);
}
public static class DynamicListFragment extends RefreshableFragment<Post, DynamicListFragmentViewModel> {
@Inject
ViewModelProvider.Factory factory;
@Override
protected void initInject() {
ContextUtils.getAppComponent(requireActivity()).dynamicListFragmentComponent().create().inject(this);
}
@Override
protected DynamicListFragmentViewModel initViewModel() {
return new ViewModelProvider(this, factory).get(DynamicListFragmentViewModel.class);
}
@Override
protected BaseQuickAdapter<Post, BaseViewHolder> createAdapter() {
return new DynamicListRecyclerViewAdapter(R.layout.dynamic_item);
}
}
}
......@@ -99,8 +99,6 @@ public abstract class RefreshableFragment<T, VM extends PageableViewModel<T>> ex
binding.swipeRefreshLayout.setOnRefreshListener(this);
}
protected abstract BaseQuickAdapter<T, BaseViewHolder> createAdapter();
@Override
public void onResume() {
super.onResume();
......@@ -114,4 +112,6 @@ public abstract class RefreshableFragment<T, VM extends PageableViewModel<T>> ex
public void onRefresh() {
viewModel.loadFirstPage(category);
}
protected abstract BaseQuickAdapter<T, BaseViewHolder> createAdapter();
}
\ No newline at end of file
package cn.yunliyunwai.beyondclouds.viewmodel;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
public class DynamicFragmentViewModel extends ViewModel {
public static ViewModelProvider.Factory factory = new ViewModelProvider.Factory() {
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new DynamicFragmentViewModel();
}
};
import java.util.Arrays;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.data.model.CommonCategory;
import cn.yunliyunwai.beyondclouds.viewmodel.common.CategoryViewModel;
public class DynamicFragmentViewModel extends CategoryViewModel {
@Inject
public DynamicFragmentViewModel() {
}
@Override
public void loadCategories() {
refreshCategories(Arrays.asList(
CommonCategory.recommend(),
CommonCategory.latest(),
CommonCategory.follow(),
CommonCategory.my(),
CommonCategory.words(),
CommonCategory.photos(),
CommonCategory.videos()
));
}
}
package cn.yunliyunwai.beyondclouds.viewmodel;
import androidx.lifecycle.Observer;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.data.model.CommonCategory;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.source.IPostRepository;
import cn.yunliyunwai.beyondclouds.viewmodel.common.PageableViewModel;
public class DynamicListFragmentViewModel extends PageableViewModel<Post> {
IPostRepository postRepository;
@Inject
public DynamicListFragmentViewModel(IPostRepository postRepository) {
this.postRepository = postRepository;
}
@Override
public void doRequest(CommonCategory category, int page, int defaultPageSize, Observer<Result<Page<Post>>> observer) {
switch (category.getCategoryType()) {
case RECOMMEND:
postRepository.getRecommendPostList(page, defaultPageSize).observeForever(observer);
break;
case LATEST:
case FOLLOW:
case MY:
postRepository.getLatestPostList(null, page, defaultPageSize).observeForever(observer);
break;
case WORDS:
postRepository.getLatestPostList(0, page, defaultPageSize).observeForever(observer);
break;
case PHOTOS:
postRepository.getLatestPostList(1, page, defaultPageSize).observeForever(observer);
break;
case VIDEOS:
postRepository.getLatestPostList(2, page, defaultPageSize).observeForever(observer);
break;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background_white_touchable"
android:clickable="true"
android:paddingStart="12dp"
android:paddingLeft="12dp"
android:paddingTop="16dp"
android:paddingEnd="12dp"
android:paddingRight="12dp">
<TextView
android:id="@+id/txt_title"
android:layout_width="wrap_content"
android:layout_height="22dp"
android:text="SpringBoot迭代发布JRA瘦身配置"
android:textSize="16sp"
android:textColor="@color/colorTextAccent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="txt_title"
tools:layout_editor_absoluteX="12dp"
tools:layout_editor_absoluteY="16dp" />
<TextView
android:id="@+id/txt_abstract"
android:layout_marginTop="10dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxHeight="55dp"
android:textSize="12sp"
android:paddingEnd="10dp"
android:paddingRight="10dp"
android:text="我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代"
app:layout_constraintTop_toBottomOf="@id/barrier_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/blog_cover"/>
<ImageView
android:layout_marginTop="10dp"
android:id="@+id/blog_cover"
app:layout_constraintTop_toBottomOf="@id/barrier_title"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="82dp"
android:layout_height="55dp"
android:maxWidth="82dp"
android:maxHeight="55dp"
android:src="@drawable/pic1" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="txt_abstract,blog_cover"
tools:layout_editor_absoluteX="12dp"
tools:layout_editor_absoluteY="16dp" />
<TextView
android:id="@+id/txt_author"
android:layout_marginTop="10dp"
android:text="段启岩"
android:textSize="10sp"
android:textColor="@color/colorText"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/barrier_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txt_dot"
android:text="·"
android:layout_marginTop="10dp"
android:textSize="10sp"
android:textStyle="bold"
android:textColor="@color/colorText"
app:layout_constraintTop_toBottomOf="@id/barrier_content"
app:layout_constraintStart_toEndOf="@id/txt_author"
android:paddingStart="6dp"
android:paddingLeft="6dp"
android:paddingEnd="6dp"
android:paddingRight="6dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/txt_create_time"
android:layout_marginTop="10dp"
android:textSize="10sp"
android:textColor="@color/colorText"
android:text="2020-2-18 10:24:00"
app:layout_constraintTop_toBottomOf="@id/barrier_content"
app:layout_constraintStart_toEndOf="@id/txt_dot"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="txt_create_time,txt_author,txt_dot"
tools:layout_editor_absoluteX="12dp"
tools:layout_editor_absoluteY="16dp" />
<View
app:layout_constraintTop_toBottomOf="@id/barrier_info"
android:layout_marginTop="18dp"
android:layout_width="0dp"
android:layout_height="1dp"
android:background="#efefef" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -5,14 +5,32 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
<net.lucode.hackware.magicindicator.MagicIndicator
android:id="@+id/magic_indicator"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorWhite"
android:paddingStart="6dp"
android:paddingLeft="6dp"
android:paddingEnd="6dp"
android:paddingRight="6dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<cn.yunliyunwai.beyondclouds.view.BeyondSearchBar
android:id="@+id/search_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="动态"
android:textSize="24dp"
app:layout_constraintTop_toBottomOf="@id/magic_indicator"
app:search_input_hint="搜索话题/用户" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toBottomOf="@id/search_bar" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -17,5 +17,3 @@ org.gradle.jvmargs=-Xmx1536m
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
android.enableSeparateAnnotationProcessing=true
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment