Разработка мобильного приложения для развивающего образовательного центра



Pdf көрінісі
бет20/26
Дата29.05.2022
өлшемі1,62 Mb.
#35872
түріРеферат
1   ...   16   17   18   19   20   21   22   23   ...   26
public
abstract
class
BaseFragment
<

extends
BasePresenter
>
extends
Fragment 
implements
BaseView 
{
@Override
public
void
show
(
@NonNull
final
Context pContext
,
@Nullable
final
Bundle 
pArguments
)
{
if
(
pArguments 
!=
null
)
setArguments
(
pArguments
);
((
BaseActivity
)
pContext
)
.
getSupportFragmentManager
()
.
beginTransaction
()
.
replace
(
R
.
id
.
container
,
this
)
.
addToBackStack
(
null
)
.
commit
();
}
@Override
public
void
hide
()
{
if
(
isAdded
()
&&
isVisible
())
{
getFragmentManager
()
.
beginTransaction
()
.
hide
(
this
)


64 
.
commit
();
}
}
@Override
public
void
close
()
{
if
(
isAdded
())
{
getActivity
()
.
getSupportFragmentManager
()
.
popBackStack
();
}
}
@Override
public
void
onViewCreated
(
View view
,
@Nullable
Bundle savedInstanceState
)
{
super
.
onViewCreated
(
view
,
savedInstanceState
);
mPr 
=
PresenterFactory
.
create
(
this
);
onSetup
();
mPr
.
onCreate
();
}
protected
void
onSetup
()
{}
@SuppressWarnings
(
"unchecked"
)
protected
<
T
>
T getArgument
(
String pArgName
)
{
return
(
T
)
getArguments
().
get
(
pArgName
);
}
protected
boolean
hasArgument
(
String pArgName
)
{
return
getArguments
()
!=
null
&&
getArguments
().
containsKey
(
pArgName
);
}
}
Код 10. Фрагмент BaseViewFragment 
Как можно заметить, некоторыми местами код фрагмента похож на код 
BaseActivityView, по этой причине они оба выбраны в одну категорию для 
реализации интерфейса BaseView, и каждый из них отвечает за свое 
отображение, но различия на уровне реализации существенны. Фрагменты 
зависимы от Activity поэтому всегда имеют к ним доступ. В методе show 
переданный контекст явно преобразуется к BaseView чтобы вызвать 
менеджер фрагментов для начала транзакции отображения фрагмента в 


65 
Activity. Остальные методы, которые есть в классе, похожи на методы, 
которые мы реализовывали в BaseActivityView, и особого интереса не 
представляют. 
Можно приступить к реализации раздела с новостями, в котором у нас 
будет список новостей с картинками и полосой прокрутки: 
public
class
NewsFragment
extends
BaseFragment
<
NewsPresenter
>
implements
NewsView
,
LoadMoreSwipeRefreshLayout
.
OnUpRefreshListener
,
SwipeRefreshLayout
.
OnRefreshListener
{
@Override_protected'>@Override
protected
void
onSetup
()
{
initRefreshLayout
();
pr
().
getNews
(
mPage
);
}
private
void
initRefreshLayout
()
{
mRefreshLayout
.
setOnRefreshListener
(
this
);
mRefreshLayout
.
setOnUpRefreshListener
(
this
);
mRefreshLayout
.
setColorSchemeResources
(
R
.
color
.
colorPrimary
,
R
.
color
.
colorAccent
);
}
@Override
public
void
showNews
(
List
<
News
>
pNews
)
{
hideRefreshLoading
();
if
(
mNewsList
.
getCount
()
==
0
)
{
mNewsAdapter 
=
new
NewsAdapter
(
pNews
);
mNewsList
.
setAdapter
(
mNewsAdapter
);
}
else
mNewsAdapter
.
addAll
(
pNews
);
}
@Override
public
void
onRefresh
()
{
mPage 
=
FIRST_PAGE
;
if
(
mNewsAdapter 
!=
null
)
mNewsAdapter
.
clear
();
pr
().
getNews
(
mPage
);
}
@Override
public
void
onUpRefresh
()
{
mPage
++;
pr
().
getNews
(
mPage
);
}


66 
@OnItemClick
(
R
.
id
.
list
)
public
void
onItemClick
(
View pView
)
{
Bundle args 
=
new
Bundle
();
args
.
putInt
(
CONST
.
VIEW_ID
,
ViewFactory
.
NEWS_ITEM_VIEW
);
args
.
putSerializable
(
CONST
.
CONTENT
,
((
News
)
((
BaseViewHolder
)
pView
.
getTag
()).
item
()));
ViewFactory
.
create
(
ViewFactory
.
BACK_CONTENT_VIEW
).
show
(
getActivity
(),
args
);
}
}
Код 11. Новостной фрагмент 
Для работы раздела новостей необходим интернет, из которого будут 
загружаться данные. Сначала мы делаем запрос на сервер, откуда 
постранично получаем данные и на основе их формируем страницу. Новости 
можно обновить, потянув сверху экрана вниз и новости заново загрузиться.
Чтобы пользователь понимал, что страница обновляется сверху находиться 
значок загрузки. Если пользователь пролистает новости до конца, то 
подгружаются еще десять или меньше новостей, при этом снизу 
отображается анимация загрузки. В случае если новости кончились, то 
загрузка прекращается. Если пользователь на элемент списка то происходит 
открытие нового окна, в котором находиться подробная информация о 
новости. 
Чтобы картина разработки была четче, рассмотрим презентер 
новостного раздела: 
public
class
NewsPresenterImpl
extends
BasePresenterImpl
<
NewsView
>
implements
NewsPresenter 
{
public
NewsPresenterImpl
(
NewsView pView
)
{
super
(
pView
);
}
@Override
public
void
getNews
(
int
pPage
)
{
DataProvider
.
getInstance
() 
.
getNews
(
pPage
)
.
subscribeOn
(
Schedulers
.
io
())
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
pNewsList 
->
{
view
().
showNews
(
pNewsList
);
},
pThrowable 
->
{


67 
view
().
error
(
pThrowable
.
getLocalizedMessage
());
});
}
}
Код 12. Презентер новостного раздела 
Исходный код презентера элегантен, содержит минимум кода, 
выполняет только поставленную задачу, запрашивает новости из провайдера 
в другом потоке и получает уже в главном потоке. В случае ошибки 
отображает ее в окне новостей. 
ViewHolder является паттерном в Android для компактного хранения и 
отображения данных, является частью адаптера для ListView:
public
class
NewsHolder
extends
BaseViewHolder
<
News
,
BasePresenter
>
implements
NewsListItemView 
{
@BindView
(
R
.
id
.
header
)
TextView header
;
@BindView
(
R
.
id
.
date
)
TextView date
;
@BindView
(
R
.
id
.
description
)
TextView description
;
public
NewsHolder
(
View pView
)
{
super
(
pView
);
}
@Override
protected
void
fill
()
{
header
.
setText
(
Html
.
fromHtml
(
item
().
getTitle
()));
date
.
setText
(
item
().
getDate
());
if
(
TextUtils
.
isEmpty
(
item
().
getExcerpt
()))
{
description
.
setText
(
Html
.
fromHtml
(
item
().
getTitle
()));
}
else
description
.
setText
(
Html
.
fromHtml
(
item
().
getExcerpt
()));
}
}
Код 13. Холдер списка новостей 
Холдер занимается хранением и преобразованием сырых данных в 
представление. 
Для отображения подробной информации открывается новое окно, в 
котором отображается контент. Данное окно реализовано с помощью 


