Commit 5ac2e857 by 段启岩

问答列表接入完成

parent 995b65ba
......@@ -5,7 +5,7 @@ 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.databinding.PostItemBinding;
import cn.yunliyunwai.beyondclouds.util.DateUtils;
import cn.yunliyunwai.beyondclouds.util.GlideRoundTransform;
......@@ -18,7 +18,7 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
@Override
protected void convert(BaseViewHolder helper, Post post) {
BlogItemBinding binding = BlogItemBinding.bind(helper.itemView);
PostItemBinding binding = PostItemBinding.bind(helper.itemView);
binding.txtTitle.setText(post.getContent());
binding.txtAbstract.setText(post.getContent());
......
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.Question;
import cn.yunliyunwai.beyondclouds.databinding.QuestionItemBinding;
import cn.yunliyunwai.beyondclouds.util.DateUtils;
import cn.yunliyunwai.beyondclouds.util.GlideRoundTransform;
public class QuestionListRecyclerViewAdapter extends BaseQuickAdapter<Question,BaseViewHolder> {
private static final GlideRoundTransform glideRoundTransform = new GlideRoundTransform(3);
public QuestionListRecyclerViewAdapter(int layoutResId) {
super(layoutResId);
}
@Override
protected void convert(BaseViewHolder helper, Question question) {
QuestionItemBinding binding = QuestionItemBinding.bind(helper.itemView);
binding.txtTitle.setText(question.getQuestionTitle());
binding.txtAbstract.setText(question.getQuestionAbstract());
binding.txtAuthor.setText(question.getUserNick());
binding.txtCreateTime.setText(DateUtils.format(question.getCreateTime()));
}
}
\ No newline at end of file
......@@ -50,7 +50,6 @@ public class CategoryNavigatorAdapter extends CommonNavigatorAdapter {
indicator.setMode(CommonPagerIndicator.MODE_EXACTLY);
indicator.setDrawableHeight(2 * density);
indicator.setDrawableWidth(8 * density);
indicator.setX(1 * density);
return indicator;
}
......
package cn.yunliyunwai.beyondclouds.data.model;
import java.util.Date;
import lombok.Data;
@Data
public class Question {
private String questionId;
private String questionTitle;
private String questionAbstract;
private String userNick;
private Date createTime;
}
package cn.yunliyunwai.beyondclouds.data.model;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import androidx.room.TypeConverters;
import java.util.Date;
import cn.yunliyunwai.beyondclouds.data.converters.DateConverters;
@Entity(tableName = "QuestionCategory")
public class QuestionCategory {
@PrimaryKey
@ColumnInfo(name = "category_id")
private Integer categoryId;
@ColumnInfo(name = "category")
private String category;
@ColumnInfo(name = "priority")
private Integer priority;
@TypeConverters(DateConverters.class)
@ColumnInfo(name = "create_time")
private Date createTime;
public Integer getCategoryId() {
return categoryId;
}
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Integer getPriority() {
return priority;
}
public void setPriority(Integer priority) {
this.priority = priority;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
......@@ -15,12 +15,13 @@ public interface IBlogRepository {
* 获取博客类别
* @return
*/
LiveData<Result<List<BlogCategory>>> getCategories();
LiveData<Result<List<BlogCategory>>> fetchCategories();
LiveData<List<BlogCategory>> loadCategoriesFromLocal();
LiveData<List<BlogCategory>> loadCategoriesFromCache();
LiveData<Result<Page<Blog>>> getBlogList(Integer categoryId, Integer page, Integer size);
void saveCategories(List<BlogCategory> data);
LiveData<Result<Page<Blog>>> fetchBlogList(Integer categoryId, Integer page, Integer size);
LiveData<Result<Page<Blog>>> getHotBlogList(Integer page, int pageSize);
void makeCategoriesCache(List<BlogCategory> data);
LiveData<Result<Page<Blog>>> fetchHotBlogList(Integer page, int pageSize);
}
......@@ -15,12 +15,13 @@ public interface IProjectRepository {
* 获取博客类别
* @return
*/
LiveData<Result<List<ProjectCategory>>> getCategories();
LiveData<Result<List<ProjectCategory>>> fetchCategories();
LiveData<List<ProjectCategory>> loadCategoriesFromLocal();
LiveData<List<ProjectCategory>> loadCategoriesFromCache();
LiveData<Result<Page<Project>>> getProjectList(Integer categoryId, Integer page, Integer size);
void saveCategories(List<ProjectCategory> data);
LiveData<Result<Page<Project>>> fetchProjectList(Integer categoryId, Integer page, Integer size);
LiveData<Result<Page<Project>>> getHotProjectList(Integer page, int pageSize);
void makeCategoriesCache(List<ProjectCategory> categories);
LiveData<Result<Page<Project>>> fetchHotProjectList(Integer page, int pageSize);
}
package cn.yunliyunwai.beyondclouds.data.source;
import androidx.lifecycle.LiveData;
import java.util.List;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Question;
import cn.yunliyunwai.beyondclouds.data.model.QuestionCategory;
import cn.yunliyunwai.beyondclouds.data.model.Result;
public interface IQuestionRepository {
/**
* 获取博客类别
* @return
*/
LiveData<Result<List<QuestionCategory>>> fetchCategories();
LiveData<List<QuestionCategory>> loadCategoriesFromCache();
LiveData<Result<Page<Question>>> fetchQuestionList(Integer categoryId, Integer page, Integer size);
void makeCategoriesCache(List<QuestionCategory> categories);
LiveData<Result<Page<Question>>> fetchHotQuestionList(Integer page, int pageSize);
}
......@@ -30,27 +30,27 @@ public class BlogRepositoryImpl implements IBlogRepository {
}
@Override
public LiveData<Result<List<BlogCategory>>> getCategories() {
public LiveData<Result<List<BlogCategory>>> fetchCategories() {
return blogApiStore.getCategories();
}
@Override
public LiveData<List<BlogCategory>> loadCategoriesFromLocal() {
public LiveData<List<BlogCategory>> loadCategoriesFromCache() {
return blogDatabase.blogDao().getCategories();
}
@Override
public LiveData<Result<Page<Blog>>> getBlogList(Integer categoryId, Integer page, Integer size) {
public LiveData<Result<Page<Blog>>> fetchBlogList(Integer categoryId, Integer page, Integer size) {
return blogApiStore.getBlogList(categoryId, page, size);
}
@Override
public void saveCategories(List<BlogCategory> categories) {
public void makeCategoriesCache(List<BlogCategory> categories) {
blogDatabase.blogDao().saveCategories(categories);
}
@Override
public LiveData<Result<Page<Blog>>> getHotBlogList(Integer page, int pageSize) {
public LiveData<Result<Page<Blog>>> fetchHotBlogList(Integer page, int pageSize) {
return blogApiStore.getHotBlogList(page, pageSize);
}
}
......@@ -30,27 +30,27 @@ public class ProjectRepositoryImpl implements IProjectRepository {
}
@Override
public LiveData<Result<List<ProjectCategory>>> getCategories() {
public LiveData<Result<List<ProjectCategory>>> fetchCategories() {
return projectApiStore.getCategories();
}
@Override
public LiveData<List<ProjectCategory>> loadCategoriesFromLocal() {
public LiveData<List<ProjectCategory>> loadCategoriesFromCache() {
return projectDatabase.projectDao().getCategories();
}
@Override
public LiveData<Result<Page<Project>>> getProjectList(Integer categoryId, Integer page, Integer size) {
public LiveData<Result<Page<Project>>> fetchProjectList(Integer categoryId, Integer page, Integer size) {
return projectApiStore.getProjectList(categoryId, page, size);
}
@Override
public void saveCategories(List<ProjectCategory> categories) {
public void makeCategoriesCache(List<ProjectCategory> categories) {
projectDatabase.projectDao().saveCategories(categories);
}
@Override
public LiveData<Result<Page<Project>>> getHotProjectList(Integer page, int pageSize) {
public LiveData<Result<Page<Project>>> fetchHotProjectList(Integer page, int pageSize) {
return projectApiStore.getHotProjectList(page, pageSize);
}
}
package cn.yunliyunwai.beyondclouds.data.source.impl;
import androidx.lifecycle.LiveData;
import java.util.List;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Question;
import cn.yunliyunwai.beyondclouds.data.model.QuestionCategory;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.source.IQuestionRepository;
import cn.yunliyunwai.beyondclouds.data.source.local.database.QuestionDatabase;
import cn.yunliyunwai.beyondclouds.data.source.remote.QuestionApiStore;
public class QuestionRepositoryImpl implements IQuestionRepository {
private QuestionDatabase questionDatabase;
private QuestionApiStore questionApiStore;
@Inject
public QuestionRepositoryImpl(QuestionDatabase questionDatabase, QuestionApiStore questionApiStore) {
this.questionDatabase = questionDatabase;
this.questionApiStore = questionApiStore;
}
@Override
public LiveData<Result<List<QuestionCategory>>> fetchCategories() {
return questionApiStore.getCategories();
}
@Override
public LiveData<List<QuestionCategory>> loadCategoriesFromCache() {
return questionDatabase.questionDao().getCategories();
}
@Override
public LiveData<Result<Page<Question>>> fetchQuestionList(Integer categoryId, Integer page, Integer size) {
return questionApiStore.getQuestionList(categoryId, page, size);
}
@Override
public void makeCategoriesCache(List<QuestionCategory> categories) {
questionDatabase.questionDao().saveCategories(categories);
}
@Override
public LiveData<Result<Page<Question>>> fetchHotQuestionList(Integer page, int pageSize) {
return questionApiStore.getHotQuestionList(page, pageSize);
}
}
package cn.yunliyunwai.beyondclouds.data.source.local.dao;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import java.util.List;
import cn.yunliyunwai.beyondclouds.data.model.QuestionCategory;
@Dao
public interface QuestionDao {
@Query("SELECT * FROM QuestionCategory order by priority desc, create_time asc")
LiveData<List<QuestionCategory>> getCategories();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void saveCategories(List<QuestionCategory> categories);
}
package cn.yunliyunwai.beyondclouds.data.source.local.database;
import androidx.room.Database;
import androidx.room.RoomDatabase;
import cn.yunliyunwai.beyondclouds.data.model.QuestionCategory;
import cn.yunliyunwai.beyondclouds.data.source.local.dao.QuestionDao;
@Database(entities = {QuestionCategory.class}, version = 1, exportSchema = false)
public abstract class QuestionDatabase extends RoomDatabase {
public abstract QuestionDao questionDao();
}
package cn.yunliyunwai.beyondclouds.data.source.remote;
import androidx.lifecycle.LiveData;
import java.util.List;
import cn.yunliyunwai.beyondclouds.data.model.Page;
import cn.yunliyunwai.beyondclouds.data.model.Question;
import cn.yunliyunwai.beyondclouds.data.model.QuestionCategory;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface QuestionApiStore {
@GET("question/categories")
LiveData<Result<List<QuestionCategory>>> getCategories();
@GET("questions")
LiveData<Result<Page<Question>>> getQuestionList(@Query("categoryId") Integer categoryId,
@Query("page") Integer page,
@Query("size") Integer size);
@GET("question/hots")
LiveData<Result<Page<Question>>> getHotQuestionList(@Query("page") Integer page,
@Query("size") int pageSize);
}
......@@ -13,6 +13,8 @@ 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;
import cn.yunliyunwai.beyondclouds.di.module.QAFragmentModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.QuestionListFragmentModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.SplashActivityModuleBinds;
import cn.yunliyunwai.beyondclouds.di.module.ViewModelFactory;
import dagger.BindsInstance;
......@@ -26,9 +28,11 @@ import dagger.Component;
HomeFragmentModuleBinds.class,
ProjectFragmentModuleBinds.class,
DynamicFragmentModuleBinds.class,
QAFragmentModuleBinds.class,
BlogListFragmentModuleBinds.class,
ProjectListFragmentModuleBinds.class,
DynamicListFragmentModuleBinds.class,
QuestionListFragmentModuleBinds.class,
SplashActivityModuleBinds.class
})
public interface AppComponent {
......@@ -44,7 +48,7 @@ public interface AppComponent {
DynamicFragmentComponent.Factory dynamicFragmentComponent();
DynamicListFragmentComponent.Factory dynamicListFragmentComponent();
QAFragmentComponent.Factory qAFragmentComponent();
SplashActivityComponent.Factory splashActivityComponent();
......@@ -52,6 +56,10 @@ public interface AppComponent {
ProjectListFragmentComponent.Factory projectListFragmentComponent();
DynamicListFragmentComponent.Factory dynamicListFragmentComponent();
QuestionListFragmentComponent.Factory questionListFragmentComponent();
void inject(MainActivity mainActivity);
}
package cn.yunliyunwai.beyondclouds.di.component;
import cn.yunliyunwai.beyondclouds.ui.QAFragment;
import dagger.Subcomponent;
@Subcomponent
public interface QAFragmentComponent {
@Subcomponent.Factory
interface Factory {
QAFragmentComponent create();
}
void inject(QAFragment qaFragment);
}
package cn.yunliyunwai.beyondclouds.di.component;
import cn.yunliyunwai.beyondclouds.ui.QAFragment;
import dagger.Subcomponent;
@Subcomponent
public interface QuestionListFragmentComponent {
@Subcomponent.Factory
interface Factory {
QuestionListFragmentComponent create();
}
void inject(QAFragment.QuestionListFragment questionListFragment);
}
......@@ -20,9 +20,11 @@ import javax.inject.Singleton;
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.local.database.QuestionDatabase;
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.data.source.remote.QuestionApiStore;
import cn.yunliyunwai.beyondclouds.util.AppExecutors;
import dagger.Module;
import dagger.Provides;
......@@ -53,6 +55,12 @@ public class AppModule {
@Singleton
@Provides
public QuestionApiStore provideQuestionApiRemoteDataSource(Retrofit retrofit) {
return retrofit.create(QuestionApiStore.class);
}
@Singleton
@Provides
BlogDatabase provideBlogDatabase(Context context) {
return Room
.databaseBuilder(context.getApplicationContext(),
......@@ -69,6 +77,16 @@ public class AppModule {
"Project.db").build();
}
@Singleton
@Provides
QuestionDatabase provideQuestionDatabase(Context context) {
return Room
.databaseBuilder(context.getApplicationContext(),
QuestionDatabase.class,
"Question.db").build();
}
@Singleton
@Provides
public OkHttpClient provideOkHttpClient() {
......
......@@ -7,32 +7,38 @@ import javax.inject.Singleton;
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.IQuestionRepository;
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.data.source.impl.QuestionRepositoryImpl;
import cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module
public abstract class AppModuleBinds {
public interface AppModuleBinds {
@Singleton
@Binds
abstract IBlogRepository bindBlogRepository(BlogRepositoryImpl blogRepository);
IBlogRepository bindBlogRepository(BlogRepositoryImpl blogRepository);
@Singleton
@Binds
abstract IProjectRepository bindProjectRepository(ProjectRepositoryImpl projectRepository);
IProjectRepository bindProjectRepository(ProjectRepositoryImpl projectRepository);
@Singleton
@Binds
abstract IPostRepository bindPostRepository(PostRepositoryImpl postRepository);
IPostRepository bindPostRepository(PostRepositoryImpl postRepository);
@Singleton
@Binds
IQuestionRepository bindQuestionRepository(QuestionRepositoryImpl questionRepository);
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(MainActivityViewModel.class)
abstract ViewModel bindMainActivityViewModel(MainActivityViewModel mainActivityViewModel);
ViewModel bindMainActivityViewModel(MainActivityViewModel mainActivityViewModel);
}
package cn.yunliyunwai.beyondclouds.di.module;
import androidx.lifecycle.ViewModel;
import cn.yunliyunwai.beyondclouds.di.component.QAFragmentComponent;
import cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = QAFragmentComponent.class)
public interface QAFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(QAFragmentViewModel.class)
ViewModel bindQAFragmentViewModel(QAFragmentViewModel qaFragmentViewModel);
}
package cn.yunliyunwai.beyondclouds.di.module;
import androidx.lifecycle.ViewModel;
import cn.yunliyunwai.beyondclouds.di.component.QuestionListFragmentComponent;
import cn.yunliyunwai.beyondclouds.viewmodel.QuestionListFragmentViewModel;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module(subcomponents = QuestionListFragmentComponent.class)
public interface QuestionListFragmentModuleBinds {
@Binds
@IntoMap
@ViewModelFactory.ViewModelKey(QuestionListFragmentViewModel.class)
ViewModel bindQuestionListFragmentViewModel(QuestionListFragmentViewModel questionListFragmentViewModel);
}
......@@ -77,7 +77,7 @@ public class DynamicFragment extends BaseFragment<DynamicFragmentViewModel, Frag
@Override
protected BaseQuickAdapter<Post, BaseViewHolder> createAdapter() {
return new DynamicListRecyclerViewAdapter(R.layout.dynamic_item);
return new DynamicListRecyclerViewAdapter(R.layout.post_item);
}
}
}
......@@ -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.QuestionListRecyclerViewAdapter;
import cn.yunliyunwai.beyondclouds.base.BaseFragment;
import cn.yunliyunwai.beyondclouds.data.model.Question;
import cn.yunliyunwai.beyondclouds.databinding.FragmentQaBinding;
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.util.ViewModelUtils;
import cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel;
import cn.yunliyunwai.beyondclouds.viewmodel.QuestionListFragmentViewModel;
public class QAFragment extends BaseFragment<QAFragmentViewModel, FragmentQaBinding> {
@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()).qAFragmentComponent().create().inject(this);
}
@Override
protected QAFragmentViewModel initViewModel() {
return ViewModelUtils.createViewModel(this, QAFragmentViewModel.factory, QAFragmentViewModel.class);
return ViewModelUtils.createViewModel(this, factory, QAFragmentViewModel.class);
}
@Override
protected FragmentQaBinding initDataBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
return FragmentQaBinding.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 QuestionListFragment();
}
}, binding.magicIndicator, binding.viewPager, viewModel, false);
}
public static class QuestionListFragment extends RefreshableFragment<Question, QuestionListFragmentViewModel> {
@Inject
ViewModelProvider.Factory factory;
@Override
protected BaseQuickAdapter<Question, BaseViewHolder> createAdapter() {
return new QuestionListRecyclerViewAdapter(R.layout.question_item);
}
@Override
protected void initInject() {
ContextUtils.getAppComponent(requireActivity()).questionListFragmentComponent().create().inject(this);
}
@Override
protected QuestionListFragmentViewModel initViewModel() {
return new ViewModelProvider(this, factory).get(QuestionListFragmentViewModel.class);
}
}
}
......@@ -23,14 +23,14 @@ public class BlogListFragmentViewModel extends PageableViewModel<Blog> {
public void doRequest(CommonCategory category, int page, int defaultPageSize, Observer<Result<Page<Blog>>> observer) {
switch (category.getCategoryType()) {
case REAL:
blogRepository.getBlogList(category.getCategoryId(), page, defaultPageSize).observeForever(observer);
blogRepository.fetchBlogList(category.getCategoryId(), page, defaultPageSize).observeForever(observer);
break;
case LATEST:
blogRepository.getBlogList(null, page, defaultPageSize).observeForever(observer);
blogRepository.fetchBlogList(null, page, defaultPageSize).observeForever(observer);
break;
case RECOMMEND:
default:
blogRepository.getHotBlogList(page, defaultPageSize).observeForever(observer);
blogRepository.fetchHotBlogList(page, defaultPageSize).observeForever(observer);
}
}
}
......@@ -24,7 +24,7 @@ public class HomeFragmentViewModel extends CategoryViewModel {
@Override
public void loadCategories() {
List<CommonCategory> commonCategories = new ArrayList<>(Arrays.asList(CommonCategory.recommend(), CommonCategory.latest()));
blogRepository.loadCategoriesFromLocal().observeForever(new Observer<List<BlogCategory>>() {
blogRepository.loadCategoriesFromCache().observeForever(new Observer<List<BlogCategory>>() {
@Override
public void onChanged(List<BlogCategory> blogCategories) {
for (BlogCategory category :
......
......@@ -25,7 +25,7 @@ public class ProjectFragmentViewModel extends CategoryViewModel {
@Override
public void loadCategories() {
List<CommonCategory> commonCategories = new ArrayList<>(Arrays.asList(CommonCategory.recommend(), CommonCategory.latest()));
projectRepository.loadCategoriesFromLocal().observeForever(new Observer<List<ProjectCategory>>() {
projectRepository.loadCategoriesFromCache().observeForever(new Observer<List<ProjectCategory>>() {
@Override
public void onChanged(List<ProjectCategory> projectCategories) {
for (ProjectCategory category :
......
......@@ -23,14 +23,14 @@ public class ProjectListFragmentViewModel extends PageableViewModel<Project> {
public void doRequest(CommonCategory category, int page, int defaultPageSize, Observer<Result<Page<Project>>> observer) {
switch (category.getCategoryType()) {
case REAL:
projectRepository.getProjectList(category.getCategoryId(), page, defaultPageSize).observeForever(observer);
projectRepository.fetchProjectList(category.getCategoryId(), page, defaultPageSize).observeForever(observer);
break;
case LATEST:
projectRepository.getProjectList(null, page, defaultPageSize).observeForever(observer);
projectRepository.fetchProjectList(null, page, defaultPageSize).observeForever(observer);
break;
case RECOMMEND:
default:
projectRepository.getHotProjectList(page, defaultPageSize).observeForever(observer);
projectRepository.fetchHotProjectList(page, defaultPageSize).observeForever(observer);
}
}
}
package cn.yunliyunwai.beyondclouds.viewmodel;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
public class QAFragmentViewModel 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 QAFragmentViewModel();
}
};
import androidx.lifecycle.Observer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.data.model.CommonCategory;
import cn.yunliyunwai.beyondclouds.data.model.QuestionCategory;
import cn.yunliyunwai.beyondclouds.data.source.IQuestionRepository;
import cn.yunliyunwai.beyondclouds.viewmodel.common.CategoryViewModel;
public class QAFragmentViewModel extends CategoryViewModel {
IQuestionRepository questionRepository;
@Inject
public QAFragmentViewModel(IQuestionRepository questionRepository) {
this.questionRepository = questionRepository;
}
@Override
public void loadCategories() {
List<CommonCategory> commonCategories = new ArrayList<>(Arrays.asList(CommonCategory.latest()));
questionRepository.loadCategoriesFromCache().observeForever(new Observer<List<QuestionCategory>>() {
@Override
public void onChanged(List<QuestionCategory> blogCategories) {
for (QuestionCategory category :
blogCategories) {
commonCategories.add(CommonCategory.real(category.getCategoryId(), category.getCategory()));
}
refreshCategories(commonCategories);
}
});
}
}
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.Question;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.source.IQuestionRepository;
import cn.yunliyunwai.beyondclouds.viewmodel.common.PageableViewModel;
public class QuestionListFragmentViewModel extends PageableViewModel<Question> {
private IQuestionRepository questionRepository;
@Inject
public QuestionListFragmentViewModel(IQuestionRepository questionRepository) {
this.questionRepository = questionRepository;
}
@Override
public void doRequest(CommonCategory category, int page, int defaultPageSize, Observer<Result<Page<Question>>> observer) {
switch (category.getCategoryType()) {
case REAL:
questionRepository.fetchQuestionList(category.getCategoryId(), page, defaultPageSize).observeForever(observer);
break;
case LATEST:
questionRepository.fetchQuestionList(null, page, defaultPageSize).observeForever(observer);
break;
default:
questionRepository.fetchHotQuestionList(page, defaultPageSize).observeForever(observer);
}
}
}
......@@ -11,9 +11,11 @@ import javax.inject.Inject;
import cn.yunliyunwai.beyondclouds.data.model.BlogCategory;
import cn.yunliyunwai.beyondclouds.data.model.ProjectCategory;
import cn.yunliyunwai.beyondclouds.data.model.QuestionCategory;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.source.IBlogRepository;
import cn.yunliyunwai.beyondclouds.data.source.IProjectRepository;
import cn.yunliyunwai.beyondclouds.data.source.IQuestionRepository;
import cn.yunliyunwai.beyondclouds.util.AppExecutors;
import lombok.Data;
......@@ -28,26 +30,31 @@ public class SplashActivityViewModel extends ViewModel {
public static class InitialStates {
private InitialState blogCategoryInitialState;
private InitialState projectCategoryInitialState;
private InitialState questionCategoryInitialState;
public InitialStates() {
blogCategoryInitialState = InitialState.INITIALIZING;
projectCategoryInitialState = InitialState.INITIALIZING;
questionCategoryInitialState = InitialState.INITIALIZING;
}
public boolean isCompleted() {
return blogCategoryInitialState == InitialState.COMPLETE
&& projectCategoryInitialState == InitialState.COMPLETE;
&& projectCategoryInitialState == InitialState.COMPLETE
&& questionCategoryInitialState == InitialState.COMPLETE;
}
}
private IBlogRepository blogRepository;
private IProjectRepository projectRepository;
private IQuestionRepository questionRepository;
private AppExecutors appExecutors;
private MutableLiveData<InitialStates> mInitialStates = new MutableLiveData<>();
@Inject
public SplashActivityViewModel(IBlogRepository blogRepository, IProjectRepository projectRepository, AppExecutors appExecutors) {
public SplashActivityViewModel(IBlogRepository blogRepository, IProjectRepository projectRepository, IQuestionRepository questionRepository, AppExecutors appExecutors) {
this.blogRepository = blogRepository;
this.projectRepository = projectRepository;
this.questionRepository = questionRepository;
this.appExecutors = appExecutors;
mInitialStates.setValue(new InitialStates());
}
......@@ -62,14 +69,14 @@ public class SplashActivityViewModel extends ViewModel {
public void initialize() {
// 获取类别并保存
blogRepository.getCategories().observeForever(new Observer<Result<List<BlogCategory>>>() {
blogRepository.fetchCategories().observeForever(new Observer<Result<List<BlogCategory>>>() {
@Override
public void onChanged(Result<List<BlogCategory>> listResult) {
if (listResult.getCode() == 0) {
appExecutors.diskIO().execute(new Runnable() {
@Override
public void run() {
blogRepository.saveCategories(listResult.getData());
blogRepository.makeCategoriesCache(listResult.getData());
mInitialStates
.getValue()
.setBlogCategoryInitialState(InitialState.COMPLETE);
......@@ -81,14 +88,14 @@ public class SplashActivityViewModel extends ViewModel {
}
});
projectRepository.getCategories().observeForever(new Observer<Result<List<ProjectCategory>>>() {
projectRepository.fetchCategories().observeForever(new Observer<Result<List<ProjectCategory>>>() {
@Override
public void onChanged(Result<List<ProjectCategory>> listResult) {
if (listResult.getCode() == 0) {
appExecutors.diskIO().execute(new Runnable() {
@Override
public void run() {
projectRepository.saveCategories(listResult.getData());
projectRepository.makeCategoriesCache(listResult.getData());
mInitialStates
.getValue()
.setProjectCategoryInitialState(InitialState.COMPLETE);
......@@ -99,6 +106,24 @@ public class SplashActivityViewModel extends ViewModel {
}
});
questionRepository.fetchCategories().observeForever(new Observer<Result<List<QuestionCategory>>>() {
@Override
public void onChanged(Result<List<QuestionCategory>> listResult) {
if (listResult.getCode() == 0) {
appExecutors.diskIO().execute(new Runnable() {
@Override
public void run() {
questionRepository.makeCategoriesCache(listResult.getData());
mInitialStates
.getValue()
.setQuestionCategoryInitialState(InitialState.COMPLETE);
mInitialStates.postValue(mInitialStates.getValue());
}
});
}
}
});
}
}
......@@ -4,16 +4,33 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<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" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
<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
<?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:text="我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代我们所处的时代"
app:layout_constraintTop_toBottomOf="@id/barrier_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<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"
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
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