其他分享
首页 > 其他分享> > android – 有没有办法在RecyclerView中使用ViewStub?

android – 有没有办法在RecyclerView中使用ViewStub?

作者:互联网

我是android新手,
我一直在研究一个项目,在我的新闻提要页面中,我正在尝试包含一个模块化的Feed RecyclerView,它显示了一个不同答案形式的问题,根据问题类型进行变换.到目前为止我的方式是使用include并在需要时将表单变为可见.最近,因为我添加了更多模块,应用程序开始逐渐减速,所以我正在尝试实现ViewStubs.

这是我的RecyclerView适配器:

public class ReQuestionAdapter extends RecyclerView.Adapter<FeedItem> {
private ArrayList<Question> myQuestions;
public ReQuestionAdapter(Context context, ArrayList<Question> questions) {
    myQuestions = questions ;
}

@Override
public FeedItem onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_item_re_question, parent, false);
    return new FeedItem(view);
}

@Override
public void onBindViewHolder(FeedItem holder, int position) {
    Question q = myQuestions.get(position);
    holder.bindQuestion(q);
}

@Override
public int getItemViewType(int position) {
    return 0;
}

@Override
public int getItemCount() {
    return myQuestions.size();
}
}

这是适配器的ViewHolder类:

public class FeedItem extends RecyclerView.ViewHolder{
private Question mQuestion;
public TextView tvName;
public TextView tvTime;
public TextView tvContent;
public ProfilePictureView profilePictureView;
public ViewStub moduleView;
private int moduleType;

public FeedItem(View itemView) {
    super(itemView);

}

public void bindQuestion(Question question) {
    mQuestion = question;
    tvTime = (TextView) itemView.findViewById(R.id.li_q_date);
    tvContent = (TextView) itemView.findViewById(R.id.li_q_content);
    moduleView = (ViewStub) itemView.findViewById(R.id.module_viewstub);
    tvTime.setText(TimeHandler.When(mQuestion.publish_time));
    tvContent.setText(mQuestion.content);
    moduleType = question.type;
        switch (moduleType) {
            case Question.TYPE_YN:
                moduleView.setLayoutResource(R.layout.module_yes_no);
                moduleView.inflate();
                break;
            case Question.TYPE_CUSTOM:
                moduleView.setLayoutResource(R.layout.module_custom);
                moduleView.inflate();
                break;
            default:
                break;
        }
    }
}

现在,问题在于包含某个布局的ViewStub不能用新的布局重新填充,原因是它一离开屏幕就会从视图中移除,症状如下:
向下滚动RecyclerView时,填充屏幕的第一个列表项目工作正常,但是当前一个离开屏幕时加载其他列表会导致FeedItem绑定带来NullPointerException. (它无法在列表项布局中找到它).

我正在寻找一种像ViewStubs一样高效的解决方案,或者让它们正常工作的方法,因为我有很多模块并且在每个项目中将它们全部膨胀,因为隐形会使我的应用变慢.

解决方法:

在bindQuestion()方法中,您引用两个不同的布局来膨胀,因此实际上您有两种不同的视图类型.

适配器视图有一种有效的方式来处理这个内置的权利.

首先重写getItemViewType().当位置处的项目获得module_yes_no布局时,返回0.当它获得module_custom布局时,返回1.

然后在onCreateViewHolder()中,当viewType参数为0时,使用module_yes_no布局扩展list_item_re_question视图.当viewType == 1时,膨胀视图的module_custom版本.

现在当你在onBindViewHolder()中获得一个视图时,它已经有了正确的子视图,所以你继续根据需要填写该视图.通过使用getItemViewType(),RecyclerView正在与您一起回收您需要的确切视图.

你甚至可以有两个FeedItem子类,一个用于module_yes_no,一个用于module_custom,因此在onBindViewHolder()中,你只需检查ViewHolder的类并进行相应的分支.

这应该有助于提高应用程序的性能.

标签:android,data-binding,android-recyclerview,android-viewholder,viewstub
来源: https://codeday.me/bug/20190623/1273144.html