[英]How to access LayoutManager from RecyclerView.Adapter to get scrollToPosition?
[英]Where to declare RecyclerView, RecyclerView.Adapter and RecyclerView.LayoutManager?
所以我有两个recycleView 的例子,一个在onCreate 方法中声明上述内容,另一个在MainActivity 中声明。 有什么区别吗? 一个是对还是错? 猜猜这不是 android 概念,而是 java 概念。 这是代码
package com.commonsware.jetpack.samplerj.recyclerview;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class MainActivity extends AppCompatActivity {
private final Random random = new Random();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView items = findViewById(R.id.items);
ColorAdapter adapter = new ColorAdapter(getLayoutInflater());
adapter.submitList(buildItems());
items.setLayoutManager(new LinearLayoutManager(this));
items.addItemDecoration(
new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
items.setAdapter(adapter);
}
private List<Integer> buildItems() {
ArrayList<Integer> result = new ArrayList<>(25);
for (int i = 0; i < 25; i++) {
result.add(random.nextInt());
}
return result;
}
}
和另一个例子
public class MyActivity extends Activity {
private RecyclerView recyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
recyclerView.setHasFixedSize(true);
// use a linear layout manager
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
// specify an adapter (see also next example)
mAdapter = new MyAdapter(myDataset);
recyclerView.setAdapter(mAdapter);
}
// ...
}
从我从问题和代码中可以理解的情况来看,我看到示例中的两个 recyclerviews 都在每个活动的 onCreate 方法中被调用,并且布局管理器也在 onCreate 方法中被分配。 所以我认为那里没有区别。 我实际上可以告诉你的是,这些示例都没有遵循 SOLID 原则。
尝试在此处阅读有关 SOLID 原则的信息: Medium about solid principle
此外,第二个示例似乎没有向布局管理器添加方向,而第一个示例使用 Item 装饰器来执行此操作。
我希望你的问题是正确的!
它们只是变量声明的不同技术,不同之处在于这些变量的scope 。
在第一个示例中,诸如items
( RecyclerView
对象)、 adapter
( ColorAdapter
对象)等变量是onCreate()
方法的本地变量,不能在该特定方法之外使用。 这些变量在onCreate()
方法的开头创建并在同一方法的结尾销毁。
在第二个示例中,它们使用全局私有 scope声明,意思是“可以在此 class 的任何地方使用,但不能从类外使用”。 它们是在MyActivity
class的构造函数调用中创建的,并在MyActivity
的onDestroy()
调用中被销毁。
推荐:
总是尽量使用更多的局部变量和更少的全局变量。 这将为资源有限的设备(例如 android 电话)生成内存友好的代码(尽管 XD 目前无效)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.