在 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(ArrayListmatchedScoreGroup,int i) 一样的方法,这里 i 是它的来源……主要是我从 runonuithread 端获得的。 对不起,我很愚蠢:你从来没有在你的“groupWiseScoreGenerate()”方法中使用“array”参数。你必须调用“MatchedScoreFragment.getInstance().setMatchedScoreGroup(array);”!!或者用那个“数组”数据填充你的“matchedScoreGroup”变量。 【参考方案1】:

问题是 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 列表中闪烁的主要内容,如果未能解决你的问题,请参考以下文章

Android Recycer 流式布局

在垂直 RecyclerView 中显示水平 RecyclerView 时获得闪烁效果

如何在 RecyclerView 中实现 StartActivityForResult

RecyclerView 在 BottomSheetFragment 中隐藏其下方的项目

RecyclerView 挤压子项宽度

RecyclerView系列:图片闪烁问题