在 Android 的回收器视图中有 20 个视图要膨胀加上一个页脚视图,但回收商视图正在膨胀 19 个视图加上页脚视图



ArrayList 包含 20 个项目,我想以 20 个视图显示从 arraylist 到回收器视图的内容,此外我还想添加一个页脚视图。但是我得到了 19 个视图和页脚。下面是回收程序视图的适配器类的代码。如果我正在增加getItemCount的大小,我将在BindViewHolder Method中得到indexoutofBound异常。请解决。

Result movie;
UrlConstants urlConstants = UrlConstants.getSingletonRef();
private ArrayList<Result> moviesList = new ArrayList<>();
private Context context;
private final int VIEW_ITEM = 0;
private final int VIEW_PROG = 1;
Fragment fragment;
public MoviesAdapter(ArrayList<Result> moviesList,Fragment fragment) {
this.moviesList = moviesList;
this.fragment = fragment;
}

public class MyViewHolder extends RecyclerView.ViewHolder {
public ImageView backdrop_image;
public TextView title, date;
public MyViewHolder(View view) {
super(view);
backdrop_image = (ImageView)view.findViewById(R.id.backdrop_image);
title = (TextView) view.findViewById(R.id.title);
date = (TextView) view.findViewById(R.id.date);
}
}
public class FooterViewHolder extends RecyclerView.ViewHolder
{
public TextView tag_text,previous_page,next_page,between_text;
public FooterViewHolder(View itemView) {
super(itemView);
between_text = (TextView) itemView.findViewById(R.id.between_text);
tag_text = (TextView)itemView.findViewById(R.id.tag_text);
previous_page = (TextView)itemView.findViewById(R.id.previous_page);
next_page = (TextView) itemView.findViewById(R.id.next_page);
}
}
@Override
public int getItemViewType(int position) {
if (isPositionItem(position))
return VIEW_ITEM;
return VIEW_PROG;
}
private boolean isPositionItem(int position) {
return position != getItemCount() -1;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
if (viewType == VIEW_ITEM) {
View v =  LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_row, parent, false);
return new MyViewHolder(v);
} else if (viewType == VIEW_PROG){
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.footer_layout, parent, false);
return new FooterViewHolder(v);
}
return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

if (holder instanceof MyViewHolder)
{
movie = moviesList.get(position);
((MyViewHolder)holder).title.setText(movie.getTitle());
((MyViewHolder)holder).date.setText(movie.getReleaseDate());
String url = urlConstants.URL_Image + movie.getBackdropPath();
Picasso.with(context)
.load(url)
.into(((MyViewHolder)holder).backdrop_image);
}
else if (holder instanceof FooterViewHolder)
{
movie = moviesList.get(position);

((FooterViewHolder)holder).tag_text.setText("Viewing " + movie.getPage() + " of " + movie.getTotal_pages() + " Pages" );
((FooterViewHolder)holder).previous_page.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
((MoviesMainFragment)fragment).prepareOnlineData(movie.getPage() - 1);
}
});
((FooterViewHolder)holder).next_page.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MoviesMainFragment)fragment).prepareOnlineData(movie.getPage() + 1);
}
});
}
}
@Override
public int getItemCount()
{
return this.moviesList.size();
}

您必须将移动器大小增加 1。为此,您必须在列表的最后一项中插入虚拟数据,以便最后一项没有空数据,并且您不会获得 Indexoutofbound。

无需增加大小getItemCount,您已经在列表中添加了虚拟项目。

问题

这条线

return position != getItemCount() -1;

您有 20 个项目,即 item0..项目19.以上将仅检查 19 个项目,即最多项目18。当回收器视图到达最后一个位置时,根据条件,它将膨胀页脚视图,从而忽略最后一项。

溶液

下面的代码对我有用。

更改您的isPositionItem()方法,如下所示

private boolean isPositionItem(int position) {
return position == moviesList.size();
}

更改getItemCount()如下所示

@Override
public int getItemCount()
{
return this.moviesList.size()+1;
}

最新更新