我是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一样高效的解决方案,或者让它们正常工作的方法,因为我有很多模块并且在每个项目中都充实它们,因为不可见会使我的应用变慢
答案 0 :(得分:4)
在bindQuestion()
方法中,您引用了两种不同的布局来膨胀,因此实际上您有两种不同的视图类型。
适配器视图有一种有效的方法来处理这个内置的权利。
首先覆盖getItemViewType()
。当position
处的项目获得module_yes_no
布局时,返回0.当它获得module_custom
布局时,返回1.
然后在onCreateViewHolder()
中,当viewType
参数为0时,使用list_item_re_question
布局填充module_yes_no
视图。当viewType
== 1时,请展开视图的module_custom
版本。
现在,当您在onBindViewHolder()
中获得视图时,已经拥有正确的子视图,因此您可以根据需要继续填写该视图。使用getItemViewType()
,RecyclerView
正在与您合作,以回收您需要的确切视图。
您甚至可以有两个FeedItem
子类,一个用于module_yes_no
,另一个用于module_custom
,因此在onBindViewHolder()
中,您只需检查ViewHolder
的类并相应地分支。
这应该有助于提高应用的效果。