設置RecyclerView的ViewHolder的顯示和隱藏
如果是ListView
的話,可以直接設置item
的visibility = View.GONE
就可以隱藏得一乾二淨。但如果是RecyclerView
的話,僅僅只是設置了item
的visibility = View.GONE
且沒有任何margin
不會有同樣的效果,還是會在隱藏了的item的位置留下空白。需要設置itemView
的LayoutParams
,以及把儘量不用margin
而是用padding
代替。
務必要在onAttachedToRecyclerView
之前設置LayoutParams
,而且這個LayoutParams
是RecyclerView.LayoutParams
。如果不小心寫成LinearLayout.Params
或者RelativeLayout.LayoutParams
的話,可能會報錯或者隱藏失敗。
文章目錄
可行的兩種方法:
(1) ViewHolder裏面設置LayoutParams
網上有一種最直接的方法,就是直接在ViewHolder裏面加上一個setVisibility()
,然後在onBindViewHolder()
直接調用就可以了。
public static class ViewHolder extends RecyclerView.ViewHolder {
public void ViewHolder(View itemView) {
super(itemView);
}
public void setVisibility(int visibility) {
itemView.setVisibility(visibility);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams();
if (visibility == View.VISIBLE) {
params.width = RecyclerView.LayoutParams.MATCH_PARENT;
params.height = RecyclerView.LayoutParams.WRAP_CONTENT;
} else {
params.width = 0;
params.height = 0;
}
itemView.setLayoutParams(params);
}
}
(2) 在onCreateViewHolder裏面設置LayoutParams
onCreateViewHolder()
可以接收參數viewType
來判斷要不要隱藏,所以要重寫getItemViewType()
。
@Override
public int getItemViewType(int position) {
return mDataList.get(position).getVisibility();
}
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycler_view_layout, parent, false);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
if (viewType == View.VISIBLE) {
params.width = RecyclerView.LayoutParams.MATCH_PARENT;
params.height = RecyclerView.LayoutParams.WRAP_CONTENT;
} else {
params.width = 0;
params.height = 0;
}
view.setLayoutParams(params);
return new ViewHolder(view);
}