Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
beyond-clouds-android
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
云深项目组
beyond-clouds-android
Commits
5ac2e857
Commit
5ac2e857
authored
Mar 16, 2020
by
段启岩
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
问答列表接入完成
parent
995b65ba
Hide whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
663 additions
and
68 deletions
+663
-68
app/src/main/java/cn/yunliyunwai/beyondclouds/adapter/DynamicListRecyclerViewAdapter.java
+2
-2
app/src/main/java/cn/yunliyunwai/beyondclouds/adapter/QuestionListRecyclerViewAdapter.java
+29
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/adapter/common/CategoryNavigatorAdapter.java
+0
-1
app/src/main/java/cn/yunliyunwai/beyondclouds/data/model/Question.java
+14
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/model/QuestionCategory.java
+60
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IBlogRepository.java
+6
-5
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IProjectRepository.java
+6
-5
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IQuestionRepository.java
+27
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/BlogRepositoryImpl.java
+5
-5
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/ProjectRepositoryImpl.java
+5
-5
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/QuestionRepositoryImpl.java
+52
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/local/dao/QuestionDao.java
+20
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/local/database/QuestionDatabase.java
+12
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/remote/QuestionApiStore.java
+26
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/AppComponent.java
+9
-1
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/QAFragmentComponent.java
+15
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/QuestionListFragmentComponent.java
+15
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/AppModule.java
+18
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/AppModuleBinds.java
+11
-5
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/QAFragmentModuleBinds.java
+18
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/QuestionListFragmentModuleBinds.java
+19
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/DynamicFragment.java
+1
-1
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/QAFragment.java
+51
-6
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/BlogListFragmentViewModel.java
+3
-3
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/HomeFragmentViewModel.java
+1
-1
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/ProjectFragmentViewModel.java
+1
-1
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/ProjectListFragmentViewModel.java
+3
-3
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/QAFragmentViewModel.java
+35
-12
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/QuestionListFragmentViewModel.java
+35
-0
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/SplashActivityViewModel.java
+31
-6
app/src/main/res/layout/fragment_qa.xml
+24
-6
app/src/main/res/layout/post_item.xml
+0
-0
app/src/main/res/layout/question_item.xml
+109
-0
No files found.
app/src/main/java/cn/yunliyunwai/beyondclouds/adapter/DynamicListRecyclerViewAdapter.java
View file @
5ac2e857
...
@@ -5,7 +5,7 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
...
@@ -5,7 +5,7 @@ import com.chad.library.adapter.base.BaseQuickAdapter;
import
com.chad.library.adapter.base.BaseViewHolder
;
import
com.chad.library.adapter.base.BaseViewHolder
;
import
cn.yunliyunwai.beyondclouds.data.model.Post
;
import
cn.yunliyunwai.beyondclouds.data.model.Post
;
import
cn.yunliyunwai.beyondclouds.databinding.
Blog
ItemBinding
;
import
cn.yunliyunwai.beyondclouds.databinding.
Post
ItemBinding
;
import
cn.yunliyunwai.beyondclouds.util.DateUtils
;
import
cn.yunliyunwai.beyondclouds.util.DateUtils
;
import
cn.yunliyunwai.beyondclouds.util.GlideRoundTransform
;
import
cn.yunliyunwai.beyondclouds.util.GlideRoundTransform
;
...
@@ -18,7 +18,7 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
...
@@ -18,7 +18,7 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
@Override
@Override
protected
void
convert
(
BaseViewHolder
helper
,
Post
post
)
{
protected
void
convert
(
BaseViewHolder
helper
,
Post
post
)
{
BlogItemBinding
binding
=
Blog
ItemBinding
.
bind
(
helper
.
itemView
);
PostItemBinding
binding
=
Post
ItemBinding
.
bind
(
helper
.
itemView
);
binding
.
txtTitle
.
setText
(
post
.
getContent
());
binding
.
txtTitle
.
setText
(
post
.
getContent
());
binding
.
txtAbstract
.
setText
(
post
.
getContent
());
binding
.
txtAbstract
.
setText
(
post
.
getContent
());
...
...
app/src/main/java/cn/yunliyunwai/beyondclouds/adapter/QuestionListRecyclerViewAdapter.java
0 → 100644
View file @
5ac2e857
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
app/src/main/java/cn/yunliyunwai/beyondclouds/adapter/common/CategoryNavigatorAdapter.java
View file @
5ac2e857
...
@@ -50,7 +50,6 @@ public class CategoryNavigatorAdapter extends CommonNavigatorAdapter {
...
@@ -50,7 +50,6 @@ public class CategoryNavigatorAdapter extends CommonNavigatorAdapter {
indicator
.
setMode
(
CommonPagerIndicator
.
MODE_EXACTLY
);
indicator
.
setMode
(
CommonPagerIndicator
.
MODE_EXACTLY
);
indicator
.
setDrawableHeight
(
2
*
density
);
indicator
.
setDrawableHeight
(
2
*
density
);
indicator
.
setDrawableWidth
(
8
*
density
);
indicator
.
setDrawableWidth
(
8
*
density
);
indicator
.
setX
(
1
*
density
);
return
indicator
;
return
indicator
;
}
}
...
...
app/src/main/java/cn/yunliyunwai/beyondclouds/data/model/Question.java
0 → 100644
View file @
5ac2e857
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
;
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/model/QuestionCategory.java
0 → 100644
View file @
5ac2e857
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
;
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IBlogRepository.java
View file @
5ac2e857
...
@@ -15,12 +15,13 @@ public interface IBlogRepository {
...
@@ -15,12 +15,13 @@ public interface IBlogRepository {
* 获取博客类别
* 获取博客类别
* @return
* @return
*/
*/
LiveData
<
Result
<
List
<
BlogCategory
>>>
get
Categories
();
LiveData
<
Result
<
List
<
BlogCategory
>>>
fetch
Categories
();
LiveData
<
List
<
BlogCategory
>>
loadCategoriesFrom
Local
();
LiveData
<
List
<
BlogCategory
>>
loadCategoriesFrom
Cache
();
LiveData
<
Result
<
Page
<
Blog
>>>
getBlogList
(
Integer
categoryId
,
Integer
page
,
Integer
size
);
LiveData
<
Result
<
Page
<
Blog
>>>
fetchBlogList
(
Integer
categoryId
,
Integer
page
,
Integer
size
);
void
saveCategories
(
List
<
BlogCategory
>
data
);
LiveData
<
Result
<
Page
<
Blog
>>>
getHotBlogList
(
Integer
page
,
int
pageSize
);
void
makeCategoriesCache
(
List
<
BlogCategory
>
data
);
LiveData
<
Result
<
Page
<
Blog
>>>
fetchHotBlogList
(
Integer
page
,
int
pageSize
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IProjectRepository.java
View file @
5ac2e857
...
@@ -15,12 +15,13 @@ public interface IProjectRepository {
...
@@ -15,12 +15,13 @@ public interface IProjectRepository {
* 获取博客类别
* 获取博客类别
* @return
* @return
*/
*/
LiveData
<
Result
<
List
<
ProjectCategory
>>>
get
Categories
();
LiveData
<
Result
<
List
<
ProjectCategory
>>>
fetch
Categories
();
LiveData
<
List
<
ProjectCategory
>>
loadCategoriesFrom
Local
();
LiveData
<
List
<
ProjectCategory
>>
loadCategoriesFrom
Cache
();
LiveData
<
Result
<
Page
<
Project
>>>
getProjectList
(
Integer
categoryId
,
Integer
page
,
Integer
size
);
LiveData
<
Result
<
Page
<
Project
>>>
fetchProjectList
(
Integer
categoryId
,
Integer
page
,
Integer
size
);
void
saveCategories
(
List
<
ProjectCategory
>
data
);
LiveData
<
Result
<
Page
<
Project
>>>
getHotProjectList
(
Integer
page
,
int
pageSize
);
void
makeCategoriesCache
(
List
<
ProjectCategory
>
categories
);
LiveData
<
Result
<
Page
<
Project
>>>
fetchHotProjectList
(
Integer
page
,
int
pageSize
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/IQuestionRepository.java
0 → 100644
View file @
5ac2e857
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
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/BlogRepositoryImpl.java
View file @
5ac2e857
...
@@ -30,27 +30,27 @@ public class BlogRepositoryImpl implements IBlogRepository {
...
@@ -30,27 +30,27 @@ public class BlogRepositoryImpl implements IBlogRepository {
}
}
@Override
@Override
public
LiveData
<
Result
<
List
<
BlogCategory
>>>
get
Categories
()
{
public
LiveData
<
Result
<
List
<
BlogCategory
>>>
fetch
Categories
()
{
return
blogApiStore
.
getCategories
();
return
blogApiStore
.
getCategories
();
}
}
@Override
@Override
public
LiveData
<
List
<
BlogCategory
>>
loadCategoriesFrom
Local
()
{
public
LiveData
<
List
<
BlogCategory
>>
loadCategoriesFrom
Cache
()
{
return
blogDatabase
.
blogDao
().
getCategories
();
return
blogDatabase
.
blogDao
().
getCategories
();
}
}
@Override
@Override
public
LiveData
<
Result
<
Page
<
Blog
>>>
get
BlogList
(
Integer
categoryId
,
Integer
page
,
Integer
size
)
{
public
LiveData
<
Result
<
Page
<
Blog
>>>
fetch
BlogList
(
Integer
categoryId
,
Integer
page
,
Integer
size
)
{
return
blogApiStore
.
getBlogList
(
categoryId
,
page
,
size
);
return
blogApiStore
.
getBlogList
(
categoryId
,
page
,
size
);
}
}
@Override
@Override
public
void
saveCategories
(
List
<
BlogCategory
>
categories
)
{
public
void
makeCategoriesCache
(
List
<
BlogCategory
>
categories
)
{
blogDatabase
.
blogDao
().
saveCategories
(
categories
);
blogDatabase
.
blogDao
().
saveCategories
(
categories
);
}
}
@Override
@Override
public
LiveData
<
Result
<
Page
<
Blog
>>>
get
HotBlogList
(
Integer
page
,
int
pageSize
)
{
public
LiveData
<
Result
<
Page
<
Blog
>>>
fetch
HotBlogList
(
Integer
page
,
int
pageSize
)
{
return
blogApiStore
.
getHotBlogList
(
page
,
pageSize
);
return
blogApiStore
.
getHotBlogList
(
page
,
pageSize
);
}
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/ProjectRepositoryImpl.java
View file @
5ac2e857
...
@@ -30,27 +30,27 @@ public class ProjectRepositoryImpl implements IProjectRepository {
...
@@ -30,27 +30,27 @@ public class ProjectRepositoryImpl implements IProjectRepository {
}
}
@Override
@Override
public
LiveData
<
Result
<
List
<
ProjectCategory
>>>
get
Categories
()
{
public
LiveData
<
Result
<
List
<
ProjectCategory
>>>
fetch
Categories
()
{
return
projectApiStore
.
getCategories
();
return
projectApiStore
.
getCategories
();
}
}
@Override
@Override
public
LiveData
<
List
<
ProjectCategory
>>
loadCategoriesFrom
Local
()
{
public
LiveData
<
List
<
ProjectCategory
>>
loadCategoriesFrom
Cache
()
{
return
projectDatabase
.
projectDao
().
getCategories
();
return
projectDatabase
.
projectDao
().
getCategories
();
}
}
@Override
@Override
public
LiveData
<
Result
<
Page
<
Project
>>>
get
ProjectList
(
Integer
categoryId
,
Integer
page
,
Integer
size
)
{
public
LiveData
<
Result
<
Page
<
Project
>>>
fetch
ProjectList
(
Integer
categoryId
,
Integer
page
,
Integer
size
)
{
return
projectApiStore
.
getProjectList
(
categoryId
,
page
,
size
);
return
projectApiStore
.
getProjectList
(
categoryId
,
page
,
size
);
}
}
@Override
@Override
public
void
saveCategories
(
List
<
ProjectCategory
>
categories
)
{
public
void
makeCategoriesCache
(
List
<
ProjectCategory
>
categories
)
{
projectDatabase
.
projectDao
().
saveCategories
(
categories
);
projectDatabase
.
projectDao
().
saveCategories
(
categories
);
}
}
@Override
@Override
public
LiveData
<
Result
<
Page
<
Project
>>>
get
HotProjectList
(
Integer
page
,
int
pageSize
)
{
public
LiveData
<
Result
<
Page
<
Project
>>>
fetch
HotProjectList
(
Integer
page
,
int
pageSize
)
{
return
projectApiStore
.
getHotProjectList
(
page
,
pageSize
);
return
projectApiStore
.
getHotProjectList
(
page
,
pageSize
);
}
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/impl/QuestionRepositoryImpl.java
0 → 100644
View file @
5ac2e857
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
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/local/dao/QuestionDao.java
0 → 100644
View file @
5ac2e857
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
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/local/database/QuestionDatabase.java
0 → 100644
View file @
5ac2e857
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
();
}
app/src/main/java/cn/yunliyunwai/beyondclouds/data/source/remote/QuestionApiStore.java
0 → 100644
View file @
5ac2e857
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
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/AppComponent.java
View file @
5ac2e857
...
@@ -13,6 +13,8 @@ import cn.yunliyunwai.beyondclouds.di.module.DynamicListFragmentModuleBinds;
...
@@ -13,6 +13,8 @@ import cn.yunliyunwai.beyondclouds.di.module.DynamicListFragmentModuleBinds;
import
cn.yunliyunwai.beyondclouds.di.module.HomeFragmentModuleBinds
;
import
cn.yunliyunwai.beyondclouds.di.module.HomeFragmentModuleBinds
;
import
cn.yunliyunwai.beyondclouds.di.module.ProjectFragmentModuleBinds
;
import
cn.yunliyunwai.beyondclouds.di.module.ProjectFragmentModuleBinds
;
import
cn.yunliyunwai.beyondclouds.di.module.ProjectListFragmentModuleBinds
;
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.SplashActivityModuleBinds
;
import
cn.yunliyunwai.beyondclouds.di.module.ViewModelFactory
;
import
cn.yunliyunwai.beyondclouds.di.module.ViewModelFactory
;
import
dagger.BindsInstance
;
import
dagger.BindsInstance
;
...
@@ -26,9 +28,11 @@ import dagger.Component;
...
@@ -26,9 +28,11 @@ import dagger.Component;
HomeFragmentModuleBinds
.
class
,
HomeFragmentModuleBinds
.
class
,
ProjectFragmentModuleBinds
.
class
,
ProjectFragmentModuleBinds
.
class
,
DynamicFragmentModuleBinds
.
class
,
DynamicFragmentModuleBinds
.
class
,
QAFragmentModuleBinds
.
class
,
BlogListFragmentModuleBinds
.
class
,
BlogListFragmentModuleBinds
.
class
,
ProjectListFragmentModuleBinds
.
class
,
ProjectListFragmentModuleBinds
.
class
,
DynamicListFragmentModuleBinds
.
class
,
DynamicListFragmentModuleBinds
.
class
,
QuestionListFragmentModuleBinds
.
class
,
SplashActivityModuleBinds
.
class
SplashActivityModuleBinds
.
class
})
})
public
interface
AppComponent
{
public
interface
AppComponent
{
...
@@ -44,7 +48,7 @@ public interface AppComponent {
...
@@ -44,7 +48,7 @@ public interface AppComponent {
DynamicFragmentComponent
.
Factory
dynamicFragmentComponent
();
DynamicFragmentComponent
.
Factory
dynamicFragmentComponent
();
DynamicListFragmentComponent
.
Factory
dynamicList
FragmentComponent
();
QAFragmentComponent
.
Factory
qA
FragmentComponent
();
SplashActivityComponent
.
Factory
splashActivityComponent
();
SplashActivityComponent
.
Factory
splashActivityComponent
();
...
@@ -52,6 +56,10 @@ public interface AppComponent {
...
@@ -52,6 +56,10 @@ public interface AppComponent {
ProjectListFragmentComponent
.
Factory
projectListFragmentComponent
();
ProjectListFragmentComponent
.
Factory
projectListFragmentComponent
();
DynamicListFragmentComponent
.
Factory
dynamicListFragmentComponent
();
QuestionListFragmentComponent
.
Factory
questionListFragmentComponent
();
void
inject
(
MainActivity
mainActivity
);
void
inject
(
MainActivity
mainActivity
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/QAFragmentComponent.java
0 → 100644
View file @
5ac2e857
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
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/di/component/QuestionListFragmentComponent.java
0 → 100644
View file @
5ac2e857
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
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/AppModule.java
View file @
5ac2e857
...
@@ -20,9 +20,11 @@ import javax.inject.Singleton;
...
@@ -20,9 +20,11 @@ import javax.inject.Singleton;
import
cn.yunliyunwai.beyondclouds.adapter.common.LiveDataCallAdapterFactory
;
import
cn.yunliyunwai.beyondclouds.adapter.common.LiveDataCallAdapterFactory
;
import
cn.yunliyunwai.beyondclouds.data.source.local.database.BlogDatabase
;
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.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.BlogApiStore
;
import
cn.yunliyunwai.beyondclouds.data.source.remote.PostApiStore
;
import
cn.yunliyunwai.beyondclouds.data.source.remote.PostApiStore
;
import
cn.yunliyunwai.beyondclouds.data.source.remote.ProjectApiStore
;
import
cn.yunliyunwai.beyondclouds.data.source.remote.ProjectApiStore
;
import
cn.yunliyunwai.beyondclouds.data.source.remote.QuestionApiStore
;
import
cn.yunliyunwai.beyondclouds.util.AppExecutors
;
import
cn.yunliyunwai.beyondclouds.util.AppExecutors
;
import
dagger.Module
;
import
dagger.Module
;
import
dagger.Provides
;
import
dagger.Provides
;
...
@@ -53,6 +55,12 @@ public class AppModule {
...
@@ -53,6 +55,12 @@ public class AppModule {
@Singleton
@Singleton
@Provides
@Provides
public
QuestionApiStore
provideQuestionApiRemoteDataSource
(
Retrofit
retrofit
)
{
return
retrofit
.
create
(
QuestionApiStore
.
class
);
}
@Singleton
@Provides
BlogDatabase
provideBlogDatabase
(
Context
context
)
{
BlogDatabase
provideBlogDatabase
(
Context
context
)
{
return
Room
return
Room
.
databaseBuilder
(
context
.
getApplicationContext
(),
.
databaseBuilder
(
context
.
getApplicationContext
(),
...
@@ -69,6 +77,16 @@ public class AppModule {
...
@@ -69,6 +77,16 @@ public class AppModule {
"Project.db"
).
build
();
"Project.db"
).
build
();
}
}
@Singleton
@Provides
QuestionDatabase
provideQuestionDatabase
(
Context
context
)
{
return
Room
.
databaseBuilder
(
context
.
getApplicationContext
(),
QuestionDatabase
.
class
,
"Question.db"
).
build
();
}
@Singleton
@Singleton
@Provides
@Provides
public
OkHttpClient
provideOkHttpClient
()
{
public
OkHttpClient
provideOkHttpClient
()
{
...
...
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/AppModuleBinds.java
View file @
5ac2e857
...
@@ -7,32 +7,38 @@ import javax.inject.Singleton;
...
@@ -7,32 +7,38 @@ import javax.inject.Singleton;
import
cn.yunliyunwai.beyondclouds.data.source.IBlogRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IBlogRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IPostRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IPostRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IProjectRepository
;
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.BlogRepositoryImpl
;
import
cn.yunliyunwai.beyondclouds.data.source.impl.PostRepositoryImpl
;
import
cn.yunliyunwai.beyondclouds.data.source.impl.PostRepositoryImpl
;
import
cn.yunliyunwai.beyondclouds.data.source.impl.ProjectRepositoryImpl
;
import
cn.yunliyunwai.beyondclouds.data.source.impl.ProjectRepositoryImpl
;
import
cn.yunliyunwai.beyondclouds.data.source.impl.QuestionRepositoryImpl
;
import
cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel
;
import
dagger.Binds
;
import
dagger.Binds
;
import
dagger.Module
;
import
dagger.Module
;
import
dagger.multibindings.IntoMap
;
import
dagger.multibindings.IntoMap
;
@Module
@Module
public
abstract
class
AppModuleBinds
{
public
interface
AppModuleBinds
{
@Singleton
@Singleton
@Binds
@Binds
abstract
IBlogRepository
bindBlogRepository
(
BlogRepositoryImpl
blogRepository
);
IBlogRepository
bindBlogRepository
(
BlogRepositoryImpl
blogRepository
);
@Singleton
@Singleton
@Binds
@Binds
abstract
IProjectRepository
bindProjectRepository
(
ProjectRepositoryImpl
projectRepository
);
IProjectRepository
bindProjectRepository
(
ProjectRepositoryImpl
projectRepository
);
@Singleton
@Singleton
@Binds
@Binds
abstract
IPostRepository
bindPostRepository
(
PostRepositoryImpl
postRepository
);
IPostRepository
bindPostRepository
(
PostRepositoryImpl
postRepository
);
@Singleton
@Binds
IQuestionRepository
bindQuestionRepository
(
QuestionRepositoryImpl
questionRepository
);
@Binds
@Binds
@IntoMap
@IntoMap
@ViewModelFactory
.
ViewModelKey
(
MainActivityViewModel
.
class
)
@ViewModelFactory
.
ViewModelKey
(
MainActivityViewModel
.
class
)
abstract
ViewModel
bindMainActivityViewModel
(
MainActivityViewModel
mainActivityViewModel
);
ViewModel
bindMainActivityViewModel
(
MainActivityViewModel
mainActivityViewModel
);
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/QAFragmentModuleBinds.java
0 → 100644
View file @
5ac2e857
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
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/di/module/QuestionListFragmentModuleBinds.java
0 → 100644
View file @
5ac2e857
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
);
}
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/DynamicFragment.java
View file @
5ac2e857
...
@@ -77,7 +77,7 @@ public class DynamicFragment extends BaseFragment<DynamicFragmentViewModel, Frag
...
@@ -77,7 +77,7 @@ public class DynamicFragment extends BaseFragment<DynamicFragmentViewModel, Frag
@Override
@Override
protected
BaseQuickAdapter
<
Post
,
BaseViewHolder
>
createAdapter
()
{
protected
BaseQuickAdapter
<
Post
,
BaseViewHolder
>
createAdapter
()
{
return
new
DynamicListRecyclerViewAdapter
(
R
.
layout
.
dynamic
_item
);
return
new
DynamicListRecyclerViewAdapter
(
R
.
layout
.
post
_item
);
}
}
}
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/ui/QAFragment.java
View file @
5ac2e857
...
@@ -7,32 +7,77 @@ import android.view.ViewGroup;
...
@@ -7,32 +7,77 @@ import android.view.ViewGroup;
import
androidx.annotation.NonNull
;
import
androidx.annotation.NonNull
;
import
androidx.annotation.Nullable
;
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.base.BaseFragment
;
import
cn.yunliyunwai.beyondclouds.data.model.Question
;
import
cn.yunliyunwai.beyondclouds.databinding.FragmentQaBinding
;
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.util.ViewModelUtils
;
import
cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.QAFragmentViewModel
;
import
cn.yunliyunwai.beyondclouds.viewmodel.QuestionListFragmentViewModel
;
public
class
QAFragment
extends
BaseFragment
<
QAFragmentViewModel
,
FragmentQaBinding
>
{
public
class
QAFragment
extends
BaseFragment
<
QAFragmentViewModel
,
FragmentQaBinding
>
{
@Override
@Inject
public
void
onViewCreated
(
@NonNull
View
view
,
@Nullable
Bundle
savedInstanceState
)
{
ViewModelProvider
.
Factory
factory
;
super
.
onViewCreated
(
view
,
savedInstanceState
);
}
@Override
@Override
protected
void
initInject
()
{
protected
void
initInject
()
{
ContextUtils
.
getAppComponent
(
requireActivity
()).
qAFragmentComponent
().
create
().
inject
(
this
);
}
}
@Override
@Override
protected
QAFragmentViewModel
initViewModel
()
{
protected
QAFragmentViewModel
initViewModel
()
{
return
ViewModelUtils
.
createViewModel
(
this
,
QAFragmentViewModel
.
factory
,
QAFragmentViewModel
.
class
);
return
ViewModelUtils
.
createViewModel
(
this
,
factory
,
QAFragmentViewModel
.
class
);
}
}
@Override
@Override
protected
FragmentQaBinding
initDataBinding
(
@NonNull
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
)
{
protected
FragmentQaBinding
initDataBinding
(
@NonNull
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
)
{
return
FragmentQaBinding
.
inflate
(
inflater
,
container
,
false
);
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
);
}
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/BlogListFragmentViewModel.java
View file @
5ac2e857
...
@@ -23,14 +23,14 @@ public class BlogListFragmentViewModel extends PageableViewModel<Blog> {
...
@@ -23,14 +23,14 @@ public class BlogListFragmentViewModel extends PageableViewModel<Blog> {
public
void
doRequest
(
CommonCategory
category
,
int
page
,
int
defaultPageSize
,
Observer
<
Result
<
Page
<
Blog
>>>
observer
)
{
public
void
doRequest
(
CommonCategory
category
,
int
page
,
int
defaultPageSize
,
Observer
<
Result
<
Page
<
Blog
>>>
observer
)
{
switch
(
category
.
getCategoryType
())
{
switch
(
category
.
getCategoryType
())
{
case
REAL:
case
REAL:
blogRepository
.
get
BlogList
(
category
.
getCategoryId
(),
page
,
defaultPageSize
).
observeForever
(
observer
);
blogRepository
.
fetch
BlogList
(
category
.
getCategoryId
(),
page
,
defaultPageSize
).
observeForever
(
observer
);
break
;
break
;
case
LATEST:
case
LATEST:
blogRepository
.
get
BlogList
(
null
,
page
,
defaultPageSize
).
observeForever
(
observer
);
blogRepository
.
fetch
BlogList
(
null
,
page
,
defaultPageSize
).
observeForever
(
observer
);
break
;
break
;
case
RECOMMEND:
case
RECOMMEND:
default
:
default
:
blogRepository
.
get
HotBlogList
(
page
,
defaultPageSize
).
observeForever
(
observer
);
blogRepository
.
fetch
HotBlogList
(
page
,
defaultPageSize
).
observeForever
(
observer
);
}
}
}
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/HomeFragmentViewModel.java
View file @
5ac2e857
...
@@ -24,7 +24,7 @@ public class HomeFragmentViewModel extends CategoryViewModel {
...
@@ -24,7 +24,7 @@ public class HomeFragmentViewModel extends CategoryViewModel {
@Override
@Override
public
void
loadCategories
()
{
public
void
loadCategories
()
{
List
<
CommonCategory
>
commonCategories
=
new
ArrayList
<>(
Arrays
.
asList
(
CommonCategory
.
recommend
(),
CommonCategory
.
latest
()));
List
<
CommonCategory
>
commonCategories
=
new
ArrayList
<>(
Arrays
.
asList
(
CommonCategory
.
recommend
(),
CommonCategory
.
latest
()));
blogRepository
.
loadCategoriesFrom
Local
().
observeForever
(
new
Observer
<
List
<
BlogCategory
>>()
{
blogRepository
.
loadCategoriesFrom
Cache
().
observeForever
(
new
Observer
<
List
<
BlogCategory
>>()
{
@Override
@Override
public
void
onChanged
(
List
<
BlogCategory
>
blogCategories
)
{
public
void
onChanged
(
List
<
BlogCategory
>
blogCategories
)
{
for
(
BlogCategory
category
:
for
(
BlogCategory
category
:
...
...
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/ProjectFragmentViewModel.java
View file @
5ac2e857
...
@@ -25,7 +25,7 @@ public class ProjectFragmentViewModel extends CategoryViewModel {
...
@@ -25,7 +25,7 @@ public class ProjectFragmentViewModel extends CategoryViewModel {
@Override
@Override
public
void
loadCategories
()
{
public
void
loadCategories
()
{
List
<
CommonCategory
>
commonCategories
=
new
ArrayList
<>(
Arrays
.
asList
(
CommonCategory
.
recommend
(),
CommonCategory
.
latest
()));
List
<
CommonCategory
>
commonCategories
=
new
ArrayList
<>(
Arrays
.
asList
(
CommonCategory
.
recommend
(),
CommonCategory
.
latest
()));
projectRepository
.
loadCategoriesFrom
Local
().
observeForever
(
new
Observer
<
List
<
ProjectCategory
>>()
{
projectRepository
.
loadCategoriesFrom
Cache
().
observeForever
(
new
Observer
<
List
<
ProjectCategory
>>()
{
@Override
@Override
public
void
onChanged
(
List
<
ProjectCategory
>
projectCategories
)
{
public
void
onChanged
(
List
<
ProjectCategory
>
projectCategories
)
{
for
(
ProjectCategory
category
:
for
(
ProjectCategory
category
:
...
...
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/ProjectListFragmentViewModel.java
View file @
5ac2e857
...
@@ -23,14 +23,14 @@ public class ProjectListFragmentViewModel extends PageableViewModel<Project> {
...
@@ -23,14 +23,14 @@ public class ProjectListFragmentViewModel extends PageableViewModel<Project> {
public
void
doRequest
(
CommonCategory
category
,
int
page
,
int
defaultPageSize
,
Observer
<
Result
<
Page
<
Project
>>>
observer
)
{
public
void
doRequest
(
CommonCategory
category
,
int
page
,
int
defaultPageSize
,
Observer
<
Result
<
Page
<
Project
>>>
observer
)
{
switch
(
category
.
getCategoryType
())
{
switch
(
category
.
getCategoryType
())
{
case
REAL:
case
REAL:
projectRepository
.
get
ProjectList
(
category
.
getCategoryId
(),
page
,
defaultPageSize
).
observeForever
(
observer
);
projectRepository
.
fetch
ProjectList
(
category
.
getCategoryId
(),
page
,
defaultPageSize
).
observeForever
(
observer
);
break
;
break
;
case
LATEST:
case
LATEST:
projectRepository
.
get
ProjectList
(
null
,
page
,
defaultPageSize
).
observeForever
(
observer
);
projectRepository
.
fetch
ProjectList
(
null
,
page
,
defaultPageSize
).
observeForever
(
observer
);
break
;
break
;
case
RECOMMEND:
case
RECOMMEND:
default
:
default
:
projectRepository
.
get
HotProjectList
(
page
,
defaultPageSize
).
observeForever
(
observer
);
projectRepository
.
fetch
HotProjectList
(
page
,
defaultPageSize
).
observeForever
(
observer
);
}
}
}
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/QAFragmentViewModel.java
View file @
5ac2e857
package
cn
.
yunliyunwai
.
beyondclouds
.
viewmodel
;
package
cn
.
yunliyunwai
.
beyondclouds
.
viewmodel
;
import
androidx.annotation.NonNull
;
import
androidx.lifecycle.Observer
;
import
androidx.lifecycle.ViewModel
;
import
androidx.lifecycle.ViewModelProvider
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
public
class
QAFragmentViewModel
extends
ViewModel
{
import
java.util.List
;
public
static
ViewModelProvider
.
Factory
factory
=
new
ViewModelProvider
.
Factory
()
{
@NonNull
import
javax.inject.Inject
;
@Override
public
<
T
extends
ViewModel
>
T
create
(
@NonNull
Class
<
T
>
modelClass
)
{
import
cn.yunliyunwai.beyondclouds.data.model.CommonCategory
;
return
(
T
)
new
QAFragmentViewModel
();
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
);
}
});
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/QuestionListFragmentViewModel.java
0 → 100644
View file @
5ac2e857
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
);
}
}
}
app/src/main/java/cn/yunliyunwai/beyondclouds/viewmodel/SplashActivityViewModel.java
View file @
5ac2e857
...
@@ -11,9 +11,11 @@ import javax.inject.Inject;
...
@@ -11,9 +11,11 @@ import javax.inject.Inject;
import
cn.yunliyunwai.beyondclouds.data.model.BlogCategory
;
import
cn.yunliyunwai.beyondclouds.data.model.BlogCategory
;
import
cn.yunliyunwai.beyondclouds.data.model.ProjectCategory
;
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.model.Result
;
import
cn.yunliyunwai.beyondclouds.data.source.IBlogRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IBlogRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IProjectRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IProjectRepository
;
import
cn.yunliyunwai.beyondclouds.data.source.IQuestionRepository
;
import
cn.yunliyunwai.beyondclouds.util.AppExecutors
;
import
cn.yunliyunwai.beyondclouds.util.AppExecutors
;
import
lombok.Data
;
import
lombok.Data
;
...
@@ -28,26 +30,31 @@ public class SplashActivityViewModel extends ViewModel {
...
@@ -28,26 +30,31 @@ public class SplashActivityViewModel extends ViewModel {
public
static
class
InitialStates
{
public
static
class
InitialStates
{
private
InitialState
blogCategoryInitialState
;
private
InitialState
blogCategoryInitialState
;
private
InitialState
projectCategoryInitialState
;
private
InitialState
projectCategoryInitialState
;
private
InitialState
questionCategoryInitialState
;
public
InitialStates
()
{
public
InitialStates
()
{
blogCategoryInitialState
=
InitialState
.
INITIALIZING
;
blogCategoryInitialState
=
InitialState
.
INITIALIZING
;
projectCategoryInitialState
=
InitialState
.
INITIALIZING
;
projectCategoryInitialState
=
InitialState
.
INITIALIZING
;
questionCategoryInitialState
=
InitialState
.
INITIALIZING
;
}
}
public
boolean
isCompleted
()
{
public
boolean
isCompleted
()
{
return
blogCategoryInitialState
==
InitialState
.
COMPLETE
return
blogCategoryInitialState
==
InitialState
.
COMPLETE
&&
projectCategoryInitialState
==
InitialState
.
COMPLETE
;
&&
projectCategoryInitialState
==
InitialState
.
COMPLETE
&&
questionCategoryInitialState
==
InitialState
.
COMPLETE
;
}
}
}
}
private
IBlogRepository
blogRepository
;
private
IBlogRepository
blogRepository
;
private
IProjectRepository
projectRepository
;
private
IProjectRepository
projectRepository
;
private
IQuestionRepository
questionRepository
;
private
AppExecutors
appExecutors
;
private
AppExecutors
appExecutors
;
private
MutableLiveData
<
InitialStates
>
mInitialStates
=
new
MutableLiveData
<>();
private
MutableLiveData
<
InitialStates
>
mInitialStates
=
new
MutableLiveData
<>();
@Inject
@Inject
public
SplashActivityViewModel
(
IBlogRepository
blogRepository
,
IProjectRepository
projectRepository
,
AppExecutors
appExecutors
)
{
public
SplashActivityViewModel
(
IBlogRepository
blogRepository
,
IProjectRepository
projectRepository
,
IQuestionRepository
questionRepository
,
AppExecutors
appExecutors
)
{
this
.
blogRepository
=
blogRepository
;
this
.
blogRepository
=
blogRepository
;
this
.
projectRepository
=
projectRepository
;
this
.
projectRepository
=
projectRepository
;
this
.
questionRepository
=
questionRepository
;
this
.
appExecutors
=
appExecutors
;
this
.
appExecutors
=
appExecutors
;
mInitialStates
.
setValue
(
new
InitialStates
());
mInitialStates
.
setValue
(
new
InitialStates
());
}
}
...
@@ -62,14 +69,14 @@ public class SplashActivityViewModel extends ViewModel {
...
@@ -62,14 +69,14 @@ public class SplashActivityViewModel extends ViewModel {
public
void
initialize
()
{
public
void
initialize
()
{
// 获取类别并保存
// 获取类别并保存
blogRepository
.
get
Categories
().
observeForever
(
new
Observer
<
Result
<
List
<
BlogCategory
>>>()
{
blogRepository
.
fetch
Categories
().
observeForever
(
new
Observer
<
Result
<
List
<
BlogCategory
>>>()
{
@Override
@Override
public
void
onChanged
(
Result
<
List
<
BlogCategory
>>
listResult
)
{
public
void
onChanged
(
Result
<
List
<
BlogCategory
>>
listResult
)
{
if
(
listResult
.
getCode
()
==
0
)
{
if
(
listResult
.
getCode
()
==
0
)
{
appExecutors
.
diskIO
().
execute
(
new
Runnable
()
{
appExecutors
.
diskIO
().
execute
(
new
Runnable
()
{
@Override
@Override
public
void
run
()
{
public
void
run
()
{
blogRepository
.
saveCategories
(
listResult
.
getData
());
blogRepository
.
makeCategoriesCache
(
listResult
.
getData
());
mInitialStates
mInitialStates
.
getValue
()
.
getValue
()
.
setBlogCategoryInitialState
(
InitialState
.
COMPLETE
);
.
setBlogCategoryInitialState
(
InitialState
.
COMPLETE
);
...
@@ -81,14 +88,14 @@ public class SplashActivityViewModel extends ViewModel {
...
@@ -81,14 +88,14 @@ public class SplashActivityViewModel extends ViewModel {
}
}
});
});
projectRepository
.
get
Categories
().
observeForever
(
new
Observer
<
Result
<
List
<
ProjectCategory
>>>()
{
projectRepository
.
fetch
Categories
().
observeForever
(
new
Observer
<
Result
<
List
<
ProjectCategory
>>>()
{
@Override
@Override
public
void
onChanged
(
Result
<
List
<
ProjectCategory
>>
listResult
)
{
public
void
onChanged
(
Result
<
List
<
ProjectCategory
>>
listResult
)
{
if
(
listResult
.
getCode
()
==
0
)
{
if
(
listResult
.
getCode
()
==
0
)
{
appExecutors
.
diskIO
().
execute
(
new
Runnable
()
{
appExecutors
.
diskIO
().
execute
(
new
Runnable
()
{
@Override
@Override
public
void
run
()
{
public
void
run
()
{
projectRepository
.
saveCategories
(
listResult
.
getData
());
projectRepository
.
makeCategoriesCache
(
listResult
.
getData
());
mInitialStates
mInitialStates
.
getValue
()
.
getValue
()
.
setProjectCategoryInitialState
(
InitialState
.
COMPLETE
);
.
setProjectCategoryInitialState
(
InitialState
.
COMPLETE
);
...
@@ -99,6 +106,24 @@ public class SplashActivityViewModel extends ViewModel {
...
@@ -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
());
}
});
}
}
});
}
}
}
}
app/src/main/res/layout/fragment_qa.xml
View file @
5ac2e857
...
@@ -4,16 +4,33 @@
...
@@ -4,16 +4,33 @@
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"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
<
cn.yunliyunwai.beyondclouds.view.BeyondSearchBar
android:id=
"@+id/
textView
"
android:id=
"@+id/
search_bar
"
android:layout_width=
"
wrap_cont
ent"
android:layout_width=
"
match_par
ent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"问答"
app:layout_constraintTop_toBottomOf=
"@id/magic_indicator"
android:textSize=
"24dp"
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_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_to
TopOf=
"parent
"
/>
app:layout_constraintTop_to
BottomOf=
"@id/search_bar
"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/
dynamic
_item.xml
→
app/src/main/res/layout/
post
_item.xml
View file @
5ac2e857
File moved
app/src/main/res/layout/question_item.xml
0 → 100644
View file @
5ac2e857
<?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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment