RecyclerView 中的 Android 调色板
Posted
技术标签:
【中文标题】RecyclerView 中的 Android 调色板【英文标题】:Android Palette in RecyclerView 【发布时间】:2014-09-18 14:44:33 【问题描述】:我打算从我的RecyclerView
中的每个bitmap
中获取每种鲜艳的颜色,并将其设置为我的文本的背景。所以我尝试了following
:
Picasso.with(ctx)
.load(curs.getString(curs
.getColumnIndex(TimelineDatabase.KEY_IMAGE)))
.into(holder.ivUserPost, new Callback()
@Override
public void onSuccess()
try
Bitmap bitmap = ((BitmapDrawable) holder.ivUserPost
.getDrawable()).getBitmap();
Palette palette = Palette.generate(bitmap);
Toast.makeText(ctx,
palette.getVibrantColor().getRgb(),
Toast.LENGTH_LONG).show();
catch (Exception e)
e.printStackTrace();
但是,没有显示 toast,我不断收到带有following
logcat 的 null pointer exception
:
07-27 07:13:34.163: W/System.err(4900): java.lang.NullPointerException: Attempt to invoke virtual method 'int android.support.v7.graphics.PaletteItem.getRgb()' on a null object reference
07-27 07:13:34.163: W/System.err(4900): at com.joy.timeline.Fetch$TimelineFetchAdapter$2.onSuccess(Fetch.java:354)
07-27 07:13:34.163: W/System.err(4900): at com.squareup.picasso.RequestCreator.into(RequestCreator.java:514)
07-27 07:13:34.163: W/System.err(4900): at com.joy.timeline.Fetch$TimelineFetchAdapter.onBindViewHolder(Fetch.java:344)
07-27 07:13:34.163: W/System.err(4900): at com.joy.timeline.Fetch$TimelineFetchAdapter.onBindViewHolder(Fetch.java:1)
07-27 07:13:34.163: W/System.err(4900): at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:2925)
07-27 07:13:34.163: W/System.err(4900): at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:2527)
07-27 07:13:34.163: W/System.err(4900): at android.support.v7.widget.LinearLayoutManager$RenderState.next(LinearLayoutManager.java:1425)
07-27 07:13:34.163: W/System.err(4900): at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:999)
07-27 07:13:34.163: W/System.err(4900): at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:524)
07-27 07:13:34.163: W/System.err(4900): at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1461)
07-27 07:13:34.164: W/System.err(4900): at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:1600)
07-27 07:13:34.164: W/System.err(4900): at android.view.View.layout(View.java:15273)
07-27 07:13:34.164: W/System.err(4900): at android.view.ViewGroup.layout(ViewGroup.java:4763)
07-27 07:13:34.164: W/System.err(4900): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1069)
【问题讨论】:
如果Palette
找不到符合if (palette != null) palette.getVibrantColor().getRgb();
标准的颜色,就像克里斯·班斯所说的chris.banes.me/2014/07/04/palette-preview 一样,您应该检查NPE
签出这个例子code2concept.blogspot.in/2015/10/…
【参考方案1】:
显然,Palette 在您的位图中找不到鲜艳的颜色。这就是为什么有一个 NPE。您可以尝试让调色板生成更多颜色 - Palette p = Palette.generate(bitmap, 24);
。但也不能保证它会找到鲜艳的颜色。
很遗憾,目前还没有官方的Palette
文档。您可以参考this article了解更多信息
【讨论】:
以上是关于RecyclerView 中的 Android 调色板的主要内容,如果未能解决你的问题,请参考以下文章
Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)
Recyclerview在Android中notifyItemChanged后防止触摸事件
Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件
Android:RecyclerView 不显示片段中的列表项