- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习给定 here 的 Android MVP 架构.基于这个例子,我创建了自己的简单应用程序,它只显示带有 recyclerview
的列表。具有下拉刷新功能。
当列表被拉出时,我想首先清除 recyclerview,然后再次从存储库重新加载数据(假延迟)。但是,当我清除 RecyclerViewAdpater 中的数据时,存储库中的所有数据也被清除,没有任何内容可显示。我只是不明白原因。
这是我创建 Presenter 和 View(即 Fragment)的 Activity :
protected void onCreate(Bundle savedInstanceState) {
mainFragment = MainFragment.newInstance();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.contentFrame, mainFragment);
transaction.commit();
new MainPresenter(new MainDataRepository(), mainFragment);
}
这是我的 fragment (MainFragment) - 注意: updateList(null) - 这是它清除所有数据的地方,包括存储库内部:
public MainFragment() {
}
public static MainFragment newInstance() {
return new MainFragment();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//....
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
recyclerAdapter.updateList(null); // **This is where it clears all data, including inside Repository**
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mPresenter.loadList(); // to reload the list
}
}, 1500);
}
});
//...
}
@Override
public void onResume() {
super.onResume();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mPresenter.loadList();
}
}, 3000);
}
@Override
public void setPresenter(MainContractor.Presenter presenter) {
mPresenter = presenter;
}
@Override
public void showList(List<String> mainDataList) {
if(recyclerAdapter == null) {
recyclerAdapter = new RecyclerAdapter(mainDataList);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(recyclerAdapter);
}else{
recyclerAdapter.updateList(mainDataList);
}
}
这是我的演示者 (MainPresenter):
public MainPresenter(MainDataRepository mainDataRepository, MainContractor.View view){
mMainDataRepository = mainDataRepository;
mMainContractorView = view;
view.setPresenter(this);
}
@Override
public void loadList() {
ArrayList<String> strings = mMainDataRepository.getList();
mMainContractorView.showList(strings);
}
这是我的存储库 (MainDataRepository):
private ArrayList<String> repositoryList;
public MainDataRepository() {
createList();
}
private void createList() {
if(repositoryList == null){
repositoryList = new ArrayList<>();
}
for (int i = 1; i <= 10; i++) {
repositoryList.add("Item " + i);
}
}
public ArrayList<String> getList(){
return repositoryList;
}
最后一个,这就是我在 RecyclerAdapter 中更新 recyclerview 的方式:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
private List<String> stringsList;
public RecyclerAdapter(List<String> stringsList) {
this.stringsList = stringsList;
}
public void updateList(List<String> newStrings){
if(newStrings != null){
stringsList = newStrings;
}else{
stringsList.clear();
}
notifyDataSetChanged();
}
//....
}
为什么 RecyclerAdapter 中的 updateList 方法也会清除存储库中的数据 ArrayList<String> repositoryList
?
最佳答案
这是因为你引用了同一个对象。在这里你从存储库返回你的列表,更好的选择是返回它的副本:
public ArrayList<String> getList(){
return new ArrayList<>(repositoryList);
}
然后它将是另一个具有复制项的对象。
关于Android MVP架构——repository和view之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41363429/
在过去的几个月里,我一直在使用 Bzr 对我的项目进行版本控制。我是唯一的开发人员,目前我只有一个本地项目目录中的所有内容,我提交并同步到 DriveHQ。 我现在想到了一些可能会打破这条主线的大规模
我在一个多模块项目中使用 Maven 3.2.3。我想生成一个 checkstyle 和 findbugs 报告,所以我配置了以下内容:
我注意到 Repository 通常通过以下任一方式实现: 方法一 void Add(object obj); void Remove(object obj); object GetBy(int id
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
这是我的设置的详细信息: Gitlab 版本:5.2操作系统:Centos 6.3我在创建新项目 (/projects/new) 时导入现有存储库。 创建了一个新的 EMPTY 项目,但是没有导入存储
我的文件夹结构如下: repo1 | |---file1 |---fold1 | |---file2 |---repo2 | | |---file3 假设我有两
假设我有一个 TeacherRepository,需要根据下面的代码使用 CourseRepository。 Teacher 和 Course 形成多对多的关系。教师和类(class)不形成聚合。您会
我要同样的 repositories我在 buildscript.repositories 中指定的阻止与依赖项相同的存储库 repositories堵塞。请看我的例子: 正常 buidldscrip
是否使用 @EnableJpaRepositories 或 jpa:repositories(在 xml 上)让开发人员不要使用 Spring 的 @Repository 标签?当我查看 Spring
我是 git 和 Github 的新手。我已经了解了很多术语(推送、 pull 、提交、分支等),但我将主要使用通俗的说法来解释我最初的期望。 我假设过程是: 1.) Create a git rep
安装 Nexus Repository Manager OSS 3 后,我没有看到用于通过网页上传工件的选项Artifact Upload。 在 Nexus Repository Manager OS
CMS 和 DMS 有什么区别?两者都存储日期,可以访问数据,它们有什么不同?可以使用 apache Jack Rabbit 代替 Alfresco 吗? 最佳答案 我会根据管理数据的可变性来区分这两
在我的earlier question我问的是如何为使用 EF 等 ORM 框架构建的大型应用程序实现存储库/工作单元模式。 我现在无法解决的一个后续问题是将包含业务逻辑的代码放在哪里,但仍然足够低级
我正在尝试为 nuget git 存储库(我刚刚从中克隆)创建 pull 请求。我已经进行了本地提交。 但是当我尝试创建 pull 请求时,出现以下错误: Could not find any rel
我已经看到了下面的问题。 git diff between cloned and original remote repository 我的问题是如何在 SourceTree 中看到这个差异结果(而不
我在通过 Subversion (SVN) 中的 checkin 自动在 Review Board 中创建新的评论条目时遇到了困难。我创建了一个提交后 Hook ,当手动运行时会出现以下异常: Fai
我在尝试集成 Spring Data 时遇到此错误。完整的堆栈跟踪是 nested exception is org.xml.sax.SAXParseException; systemId: http
通知:https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-repository-email.html 触发器:https://
我正在学习 Laravel 中的存储库设计模式,我正在使用 https://github.com/andersao/l5-repository去做这件事。 但是在我将文件夹 prettus 复制/粘贴
我最近开始了一个使用现有数据库(Oracle)和 MVC 4 的项目。已经进行了很多编码..但是代码中没有“策略”..只有 DB -> ORM -> Controller。因此,我正在尝试为开发添加一
我是一名优秀的程序员,十分优秀!