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中的常用用法:LiveData
和RxJava
当然我会检查的。谢谢。
【参考方案1】:
创建不带列表作为参数的适配器(只初始化一次适配器)。在适配器中创建一个名为 setAdapterItems 的方法 - 在里面,清除内部列表,添加新列表,然后调用 notifyDataSetChanged。
【讨论】:
谢谢,我按照您提到的方法进行了尝试,并从 myAdapter 的活动中调用了 setAdapterItems,视图生成一次,但没有更新。我尝试通过 new Runnable() 更新列表,但应用程序不断崩溃。以上是关于Android - 如何像每 1 秒一样自动刷新卡片视图的主要内容,如果未能解决你的问题,请参考以下文章