我一直在关注Google提供的MVP设计模式 来重构我的应用程序.我有一个MainActivity和许多片段,我为每个片段创建活动似乎很麻烦,所以我一直在考虑在片段中注册演示者.我所看到的是每个片段都注册了它自己的演示者,但我不确定它有多大的错误...... :)
所以这是我的演示者:
public class FirstPresenter implements FirstContract.Presenter {
private final FirstContract.View mView;
public FirstPresenter(FirstContract.View view) {
mView = view;
}
@Override
public void start() {
Log.e(TAG, "Start");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的片段:
public class FirstFragment extends Fragment implements FirstContract.View {
private FirstContract.Presenter mPresenter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container
, Bundle savedInstanceState) {
...
// I register firstFragment's presenter here.
mPresenter = new FirstPresenter(this);
...
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这是正确的方法吗?我可以在活动中将Presenter注册到Fragment中吗?如果不是正确的方法,是否有一些很好的例子来处理一个活动和多个片段的MVP?
谢谢你们,BR!
我正在使用 MVVM,并且已经对其进行了不同的实现,但仍然让我怀疑的一件事是如何从我的 ViewModel 的存储库 (Firebase) 获取数据,而不将任何生命周期附加到 ViewModel。
我已经observeForever()从 ViewModel实现了,但我认为这不是一个好主意,因为我认为我应该通过回调或转换从我的存储库到我的 ViewModel 进行通信。
我在这里留下一个例子,我从 Firebase 获取设备并更新我的 UI,如果我们能在这里看到,我正在观察来自 UI 的 repo 的数据,但从 ViewModel 我也在观察来自 repo 的数据,这就是我真正怀疑我是否使用正确方法的地方,因为我不知道如果我的视图被破坏是否observeForever()会被清除onCleared(),所以如果视图死亡,它不会让观察者保持活动状态。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val deviceId = editText.text.toString().trim()
observeData(deviceId)
}
}
fun observeData(deviceId:String){
viewModel.fetchDeviceData(deviceId).observe(this, Observer {
textView.text = "Tipo: ${it.devType}"
})
Run Code Online (Sandbox Code Playgroud)
class MainViewmodel: ViewModel() {
private val repo = Repo()
fun fetchDeviceData(deviceId:String):LiveData<Device>{
val mutableData = MutableLiveData<Device>()
repo.getDeviceData(deviceId).observeForever {
mutableData.value = it
}
return mutableData …Run Code Online (Sandbox Code Playgroud) android mvvm kotlin android-livedata android-architecture-components
我来自SQL背景,所以我在设计我的nosql firebase架构时遇到了问题.我习惯于能够使用"WHERE"子句查询任何内容,而且在firebase中这样做似乎更难(尽管性能很容易弥补它!).
我正在为歌曲存储"轨道"对象.这些对象具有键/值对,如artist_name,曲目标题,流派,等级,created_date等,如下所示:
tracks
|_____-JPl1zwOzjqoM8xDTFll
|____ artist: "Bob"
|____ title: "so long"
|____ genre: "pop"
|____ rating: 52
|____ created: 1403129692781
|
|_____ -JPv7KnVi8ASQJjRDpvh
|____ artist: "Mary"
|____ title: "im alright now"
|____ genre: "rock"
|____ rating: 70
|____ created: 1403129692787
Run Code Online (Sandbox Code Playgroud)
我网站上的默认行为是列出所有这些曲目,最新添加的曲目显示在列表顶部.我可以将我的$优先级设置为创建并将其设置为负(创建*-1)以实现此效果.
但是在将来,我希望能够通过其他方式过滤/查询列表,例如:
检索所有具有摇滚,流行或嘻哈风格的曲目.
检索所有评分为80或更高且已在过去7天内添加的曲目.
如何在firebase中实现这一目标?我的理解是,实际上只有两种订购数据的方法:
通过"ID"值,其中包含"firebaseURL.firebaseio.com/tracks/id"的物理位置,在我的情况下,当我添加曲目时,会自动为我选择.这是可以的(我认为),因为我有列出详细信息的单个跟踪页面的页面,我网站上的URL类似于"www.mysite.com/tracks/-JPl1zwOzjqoM8xDTFll".
通过使用$ priority,在我的情况下,我使用了"创建"值,以便按正确的日期顺序排列我的列表.
鉴于我设置的方式(如果有更好的方法,请告诉我),有没有办法可以轻松查询特定类型或特定评级?
我阅读了博客"将您的数据归结为正常"(https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html),我想我明白了.从Anant所描述的,实现我想要的一种方法可能是在firebase中为一个类型创建一个新对象并列出那里的所有轨道,如下所示:
tracks
|______ All
|_____ -JPlB34tJfAJT0rFT0qI
|_____ -JPlB32222222222T0qI
|_____ -JPlB34wefwefFT0qI
|______ Rock
|_____ -JPlB32222222222T0qI
|_____ -JPlB34tJfAJT0rFT0qI
|______ Pop
|_____ -JPlB34wefwefFT0qI
Run Code Online (Sandbox Code Playgroud)
博客的前提是,硬盘空间很便宜,但用户的时间不是.因此,可以存在重复数据,因为它允许更快的读取.
这是有道理的,我不介意这种方法.但这只有在用户想要从一种类型中选择所有曲目时才有效.如果他们想要从BOTH摇滚和流行音乐中获得所有曲目怎么办?每次有人提交任何类型的歌曲时,我是否必须存储另一个名为Rock&Pop的对象并在其中存储音轨?
genre
|_______pop-rock
|_________ -JPlB34tJfAJT0rFT0qI (a rock …Run Code Online (Sandbox Code Playgroud) 我有一个String并且想要替换其中的一些单词.我有一个HashMap关键是要替换的占位符和替换它的单词的值.这是我的老派代码:
private String replace(String text, Map<String, String> map) {
for (Entry<String, String> entry : map.entrySet()) {
text = text.replaceAll(entry.getKey(), entry.getValue());
}
return text;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将此代码编写为lambda表达式?
我尝试entrySet().stream().map(...).reduce(...).apply(...);但无法使其工作.
提前致谢.
我正在尝试使用本教程:
https://www.youtube.com/watch?v=2J6spwAVP0M
但在我的复杂应用程序上实现它只是没有工作所以我从头开始尝试..
我创建了这个简单的MainActivity:
public class MainActivity extends AppCompatActivity{
Firebase mRef;
com.firebase.ui.FirebaseListAdapter<String> myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRef = new Firebase("https://<myURL>..");
myAdapter = new FirebaseListAdapter<String>(this,String.class,android.R.layout.simple_list_item_1,mRef) {
@Override
protected void populateView(View view, String s, int i) {
TextView text = (TextView)view.findViewById(android.R.id.text1);
text.setText(s);
}
};
Button addBtn = (Button) findViewById(R.id.add_button);
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRef.push().setValue("test123");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有几个问题:
1)什么触发populateView?我无法让它运行
2)究竟应该android.R.layout.simple_list_item_1用什么替换?我尝试创建自己的listview并用我的替换上面R.id.listView但没有任何反应..我无法弄清楚这个魔法是如何工作的..
3)即使这个简单的应用程序不起作用..按钮确实将"test123"添加到服务器上的正确位置,但我在我的应用程序上看不到任何内容..什么是错的?
android listadapter firebase firebase-realtime-database firebaseui
我有一个非常奇怪的问题,我已运行调试器并单步执行代码以查看 Firestore 中的每个元素
我的 firestore 数据库中有一个产品列表
结构
shop -> shopId -> products -> productList
Run Code Online (Sandbox Code Playgroud)
我有一个数据类如下
@Parcelize
data class Producto(
val imagenProducto: String = "",
val nombreProducto: String = "",
val descProducto: String = "",
val precio: Int = 0,
val hasDescuento: Boolean = false,
val tipoDescuento: Double = 0.0,
val isCombo: Boolean = false
) : Parcelable
Run Code Online (Sandbox Code Playgroud)
现在,我用来过滤的代码isCombo创建两个列表,其中一个列表将包含所有产品(如果需要,可享受折扣)和组合(如果布尔isCombo值设置为 true)
现在,这很奇怪,因为我的代码获取所有这些文档并将其发送到我的视图
suspend fun getProductosList(comercioId:String):Resource<MutableList<Producto>>{
val productList = mutableListOf<Producto>()
val snapshot = FirebaseFirestore.getInstance().collection("comercios").document(comercioId).collection("products").get().await()
for(producto in snapshot){
productList.add(producto.toObject(Producto::class.java))
} …Run Code Online (Sandbox Code Playgroud) 我的结构
因此,我有一个应用程序,用户可以在其中上载适配器中的帖子。我可以检索帖子说明和帖子图片,但是当我尝试检索发布者的名称时,应用似乎崩溃了,要在每篇文章中检索名称,都会在数据库中添加一个带有上载者ID的孩子。这是我的课程文件:
public String image_thumb;
public String user_id;
public String image_url;
public String desc;
public BlogPost(){}
public BlogPost(String user_id, String image_url, String desc, String image_thumb) {
this.user_id = user_id;
this.image_url = image_url;
this.desc = desc;
this.image_thumb = image_thumb;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getImage_url() {
return image_url;
}
public void setImage_url(String image_url) {
this.image_url = image_url;
}
public String getDesc() {
return desc;
}
public void …Run Code Online (Sandbox Code Playgroud) Kotlin 提供了 Array.isArrayOf() 来检查数组是否属于某种类型。
它是这样使用的
if(object.isArrayOf<String>())
Run Code Online (Sandbox Code Playgroud)
并像这样定义
/**
* Checks if array can contain element of type [T].
*/
@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> Array<*>.isArrayOf(): Boolean =
T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)
但它仅适用于 Array。我需要检查ArrayList。
我想像这样改变签名。
@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> ArrayList<*>.isArrayListOf(): Boolean =
T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)
但 class.java.componentType 特定于 Array
如何检查我拥有的 ArrayList 类型?
我应该澄清一下,我只关心它是否是 3 种类型之一,所以我不需要完全开放式的检查方式。
所以我正在使用ModalBottomSheet,它引起我的注意的是,sheetState 有 2 个公共方法,show()文档中hide()说show()
/**
* Show the bottom sheet with animation and suspend until it's shown. If the sheet is taller
* than 50% of the parent's height, the bottom sheet will be half expanded. Otherwise it will be
* fully expanded.
*
* @throws [CancellationException] if the animation is interrupted
*/
suspend fun show() {
val targetValue = when {
hasHalfExpandedState -> HalfExpanded
else -> Expanded
}
animateTo(targetValue = targetValue)
} …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用firebase作为Web应用程序用户数据的数据存储.我目前的想法是使用他们加入的时间戳作为引用该用户数据的密钥来存储每个用户的数据.这种方案的优点在于它是一种为用户分配唯一整数ID的简单方法,并且可以简化用户的时间顺序排序.
然而,缺点是如果两个"添加用户"请求被提交相同的数据,应用程序将很乐意添加两个单独的条目,这是不理想的.我可以随意乱扔东西(我开始认为我应该使用电子邮件作为密钥并通过连接数据优先考虑,而不是我当前的方案),但我想我不想这样做.有没有办法防止重复数据?
天真的方法可能只是做以下事情:
if(!searchFirebaseForUser(data)) {
addUser(data);
}
Run Code Online (Sandbox Code Playgroud)
但这绝对是一种竞争条件; 两个请求都很容易查询并在数据库中找不到用户,并且都添加.我想在一个交易中执行此操作,但似乎Firebase事务支持不包括这种情况.有办法处理这个吗?
android ×6
firebase ×5
kotlin ×4
android-architecture-components ×1
android-mvp ×1
atomic ×1
firebaseui ×1
hashmap ×1
java ×1
java-8 ×1
lambda ×1
listadapter ×1
mvp ×1
mvvm ×1
string ×1
transactions ×1