【问题标题】:Android - How to refresh cardview automatically like every 1 secondAndroid - 如何像每 1 秒一样自动刷新卡片视图
【发布时间】: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
  • 当然我会检查的。谢谢。

标签: android android-recyclerview android-cardview cardview


【解决方案1】:

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

【讨论】:

  • 谢谢,我按照您提到的方法进行了尝试,并从 myAdapter 的活动中调用了 setAdapterItems,视图生成一次,但没有更新。我尝试通过 new Runnable() 更新列表,但应用程序不断崩溃。
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2016-01-23
  • 1970-01-01
  • 2022-11-26
  • 2013-08-21
相关资源
最近更新 更多