本文中RecyclerView的Adapter是复用的,当RecyclerView处于LinearLayoutManager布局时,点击item中的TextView有效,而RecyclerView处于GridLayoutManager时点击Item发现只有部分区域(显示文字的TextView)有效,原因是LinearLayoutManager占据了Item绝大部分区域,而GridLayoutManager布局时,显示文字的TextView占了Item区域很小一部分,所以点击无效。此时应该把用于接受点击事件的显示图标的TextView宽度设置为match_parent,然后设置其点击事件,而不是LinearLayoutManager时文字TextView设置的点击事件,这样就能响应点击事件了,关键代码如下:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
super.onBindViewHolder(holder, position, payloads);
RecyclerViewItemsData data = m_items.get(position);
holder.m_itemTitle.setText(data.m_title);
holder.m_itemImage.setText(data.m_image);
if (R.layout.recycleview_grid_item == m_layout) {
holder.m_itemImage.setOnClickListener(getOnClickListener(position));
}
if (R.layout.recycleview_linear_item == m_layout) {
holder.m_itemTitle.setOnClickListener(getOnClickListener(position));
}
//如果布局里存在右箭头(二级菜单),则设置为font awesome字体,以显示为符号
if (m_items.get(position).m_bShowArrow) {
TextView arrowIcon = (TextView) m_itemView.findViewById(R.id.tv_arrow);
if (null != arrowIcon) {
arrowIcon.setTypeface(m_font);
}
} else {
TextView arrowIcon = (TextView) m_itemView.findViewById(R.id.tv_arrow);
if (null != arrowIcon) {
arrowIcon.setVisibility(View.INVISIBLE);
Log.d(TAG, "-- Lee -- " + m_items.get(position).m_title +
" arrow is show : " + m_items.get(position).m_bShowArrow);
}
}
if (null != holder.m_tvInfo) {
holder.m_tvInfo.setText(data.m_info);
}
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if (null != layoutParams) {
layoutParams.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
holder.itemView.setLayoutParams(layoutParams);
}
}