How to handle multiple countdown timers in ListView?

后端 未结 4 1939
挽巷
挽巷 2020-11-27 06:02

I have a listview (with a custom list adapter), I need to display a countdown on every row.

For example, if my list contains 4 items, I will have 4 rows. At this po

4条回答
  •  我在风中等你
    2020-11-27 06:52

    It might be late but this is recyclerView version using php and json based on excellent answer of @Eldhose M Babu. Hope to be helpful :)

    Adapter.java

        public class Adapter extends RecyclerView.Adapter {
    
        private Context context;
        private final List lstHolders;
        public List lst;
    
        private Handler mHandler = new Handler();
        private Runnable updateRemainingTimeRunnable = new Runnable() {
            @Override
            public void run() {
                synchronized (lstHolders) {
                    long currentTime = System.currentTimeMillis();
                    for (ViewHolder holder : lstHolders) {
                        holder.updateTimeRemaining(currentTime);
                    }
                }
            }
        };
    
        public Adapter(List lst, Context context){
            super();
            this.lst = lst;
            this.context = context;
            lstHolders = new ArrayList<>();
            startUpdateTimer();
        }
    
        private void startUpdateTimer() {
            Timer tmr = new Timer();
            tmr.schedule(new TimerTask() {
                @Override
                public void run() {
                    mHandler.post(updateRemainingTimeRunnable);
                }
            }, 1000, 1000);
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list, parent, false);
            ViewHolder viewHolder = new ViewHolder(v);
            return viewHolder;
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.setData(lst.get(position));
            synchronized (lstHolders) {
                lstHolders.add(holder);
            }
            holder.updateTimeRemaining(System.currentTimeMillis());
        }
    
        @Override
        public int getItemCount() {
            return lst.size();
        }
    
        class ViewHolder extends RecyclerView.ViewHolder{
            public TextView textViewName;
            public TextView tvTimeRemaining;
            Model mModel;
    
            public void setData(Model item) {
                mModel = item;
                textViewName.setText(item.name);
                updateTimeRemaining(System.currentTimeMillis());
            }
    
            public void updateTimeRemaining(long currentTime) {
                long timeDiff = mModel.expirationTime - currentTime;
                if (timeDiff > 0) {
                    int seconds = (int) (timeDiff / 1000) % 60;
                    int minutes = (int) ((timeDiff / (1000 * 60)) % 60);
                    int hours = (int) ((timeDiff / (1000 * 60 * 60)) % 24);
    
                    tvTimeRemaining.setText(hours + " hrs " + minutes + " mins " + seconds + " sec");
                } else {
                    tvTimeRemaining.setText("Expired!!");
                }
            }
    
            public ViewHolder(View itemView) {
                super(itemView);
                tvTimeRemaining = (TextView) itemView.findViewById(R.id.cd);
                textViewName = (TextView) itemView.findViewById(R.id.textViewName);
            }
        }
    }
    

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
    private List lst;
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecyclerView.Adapter adapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    
    
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        lst = new ArrayList<>();
        getData();
    
    
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();
            }
        });
    }
    
    private void getData(){
        final ProgressDialog loading = ProgressDialog.show(this,"Loading Data", "Please wait...",false,false);
    
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest("http://192.168.200.102/api.php",
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONArray response) {
                        loading.dismiss();
                        parseData(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
    
                    }
                });
    
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(jsonArrayRequest);
    }
    
    private void parseData(JSONArray array){
        for(int i = 0; i

    Model.java

    public class Model {
    public String name;
    public long expirationTime;
    
    public long getexpirationTime() {
        return expirationTime;
    }
    
    public void setexpirationTime(long expire) {
        this.expirationTime = expire;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }}
    

    activity_main.xml

    
    
    
        
    
            
    
        
    
        
    
        
    
    
    

    content_main.xml

    
    
    
            
            
    
    

    list.xml

    
    
    
        
    
            
    
    
                
    
                    
                        
    
                        
    
                    
    
                    
                        
    
                        
    
                    
    
                
            
        
    
    
    

    and for url part you can do something kind of:

     "Android",
            'expirationTime' => 1456860322 * 1000, // timestamp multiply for display in milliseconds
    ),
    array(
            'name' => "Android 2",
            'expirationTime' => 1456900522 * 1000,
    ),
    array(
            'name' => "Android 3",
            'expirationTime' =>  1459509819 * 1000,
    ),
    array(
            'name' => "Android 4",
            'expirationTime' => 1457021950 * 1000,
    ),
    );
    
    echo json_encode($arr);
    

提交回复
热议问题