RecyclerView不隐藏某些项目

时间:2016-03-11 10:33:17

标签: android imageview android-recyclerview recycler-adapter

我有一个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"/>

我遇到的问题是,当我加载视图时,某些项目不可见但导致其他项目之间存在较大间隙,您仍然可以点击它们。

enter image description here

我做错了什么?我正在做一切教科书,但我必须错过一些正确的东西?

编辑已添加全班

2 个答案:

答案 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()在没有无用物品的情况下返回好尺寸。