我想隐藏一些RecyclerView项目,如图所示。单击查看全部时,布局应该展开,其余项应该可见。
RecyclerView共有12个项目。应该隐藏一行。
我尝试的是让项目在开始时不可见,并在通过调用方法单击view all
时将它们设置为可见。
在适配器中我尝试了这个
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int i) {
if(i >= 8)
{
holder.productName.setVisibility(View.INVISIBLE);
holder.product_image.setVisibility(View.INVISIBLE);
}
}
public void viewAll() {
//unable to create holder object here
if(holder.productName.getVisibility() == View.INVISIBLE)
{
holder.productName.setVisibility(View.INVISIBLE);
holder.product_image.setVisibility(View.INVISIBLE);
}
}
但我无法在view all
方法中创建ViewHolder实例。而且还会在物品不可见的地方创建空白空间。您认为哪种技术更好?
添加变量int maxCount = 8
并将代码更改为:
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int i) {
if (i >= maxCount) {
holder.productName.setVisibility(View.GONE);
holder.product_image.setVisibility(View.GONE);
}
}
并在View All上点击更改maxCount
;
public void viewAll() {
maxCount = 12;
notifyDataSetChanged();
}
Android上的AFAIK无法在不更改项目源列表的情况下隐藏/显示recycleView中的项目(以优化的方式)。 (我的意思是动态删除/添加列表中特定位置,开头,中间或末尾的项目)
也就是说,使用少量项目更改dataSource和刷新列表非常简单,可以使用简单的notifyDataSetChanged完成
在Activity/Fragment
上用class-scoped
变量实例化你的列表。我在Activity
写的例子,因为我不知道你是否使用Activity
或Fragment
。对于fragment
,它将是相同的。
public class MyActivity extends AppCompatActivity {
private ArrayList<MyItem> myItems; //or List<MyItem> or whatever
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
//init everything
myItems = getVisibleItems(); //create a method that returns the visible items, based on your logics. You can also avoid creating a method and simply retrieve items; as you prefer.
myAdapter = new MyAdapter(MyActivity.this, myItems);
myRecyclerView.setLayoutManager(new LinearLayoutManager(MyActivity.this));
myRecyclerView.setAdapter(myAdapter);
}
//other stuffs
}
然后,每当您想要更改列表项时,只需更新您的ArrayList
(或列表,或其他)并通知适配器更改了某些内容。
private void updateList(){
myItems = getVisibleItems();
myAdapter.notifyDataSetChanged();
}
注意:您不必复制适配器中的列表,使用与传递时相同的内容,即:
ArrayList<MyItems> adapterSource = null;
//constructor
public MyAdapter(Context ctx, ArrayList<MyItems> items){
//other stuff
this.adapterSource = items;
}
注意,我是在没有编译器的情况下手工编写的,它可能并不完美。
如果有帮助,请告诉我!
定义局部变量
var Int count = 8
显示,如代码中所示
在viewAll
方法中设置count = 12
,并通过监听器刷新适配器的活动