您好我想跳过recyclerview
的一些内容。
以下是代码
item_Data.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_marginTop="10dp"
android:id="@+id/mainlayout"
android:layout_height="wrap_content">
<ImageView
android:visibility="gone"
android:id="@id/image"
android:layout_gravity="center"
android:layout_width="100dp"
android:layout_height="100dp" />
<TextView
android:visibility="gone"
android:textStyle="bold"
android:id="@id/title"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:maxLength="15" />
回收者视图是
@Override
public void onBindViewHolder(final MovieViewHolder holder, final int position) {
String download= news.get((position)).getDownloadLinkForApkNew();
String desc_new = news.get(position).getApkJData();
if (download.isEmpty()==false && desc_new.isEmpty()==false) {
holder.movieTitle.setVisibility(View.VISIBLE);
holder.imageView.setVisibility(View.VISIBLE);
Picasso.with(context).load(news.get((position)).getBetterFeaturedImage().getSourceUrl()).into(holder.imageView);
holder.movieTitle.setText(news.get(position).getTitle().getRendered());
}
我不想要没有下载和desc_new的项目。我的逻辑工作项目不可见,但他们留下了空间。如何删除项目之间的空格。
答案 0 :(得分:3)
有一个非常简单的解决方法:
如果在将视图绑定到ViewHolder时在视图上执行view.setVisibility(View.GONE);
,则该视图将被隐藏,但该视图原应位于该位置; 因此,这种方法效率不高。
您需要做的就是将要隐藏的视图的高度和/或宽度设置为零。这是实现此目的的简单方法:
查看持有人:
public class MyViewHolder extends RecyclerView.ViewHolder{
public LinearLayout.LayoutParams params;
public LinearLayout rootView //the outermost view from your layout. Note that it doesn't necessarily have to be a LinearLayout.
//todo: Don't forget to add your other views
public MyViewHolder(View itemView){
super(itemView);
params = new LinearLayout.LayoutParams(0, 0);
rootView = itemView.findViewById(R.id.rootView);
//todo: Don't forget to initialize your views
}
}
onBindViewHolder:
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position){
if(your_condition){
holder.rootView.setLayoutParams(holder.params);
//this line hides the view completely
}
else{
//todo: Do your regular stuff
}
}
我希望这会有所帮助。快活的编码!
答案 1 :(得分:2)
让我们深入了解回收者的观点如何运作
我们在onCreateView和onBindview上有2个函数。由于函数的名称非常自我解释onCreateView创建视图,onBindView获取创建的视图并将数据绑定到其中
现在假设整个视图类型相似,并使用对象或光标数组来填充整个视图。
所以在bindView中为了获取数据,你必须使用
cursor.moveToPosition(position)
或
mList.get(position)
正如您所看到的那样,绑定是基于我们从onBindView参数
获得的位置而发生的@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//mList.get(position) or cursor.moveToPosition
}
因此您可以使用此知识专门跳过视图绑定
假设你有一个函数接受postion作为参数并返回实际位置作为结果
private int getActualPostion(int position){
//your logic to skip the given postion
//say if(position == 4){return postion+2}
}
所以你可以实现类似这样的东西
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
mList.get(getActualPosition(position));
}
这将允许您跳过那些不显示的视图
最后在方法getCount中,由recycleler视图用来决定视图的数量
@Override
public int getItemCount() {
//foreach in array { if(already downloaded) i++}
// return array.size - i
}
我希望这会有所帮助 这也将为您提供更多灵活性,使您可以添加更多过滤器并使用相同的数据集...更轻松地跳过视图
答案 2 :(得分:1)
您可以从arraylist中删除项目,然后通过这种方式将更新的数组列表传递给适配器,这样您就不需要看到您的视图的可见性
答案 3 :(得分:0)
通过制作View.INVISIBLE
,您不会删除保留的空格。相反,您可以使用View.GONE
使它们不可见,并允许保留空间。
由于您再次设置Views
可见,您必须使用if-else子句撤消它,例如。
if (!download.isEmpty() && !desc_new.isEmpty()) {
// make visible
} else {
// make invisible with gone e.g.
holder.movieTitle.setVisibility(View.GONE);
holder.imageView.setVisibility(View.GONE);
}
答案 4 :(得分:0)
if (download.isEmpty()==true && desc_new.isEmpty()==true) {
//Hide the items
holder.movieTitle.setVisibility(View.GONE);
holder.imageView.setVisibility(View.GONE);
}else {
holder.movieTitle.setVisibility(View.VISIBLE);
holder.imageView.setVisibility(View.VISIBLE);
Picasso.with(context).load(news.get((position)).getBetterFeaturedImage().getSourceUrl()).into(holder.imageView);
holder.movieTitle.setText(news.get(position).getTitle().getRendered())
}
答案 5 :(得分:0)
您需要设置持有者的可见性,而不是您的观点。
if (download.isEmpty()==true && desc_new.isEmpty()==true) {
holder.setVisibility(View.GONE);
}else {
holder.setVisibility(View.VISIBLE);
Picasso.with(context).load(news.get((position)).getBetterFeaturedImage().getSourceUrl()).into(holder.imageView);
holder.movieTitle.setText(news.get(position).getTitle().getRendered())
}
还会删除xml的可见性
答案 6 :(得分:0)
你应该使用 View.GONE 而不是 View.INVISIBLE
<强> INVISIBLE 强>
此视图不可见,但仍会占用布局空间。
<强> GONE 强>
此视图不可见,并且不需要任何空间用于布局。
if (download.isEmpty()==true && desc_new.isEmpty()==true) {
holder.movieTitle.setVisibility(View.GONE);
holder.imageView.setVisibility(View.GONE);
}else {
holder.movieTitle.setVisibility(View.VISIBLE);
holder.imageView.setVisibility(View.VISIBLE);
Picasso.with(context).load(news.get((position)).getBetterFeaturedImage().getSourceUrl()).into(holder.imageView);
holder.movieTitle.setText(news.get(position).getTitle().getRendered())
}