Android - 如何像每 1 秒一样自动刷新卡片视图

Posted

技术标签:

【中文标题】Android - 如何像每 1 秒一样自动刷新卡片视图【英文标题】:Android - How to refresh cardview automatically like every 1 second 【发布时间】:2021-02-25 14:44:13 【问题描述】:

我有一个带有 cardview 的 recyclerview,它是根据作为输入给 RecyclerViewAdpater 的 ArrayList 动态生成的,我从 Shared Preferences 中获取(我在前面的代码中保存了它)。我有 run() 方法来不断更新和保存共享首选项中的 ArrayList。 现在,我想根据共享首选项中更新的 ArrayList 自动刷新卡片视图。我尝试在将列表传递给 RecyclerViewAdapter 时调用 runOnUiThread,但应用程序不断崩溃。也不确定如何实现 notifydatasetchanged 以进行持续更新,因为我知道单击 cardView 时可以完成。 因为这是我第一次使用 cardview,因为我必须显示 imageView 和几个 textView,不确定是否可以使用任何其他视图。那么这是可行的还是有任何其他有效的方法可以使用本机代码来实现呢?

public class TestCode extends AppCompatActivity 


    List<BtnHandle> BtnHndl ;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        final Context myCt = this;


        BtnHndl = new ArrayList<>();

        SharedPreferences prefs = getSharedPreferences("sharedpref", MODE_PRIVATE);
        String BtnData = prefs.getString("btndata", "No name defined");
        JSONObject obj = null;
        JSONArray jsonArray = null;

        try 
            obj = new JSONObject(BtnData);
            jsonArray = obj.getJSONArray("response");
         catch (JSONException e) 
            e.printStackTrace();
        



        for (int i = 0; i < jsonArray.length(); i++) 
            try 
                JSONObject value = jsonArray.getJSONObject(i);
                String value1 = value.getString("val1");
                String value2 = value.getString("val2");
                String value3 = value.getString("val3");

                BtnHn.add(new BtnHandle(value1,value2,value3));
             catch (JSONException e) 
                e.printStackTrace();
            

        

                        RecyclerView rv = (RecyclerView) findViewById(R.id.recyclerview_id);
                        RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(myCt,BtnHndl);
                        rv.setLayoutManager(new GridLayoutManager(myCt,3));
                        rv.setAdapter(myAdapter);

    





public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> 

    private Context mContext ;
    private List<BtnHandle> mData ;
    Listenr mListn;


    public static interface Listenr
        public void onClick(int postn);
    

    public void setListener(Listenr listener)
        mListn = listener;
    

    public RecyclerViewAdapter(Context mContext, List<BtnHandle> mData) 
        this.mContext = mContext;
        this.mData = mData;
    

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 

        View view ;
        LayoutInflater mInflater = LayoutInflater.from(mContext);
        view = mInflater.inflate(R.layout.cardview,parent,false);
        return new MyViewHolder(view);
    

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) 

        holder.value1.setText(mData.get(position).getValue1());
        holder.value2.setText(mData.get(position).getValue2());
        holder.value3.setText(mData.get(position).getValue3());

        holder.cardView.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 

                
        );

    

    @Override
    public int getItemCount() 
        return mData.size();
    

    public static class MyViewHolder extends RecyclerView.ViewHolder 

        TextView value1;
        TextView value2;
        TextView value3;

        CardView cardView ;

        public MyViewHolder(View itemView) 
            super(itemView);

            value1 = (TextView) itemView.findViewById(R.id.value1) ;
            value2  = (TextView) itemView.findViewById(R.id.value2) ;
            value3  = (TextView) itemView.findViewById(R.id.value3) ;

        
    


【问题讨论】:

我推荐你googleobserver pattern以及它在android中的常用用法:LiveDataRxJava 当然我会检查的。谢谢。 【参考方案1】:

创建不带列表作为参数的适配器(只初始化一次适配器)。在适配器中创建一个名为 setAdapterItems 的方法 - 在里面,清除内部列表,添加新列表,然后调用 notifyDataSetChanged。

【讨论】:

谢谢,我按照您提到的方法进行了尝试,并从 myAdapter 的活动中调用了 setAdapterItems,视图生成一次,但没有更新。我尝试通过 new Runnable() 更新列表,但应用程序不断崩溃。

以上是关于Android - 如何像每 1 秒一样自动刷新卡片视图的主要内容,如果未能解决你的问题,请参考以下文章

如何使LayUI的Tab选项卡标签在切换时,自动刷新

如何使用laravel每隔x秒自动刷新div

如何能让浏览的网页每间隔几秒刷新一次

我的笔记本电脑也是升级成win10后,桌面、任务栏每隔几十秒就自动刷新一下。请问你是怎么解决的。谢谢

在选项卡中的列表视图中刷新活动 (Android)

如何让框架网页有自动刷新功能?