如何隐藏 RecyclerView 项目
How to hide RecyclerView items
我想隐藏一些 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 实例。并且还在项目不可见的地方创建了空白空间。还有其他你认为更好的技巧吗?
定义局部变量
var Int count = 8
显示,如您的代码
在 viewAll
方法中设置 count = 12
,并通过 activity
的侦听器刷新适配器
添加变量 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);
}
}
并在查看全部点击更改maxCount
;
public void viewAll() {
maxCount = 12;
notifyDataSetChanged();
}
AFAIK Android 你不能 hide/show recycleView 中的项目(以优化的方式)而不更改项目源列表。 (我的意思是在列表的特定位置、开始、中间或结尾动态 remove/add 项)
也就是说,更改数据源和刷新带有少量项目的列表非常容易,可以通过简单的 notifyDataSetChanged
完成
在 Activity/Fragment
上用 class-scoped
变量实例化您的列表。我在 Activity
中写了示例,因为我不知道您使用的是 Activity
还是 Fragment
。 Obv 它与 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;
}
注意,这是我在没有编译器的情况下手写的,它可能并不完美。
如果有帮助请告诉我!
我想隐藏一些 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 实例。并且还在项目不可见的地方创建了空白空间。还有其他你认为更好的技巧吗?
定义局部变量
var Int count = 8
显示,如您的代码
在 viewAll
方法中设置 count = 12
,并通过 activity
添加变量 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);
}
}
并在查看全部点击更改maxCount
;
public void viewAll() {
maxCount = 12;
notifyDataSetChanged();
}
AFAIK Android 你不能 hide/show recycleView 中的项目(以优化的方式)而不更改项目源列表。 (我的意思是在列表的特定位置、开始、中间或结尾动态 remove/add 项)
也就是说,更改数据源和刷新带有少量项目的列表非常容易,可以通过简单的 notifyDataSetChanged
完成在 Activity/Fragment
上用 class-scoped
变量实例化您的列表。我在 Activity
中写了示例,因为我不知道您使用的是 Activity
还是 Fragment
。 Obv 它与 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;
}
注意,这是我在没有编译器的情况下手写的,它可能并不完美。
如果有帮助请告诉我!