Android — Как обновлять cardview автоматически, как каждые 1 секунду

#android #android-recyclerview #android-cardview #cardview

#Android #android-recyclerview #android-cardview #cardview

Вопрос:

У меня есть recyclerview с cardview, который динамически генерируется на основе ArrayList, заданного в качестве входных данных для RecyclerViewAdpater, который я извлекаю из общих настроек (которые я сохранил ранее в коде). У меня есть метод run() для непрерывного обновления и сохранения ArrayList в общих настройках. Теперь я хотел бы автоматически обновлять cardview на основе обновленного ArrayList в общих настройках. Я попытался вызвать runOnUiThread при передаче списка в RecyclerViewAdapter, но приложение продолжает сбой. Также не уверен, как я могу реализовать notifydatasetchanged для непрерывного обновления, поскольку я знаю, что это можно сделать при нажатии на CardView. Поскольку я впервые работаю над cardview, поскольку мне нужно показать ImageView и пару TextViews, не уверен, возможно ли это с любыми другими представлениями. Так возможно ли это или есть какой-либо другой эффективный способ добиться этого с помощью собственного кода?

 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) ;

        }
    }

}
  

Комментарии:

1. Я рекомендую вам Google observer pattern и то, как он обычно используется в Android: LiveData и RxJava

2. Конечно, я проверю. Спасибо.

Ответ №1:

Создайте адаптер без списка в качестве аргумента (инициализируйте адаптер только один раз). Создайте в адаптере метод с именем setAdapterItems — inside, очистите внутренний список, добавьте новый список и вызовите notifyDataSetChanged .

Комментарии:

1. Спасибо, я попробовал, как вы упомянули, и вызвал setAdapterItems из activity для MyAdapter, представление генерируется один раз, но оно не обновляется. Я попытался обновить список с помощью new Runnable (), но приложение продолжает сбой.