Android开发 RecyclerView的GridLayoutManager入门了解
<h1><span style="color: rgba(0, 128, 128, 1)">版权声明</span></h1><p>本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/13037271.html</p>
<div>本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。</div>
<h1><span style="color: rgba(0, 128, 128, 1)">前言</span></h1>
<p> GridLayoutManager网格布局管理,支持RecyclerView成为网格布局的关键。可能很多人在了解网格布局列表会联想到<span style="color: rgba(0, 0, 0, 1)">GridView。简单网格布局的情况下推荐使用<span style="color: rgba(0, 0, 128, 1)"><span style="color: rgba(0, 0, 0, 1)">GridView</span>,</span>因为更为简单。但是在复杂布局的情况下就更推荐使用RecyclerView来实现网格布局。因为<span style="color: rgba(0, 0, 0, 1)">RecyclerView</span>功能更加强大且灵活。</span></p>
<p> </p>
<h1><span style="color: rgba(0, 128, 128, 1)">简单使用GridLayoutManager</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)"> RecyclerView的其他代码就不展示了,这些代码在我的博客里有很多,这里说明我们关注的GridLayoutManager部分代码。如下将GridLayoutManager设置到<span style="color: rgba(0, 0, 0, 1)">RecyclerView,实现一个4列的网格列表。</span></span></p>
<div class="cnblogs_code">
<pre> GridLayoutManager layoutManager = <span style="color: rgba(0, 0, 255, 1)">new</span> GridLayoutManager(<span style="color: rgba(0, 0, 255, 1)">this</span>, 4);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第二个参数为网格的列数</span>
mRecyclerView.setLayoutManager(layoutManager);</pre>
</div>
<p><strong>注意!</strong>如果你发现你的item填不满一行或者一行的左右两边还有很多空间,其实是你的item的布局宽度不是<span style="color: rgba(0, 0, 0, 1); font-weight: bold">match_parent</span>导致的 </p>
<p>效果图:</p>
<p><img src="https://img2020.cnblogs.com/blog/1497956/202006/1497956-20200603141455315-694953528.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">改变指定位置item的列尺寸</span></h1>
<p> 假设现在有需求,希望第1个item,单独占据一行的全部空间。我们可以使用setSpanSizeLookup方法实现这一需求:</p>
<p>代码:</p>
<div class="cnblogs_code">
<pre> GridLayoutManager layoutManager = <span style="color: rgba(0, 0, 255, 1)">new</span> GridLayoutManager(<span style="color: rgba(0, 0, 255, 1)">this</span>, 4);
<span style="color: rgba(0, 0, 0, 1)"> mRecyclerView.setLayoutManager(layoutManager);
layoutManager.setSpanSizeLookup(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> GridLayoutManager.SpanSizeLookup() {
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> getSpanSize(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> position) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (position == 0<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> 4<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> 1<span style="color: rgba(0, 0, 0, 1)">;
}
});</span></pre>
</div>
<p> 使用返回的<span style="color: rgba(0, 0, 0, 1)">position来判断指定位置的item,然后返回占据的列数。<strong><span style="color: rgba(255, 0, 0, 1)">请注意!</span>这里一开始特别容易错误理解,</strong>这里的返回值其实是表达我们希望这个item占据多少位置。在上面实例GridLayoutManager第二个参数我们写了4,就代表最多的列数只有4列,如果我们希望指定item占据整行就要返回 4 , 然后剩下的其他item只占据1位。另外这里不能返回大于我们实例设置的列数,如果我这里返回5,就会出现报错。</span></p>
<p>效果图:</p>
<p><img src="https://img2020.cnblogs.com/blog/1497956/202006/1497956-20200603142948186-653644805.png" alt=""></p>
<h3>在举一个例子帮助理解,我们希望第一个item只占据2列,最后一个item占满一行全部列数,代码如下:</h3>
<div class="cnblogs_code">
<pre> GridLayoutManager layoutManager = <span style="color: rgba(0, 0, 255, 1)">new</span> GridLayoutManager(<span style="color: rgba(0, 0, 255, 1)">this</span>, 4);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">第二个参数为网格的列数</span>
<span style="color: rgba(0, 0, 0, 1)"> mRecyclerView.setLayoutManager(layoutManager);
layoutManager.setSpanSizeLookup(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> GridLayoutManager.SpanSizeLookup() {
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> getSpanSize(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> position) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (position == 0<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> 2<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (position == mRecyclerView.getAdapter().getItemCount() - 1<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> 4<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> 1<span style="color: rgba(0, 0, 0, 1)">;
}
});</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)">请注意,这里别使用<span style="font-weight: bold">mRecyclerView.getChildCount()</span>来获取item的数量,在getSpanSize方法调用时,RecyclerView其实还在onMeasure,获取的item数量还在增值。</span></p>
<p> </p>
<p>效果图 :</p>
<p><img src="https://img2020.cnblogs.com/blog/1497956/202006/1497956-20200603144926941-467560132.png" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">随时修改列数</span></h1>
<p>代码:</p>
<div class="cnblogs_code">
<pre> mGridLayoutManager = <span style="color: rgba(0, 0, 255, 1)">new</span> GridLayoutManager(<span style="color: rgba(0, 0, 255, 1)">this</span>, count);
<span style="color: rgba(0, 0, 0, 1)"> mRecyclerView.setLayoutManager(mGridLayoutManager);
mRecyclerView.setAdapter(mRecyclerViewAdapter);
mAddCountBtn.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
mGridLayoutManager.setSpanCount(</span>++<span style="color: rgba(0, 0, 0, 1)">count);
}
});</span></pre>
</div>
<p>效果图:</p>
<p><img src="https://img2020.cnblogs.com/blog/1497956/202006/1497956-20200603151720980-329147989.gif" alt=""></p>
<h1><span style="color: rgba(0, 128, 128, 1)">禁止滚动</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)">有时候我们会需要某个方向没有滚动功能</span></p>
<div class="cnblogs_code">
<pre>textList.setLayoutManager(<span style="color: rgba(0, 0, 255, 1)">new</span> GridLayoutManager(context, <span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">){
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> boolean canScrollHorizontally() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">禁止水平滚动</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> boolean canScrollVertically() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">禁止垂直滚动</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}
});</span></pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<p>End</p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<div style="text-align: center">
<p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/13037271.html </p>
<div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/13037271.html
頁:
[1]