引言
RecyclerView是Google建议使用用于替换GridView,ListView等控件的新控件,这里主要记录在替换过程中所遇到的一些问题, 以及它们的解决办法。
如何定义RecyclerView
RecyclerView相比于GridView等控件,比较大的区别有:
1、默认使用ViewHolder进行View的重用。
2、使用LayoutManager进行布局的控制,更加灵活。
在使用时,需要分别定义并设置:
RecyclerView recyclerView = findViewById(R.id.content_grid_view);
mRecyclerViewAdapter = new RecyclerViewAdapter(MainPage.this);
recyclerView.setAdapter(mRecyclerViewAdapter);
int column = getResources().getInteger(R.integer.grid_columns);
final StaggeredGridLayoutManager layoutManager =
new StaggeredGridLayoutManager(column, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
其中StaggeredGridLayoutManager是原生提供的瀑布流布局,只需要指定列数及方向即可。
注意到这里绑定了我们自定义的RecyclerViewAdapter,其实现如下:
class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> {
private Context mAdapterContext;
private RecyclerViewAdapter(Context context) {
mAdapterContext = context;
}
@Override
public @NonNull RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mAdapterContext).inflate(R.layout.grid_item, parent, false);
return new RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder viewHolder, int position) {
HashMap<String, String> map = mList.get(position);
if (map == null) {
Log.d(TAG, "map is null");
return;
}
String imageData = map.get(IMAGE_KEY);
String textData = map.get(TEXT_KEY);
Util.setPicFromUrl