Android获取RecyclerView的ItemView

    正常创建RecyclerView布局,正常创建Adapter设配器类,正常对Activity中的RecyclerView添加适配器及布局管理器。。。
    看下效果

    怎么获取到列表的第一个Item并修改字体为红色?
    刚开始我想到了getChildAt(),这个方法只能获取RecyclerView中第一页加载的可见Item的View,再向下就不行了,接下来看操作20-25行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> datas = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setData();
setRecycler();
}

private void setRecycler() {
MyRecyclerViewAdapter myRecyclerViewAdapter = new MyRecyclerViewAdapter(datas,this);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);
recyclerView.setAdapter(myRecyclerViewAdapter);
recyclerView.setLayoutManager(linearLayoutManager);

int position = 0;//想要获取到的item的position
// 因为item的根布局是LinearLayout,所以将获取到的itemView强转为LinearLayout
LinearLayout linearLayout = (LinearLayout) recyclerView.getLayoutManager().findViewByPosition(position);
// 根布局LinearLayout仅包含了一个TextView
TextView textView = (TextView) linearLayout.getChildAt(0);
textView.setTextColor(MainActivity.this.getResources().getColor(R.color.red));

}

private void setData() {
for (int i = 0; i < 10; i++) {
datas.add("数据" + i);
}
}

private void init() {
recyclerView = findViewById(R.id.recyclerView);
}
}

    RecyclerView加载完毕后,获取通过它的布局管理器获取它的第一个item,理论是可以的,但是运行会报错,找不到代码中linearLayout变量的对象

    这是因为Activity的onCreate()方法中,只是对页面进行初始化,View还没有被绘制,所以RecyclerView的item无法获取;当onResume方法被调用时,View才会被绘制,软件进入运行状态(例如oncreate中View.getWidth和View.getHeight无法获得view的高度和宽度)
    解决:OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> datas = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setData();
setRecycler();
}

private void setRecycler() {
MyRecyclerViewAdapter myRecyclerViewAdapter = new MyRecyclerViewAdapter(datas,this);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false);
recyclerView.setAdapter(myRecyclerViewAdapter);
recyclerView.setLayoutManager(linearLayoutManager);

// 获取recyclerView视图树的观察者,添加一个布局的监听器当布局改变时调用
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int position = 0;//想要获取到的item的position
// 因为item的根布局是LinearLayout,所以将获取到的itemView强转为LinearLayout
LinearLayout linearLayout = (LinearLayout) recyclerView.getLayoutManager().findViewByPosition(position);
// 根布局LinearLayout仅包含了一个TextView
TextView textView = (TextView) linearLayout.getChildAt(0);
textView.setTextColor(MainActivity.this.getResources().getColor(R.color.red));
}
});
}

private void setData() {
for (int i = 0; i < 10; i++) {
datas.add("数据" + i);
}
}

private void init() {
recyclerView = findViewById(R.id.recyclerView);
}
}

    看下效果

    Fragment布局中同样适用