如何隐藏RecyclerView项目

时间:2019-04-02 14:55:35

标签: android android-recyclerview invisible

我想隐藏一些RecyclerView项目,如图所示。单击“查看全部”时,布局应展开并且其余项目应可见。

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实例。还会在其中看不见的地方创建空白空间。您认为还有其他更好的技术吗?

3 个答案:

答案 0 :(得分:2)

添加变量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();
    }

答案 1 :(得分:1)

在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;
}

请注意,我是在没有编译器的情况下手工编写的,可能并不完美。

让我知道是否有帮助!

答案 2 :(得分:0)

定义局部变量

var Int count = 8

按照您的代码显示

viewAll方法集count = 12中,并通过监听器刷新适配器以进行活动