BAr*_*ell 6 java android android-layout android-view android-recyclerview
我有一个RecyclerView。在适配器中,我有一个布尔标志来确定应为所有项目使用哪种布局:
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
private boolean mIsSecondModeEnabled;
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(mIsSecondModeEnabled ?
R.layout.layout_second_mode_item :
R.layout.layout_first_mode_item, parent, false);
return new MyHolder(view);
}
public void setModeEnabled(boolean enabled) {
mIsSecondModeEnabled = enabled;
notifyDataSetChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
该代码无法完全正确地工作。当我打电话给setModeEnabled(true)
一些显示layout_first_mode_item
布局的项目时。
如何实现呢?
onCreateViewHolder()
如果ViewHolder
已创建ViewHolder
的池中没有,则将调用。在此回调中,您可以指定要RecyclerView
创建的视图。
onCreateViewHolder()
执行完之后不一定会被调用notifyDataSetChanged()
。而是onBindViewHolder()
会被触发。这是您应该更新视图的地方。
getItemViewType()
根据您的用例覆盖并返回布局ID:
@Override
public int getItemViewType(final int position) {
return mIsSecondModeEnabled ? R.layout.my_layout_1 : R.layout.my_layout_2;
}
Run Code Online (Sandbox Code Playgroud)
ViewHolder
为这两种布局创建2个类,并根据回调的参数从onCreateViewHolder()
适当的返回值创建。ViewHolder
viewType
onCreateViewHolder()
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == R.layout.my_layout_1) {
// create FirstViewHolder
} else if (viewType == R.layout.my_layout_2) {
// create SecondViewHolder
}
// return created ViewHolder
}
Run Code Online (Sandbox Code Playgroud)
然后在onBindViewHolder()
回调中设置您的视图。
归档时间: |
|
查看次数: |
1023 次 |
最近记录: |