68 
Activity, которое отображает в себе фрагмент, в котором уже отображается 
сам контент: 
public
class
BackContentActivity
extends
BaseViewActivity 
{
@Override
protected
void
onSetup
()
{
ViewFactory
.
create
(
getArgument
(
CONST
.
VIEW_ID
)).
show
(
this
,
getArguments
());
}
}
Код 14. Окно с фрагментом внутри себя 
Выбранная архитектура несет большие преимущества для дальнейшей 
разработки и поддержки приложения, так как мы можем отобразить любой 
фрагмент приложения, которое производиться в фабрике фрагментов, также 
у нас появляется возможность простой портации приложения на планшеты с 
низкими затратами на разработку. 
Теперь можно рассмотреть сам фрагмент с подробной информацией о 
новости: 
public
class
NewsItemFragment
extends
BaseWebViewFragment
<
BasePresenter
>
implements
NewsItemView 
{
@Override
protected
void
onSetup
()
{
News news 
=
getArgument
(
CONST
.
CONTENT
);
getActivity
().
setTitle
(
Html
.
fromHtml
(
news
.
getTitle
()));
loadData
(
news
.
getContent
());
}
}
Код 14. Фрагмент с подробной информацией 
Сам фрагмент базируется на другом фрагменте, который содержит в 
себе специальный компонент для отображения Html: 
public
abstract
class
BaseWebViewFragment
<

extends
BasePresenter
>
extends
BaseFragment
<
T
>
{
@BindView
(
R
.
id
.
content
)
WebView mContentView
;
@Override
protected
int
getLayoutId
()
{
return
R
.
layout
.
fragment_content
;
}


69 
protected
void
loadUrl
(
String pUrl
)
{
mContentView
.
loadUrl
(
pUrl
);
}
protected
void
loadData
(
String pData
)
{
mContentView
.
loadData
(
pData
,
"text/html; charset=UTF-8"
,
null
);
}
}
Код 15. Фрагмент для отображения контента 
Данный фрагмент позволяет своим потомкам, отображать в себе 
различный контент который может быть загружен как локально, так и через 
интернет в виде ссылки на ресурс. Выбор пал на реализацию данной 
архитектуры из-за того что большинство контента у нас находится в формате 
Html и это удобно для работы. 
Рассмотрим следующий раздел направлений, в котором отображается 
список направлений деятельности предприятия: 


Достарыңызбен бөлісу:
1   ...   16   17   18   19   20   21   22   23   ...   26




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет