我有一个api,它有一个名为“show_in_list”的字段,设置为true或false。在我的适用于我的回收站视图的适配器中,我已经完成了这个
public class EmoticonAdapter extends RecyclerView.Adapter<EmoticonAdapter.ViewHolder> {
private Context mContext;
private EmoticonResponse mEmoticon;
private Emoticons mEmoticons;
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView mEmoticonButton;
public ViewHolder(View v) {
super(v);
mEmoticonButton = (ImageView) v.findViewById(R.id.emoticonImages);
}
}
public EmoticonAdapter(Context context, EmoticonResponse response) {
mContext = context;
mEmoticon = response;
if (mEmoticon == null) {
mEmoticon = new EmoticonResponse();
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.grid_item_emoticon, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
mEmoticons = mEmoticon.getItem(position);
if (mEmoticons.getEmoticon().getUrl() != null) {
if (mEmoticons.getEmoticon().getShow_in_list().equalsIgnoreCase("true")) {
Picasso.with(mContext)
.load(mEmoticons.getEmoticon().getUrl())
.into(holder.mEmoticonButton);
holder.mEmoticonButton.setVisibility(ImageView.VISIBLE);
holder.mEmoticonButton.setClickable(true);
}
}
}
@Override
public int getItemCount() {
return mEmoticon.getItems().size();
}
}
我的XML对于RecyclerView
中的项目看起来像这样<ImageView
android:id="@+id/emoticonImages"
android:layout_width="40dp"
android:layout_height="40dp"
android:clickable="false"
android:visibility="gone"/>
我遇到的问题是,当我加载视图时,某些项目不可见但导致其他项目之间存在较大间隙,您仍然可以点击它们。
我做错了什么?我正在做一切教科书,但我必须错过一些正确的东西?
编辑已添加全班
答案 0 :(得分:3)
在适配器构造函数中,解析整个表情符号数据集,并仅添加对mEmoticons
可见的那些数据集。因此getItemCount()
会返回您想要显示的项目数,因此只创建了许多持有者。
你的命名非常令人困惑所以我不得不猜测一些事情,解决这些问题并尝试使用此代码:
List<Emoticon> filteredEmoticons; // change the class here to what it is in your project
public EmoticonAdapter(Context context, EmoticonResponse response) {
mContext = context;
mEmoticon = response;
if (mEmoticon == null) {
mEmoticon = new EmoticonResponse();
}
filteredEmoticons = new ArrayList<Emoticon>():
for (Emoticon emoticon : mEmoticon.getItems()) {
if (emoticon.getUrl() != null) {
if (emoticon.getShow_in_list().equalsIgnoreCase("true")) {
filteredEmoticons.add(emoticon);
}
}
}
}
@Override
public int getItemCount() {
return filteredEmoticons.size();
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mEmoticonButton.setVisibility(ImageView.VISIBLE);
holder.mEmoticonButton.setClickable(true);
}
答案 1 :(得分:0)
此处您只隐藏ImageView
,但视图将始终存在并占用一些空间
一个更好的解决方案是之前过滤您的项目。我不知道你如何以及何时设置mEmoticon
,但是如果你删除它的无用项目,它将会很好用。
注意getItemCount()
在没有无用物品的情况下返回好尺寸。