在 Recyclerview 列表中闪烁
Posted
技术标签:
【中文标题】在 Recyclerview 列表中闪烁【英文标题】:Blinking in Recyclerview list 【发布时间】:2018-12-31 15:22:22 【问题描述】:我正在制作记分牌应用程序,它运行良好,但小问题是记分牌在闪烁
举例:
Shikhar Dhawan 86 (126)
罗希特·夏尔马 20(20)
整个列表以毫秒(毫秒)为单位闪烁
这是一个短代码:
public class handleBetTask extends AsyncTask<JSONObject, Void, Void>
@Override
protected Void doInBackground(JSONObject... voids)
try
JSONObject response = voids[0];
JSONArray dataArray = response.getJSONArray("Data");
if (dataArray.length() > 0)
groupWiseScoreGenerate(dataArray);
else
matchedScoreGroup.clear();//Here matchedScoreGroup is ArrayList
现在groupWiseScoreGenerate(dataArray):
private void groupWiseScoreGenerate(JSONArray array)
matchedScoreGroup.clear();
//Here is a data insertion in matchedScoreGroup
runOnUiThread(new Runnable()
@Override
public void run()
MatchedScoreFragment.getInstance().setMatchedScoreGroup(matchedScoreGroup);//where it is bind to recyclerview
在MatchedScoreFragment(片段)中设置分数。
public void setMatchedScoreGroup(ArrayList<Match> matchedScoreGroup)
try
if (matchedScoreGroup.size() > 0)
if (txtEmptyView.isShown())
txtEmptyView.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
this.matchedScoreGroup= matchedScoreGroup;
adapter.notifyDataChanged(this.matchedScoreGroup);
else
mRecyclerView.setVisibility(View.GONE);
txtEmptyView.setVisibility(View.VISIBLE);
catch (Exception e)
e.printStackTrace();
它运行良好,但 每 200 毫秒调用一次,因此在显示分数时会发生闪烁,即 txtEmptyView.setVisibility(View.VISIBLE);调用和记分牌消失了几毫秒
问题可能是因为 runOnUiThread。
感谢您的帮助。
【问题讨论】:
您可以避免在此处使用 runOnUiThread(),因为它是最后一个操作,因此您可以在“onPostExecute()”中移动整个“groupWiseScoreGenerate()”内容并删除 runOnUiThread()。但是我不确定这取决于它。似乎您的“setMatchedScoreGroup(ArrayList)”仅使用“ArrayList.size() > 0”调用,因此“mRecyclerView.setVisibility(View.GONE);”永远不会被执行。我认为问题出在其他地方。你“MatchedScoreFragment.getInstance().setMatchedScoreGroup()”是否只从那里执行? 是的,你是 ryt "ArrayList.size() > 0" 但事情是我已经检查了登录 runonuithread 它完全没问题,但是当它进入 setMatchedScoreGroup(arraylist) 时,有时 arraylist 即将到来 0 多数民众赞成在为什么会闪烁。还有其他方法吗? 我写信给你:你的“setMatchedScoreGroup()”是从其他地方调用的吗?因为从您放在这里的那段代码来看,当参数为零时,该方法无法执行。所以应该有另一个地方用空的 ArrayList 调用该方法... 是的,它是从 3 端调用的,我已经测试过与 setMatchedScoreGroup(ArrayList问题是 doInBackground() 被调用太快并且在 UiThread 可以处理 Runnable 之前清除了“matchedScoreGroup”数组。所以解决方案是:(1)声明“ArrayList doInBackground()”并在此处返回您转换/填充的ArrayList(2)创建“AsyncTask.onPostExecute(ArrayList)”方法并运行您的“MatchedScoreFragment.getInstance() .setMatchedScoreGroup()" 从那里开始
【讨论】:
将代码粘贴到onPostExecute时运行不顺畅。解决方案完成但运行不顺利。 因为图形界面的更新是200ms(你说设置的定时器)+IDE运行命令“onPostExecute()”方法的时间。使用您以前的方式,您只有 200 毫秒。唯一的解决方案是在 Activity(或者你有图形界面的地方)创建一个 Handler,并在前面的“onPostExecute()”中向那个 Handler 发送一个“Handler.sendMessage()”。通过这种方式,您的“onPostExecute()”不会做任何工作,但它在稍后的传递中都需要 UiThread。 我在这个网站的移动版本上,我无法格式化代码,但是:(1)在 MainActivity(或者你有图形界面的地方)你创建一个处理程序:“处理程序 mHandler = new Handler(Looper.getMainLooper())@Override public void handleMessage(Message message)if (message.what == 123) MatchedScoreFragment.getInstance().setMatchedScoreGroup((ArrayList)message.obj);;" (2) 然后在前面的“onPostExecute()”中使用“....mHandler.sendMessage(Message.obtain(...mHandler, 123, 0, 0, yourArrayList)); 向它发送一个“信号” 我认为你应该遵循一些关于线程通信的指南,但是你可以遵循我的一段代码(不同的例子但相同的解决方案):***.com/questions/51458200/… 是的,我必须查看线程通信,但现在只需告诉我在哪里写 MatchedScoreFragment.getInstance().setMatchedScoreGroup(matchedScoreGroup);在 groupwiseScoreGenerate 还是其他?以上是关于在 Recyclerview 列表中闪烁的主要内容,如果未能解决你的问题,请参考以下文章
在垂直 RecyclerView 中显示水平 RecyclerView 时获得闪烁效果
如何在 RecyclerView 中实现 StartActivityForResult