在RecyclerView中添加item的时候
文章目录
- 在RecyclerView中添加item的时候
- 需要的功能
- 1、添加的方式很简单,就是在list中添加,然后通知事件就完成
- 2、将layout中的输入的数据使用dataBinding来返回
- 3、使用startActivityForResult,遇到问题
- 4、list自动定位
需要的功能
进入一个新的activity中输入一系列信息,然后退出后依据刚才的内容,刷新列表。
1、添加的方式很简单,就是在list中添加,然后通知事件就完成
public void addItem(int position, RecyclerView_item item) {
items.add(position,item);
notifyItemInserted(position);
}
2、将layout中的输入的数据使用dataBinding来返回
把实体类的变量,变为ObservableField。同时重写一下get和set方法
private ObservableField<String> title = new ObservableField<>();
public RecyclerView_item() {
title.set("");
mvvmUtils.toObservable(title).subscribe(s -> Log.d(TAG, " title changed. Now the title is: " + title));
}
public String getTitle() {
return title.get();
}
public void setTitle(String title) {
this.title.set(title);
}
然后进行数据绑定
之前学到的都是创建一个ViewModel来进行数据绑定的,并且在这个ViewModel中写layout中的点击事件等情况。但是这里暂时没想怎么完成这样的正确架构,所以就只是简单在activity中进行了数据绑定
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: ");
super.onCreate(savedInstanceState);
item = new RecyclerView_item();
ActivityNewItemcontextBinding binding =
DataBindingUtil.setContentView(this, R.layout.activity_new__itemcontext);
binding.setItem(item);
然后在layout中设置一下就行
3、使用startActivityForResult,遇到问题
要使得有数据传回来,所以使用
FAB.setOnClickListener(v -> {
Log.d(TAG, "FAB click ");
Intent intent = new Intent(RecyclerView_activity.this, New_ItemContext_activity.class);
startActivityForResult(intent, add_Item);
});
然后在新建item的new_Item_activity中。把数据放进来
这里就很疑惑,
这段代码我放在onDestory中为什么不行呢?
必须要放在onBackPressed()中?我觉得我很正常的按退格键也是调用了onDestory的,所以代码也是运行了的
为什么运行了代码使用了却没有效果呢
Log.d(TAG, "onBackPressed: ");
//没有成功呢
Intent intent = new Intent();
intent.putExtra(ACTIVITY_RESULT_TITLE, item.getTitle());
intent.putExtra(ACTIVITY_RESULT_CONTEXT, item.getContext());
setResult(RESULT_OK, intent);
//很明显,startActivityForResult这个方法必须要通过finish才能收到数据。
finish();
原来这和setResult使用的时机有关:
参考资料:
在 B 退回 A过程中,执行过程是
B—onPause
A—onActivityResult
A—onRestart
A—onStart
A—onResume
B—onStop
B—onDestroy
而A的 onActivityResult() 需要在B的onPause之后,A的onRestart之前这中间调用,所以B中的setResult()函数应该放在B的onPause之前调用。不然怎么能在restart的时候获得数据呢,所以把代码放在onDestory中是无效的。
所以,这段代码实际上能使用的时机只有:重写onBackPressed()方法 、 按点击事件中显式的调用finish()
4、list自动定位
更新RecyclerList之后,在末尾的还好说,如果放在list开头的话,它默认情况下并不会给你定位到新建的item的位置。
参考资料:
答案:(我使用第三种)
第一种方法:
mRecycleView.smoothScrollBy(distance,duration);
第二种方法:
mRecycleView.smoothScrollOffset(offset);
第三种方法:
mRecycleView.smoothToPosition(index);
adapter.addItem(0, recyclerView_item);
recyclerView.smoothScrollToPosition(0);