android 在list里做倒计时,android – 如何在RecyclerView中处理多个倒计时器?

我有一个Recyclerview,我需要在每一行显示一个倒计时.

这是一个类似的问题

coutndown timers in listview

它有一个很好的解决方案,但我需要与recyclerview

它有一个很好的解决方案,但我需要与recyclerview

bada9bd2bd17a526719dc7a2acf0df69.png

编辑:

我尝试了什么,这是我的代码适配器

MyAdapter:

public class AdapterItems extends RecyclerView.Adapter {

private ArrayList mListItems = new ArrayList<>();

private ImageLoader mImageLoader;

private Context context;

private Handler handler;

/******************************************/

String current_date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Date d1 = null;

Date d2 = null;

long diff;

long diffSeconds;

long diffMinutes;

long diffHours;

long diffDays;

String reachableDate = "";

/******************************************/

private ScheduledFuture updateFuture;

public AdapterItems(Context context) {

this.context = context;

mImageLoader = AppController.getInstance().getImageLoader();

}

public void setmListItems(ArrayList mListItems) {

this.mListItems = mListItems;

//update the adapter to reflect the new set of mListItems

notifyDataSetChanged();

}

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View itemView = LayoutInflater.

from(parent.getContext()).

inflate(R.layout.custom_horizontal_row, parent, false);

return new ItemHolder(itemView);

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

final TopCompetitions currentItem = mListItems.get(position);

final ItemHolder itemHolder = (ItemHolder) holder;

/* start_date , name_com_ar , name_com_en,

question_en,answer_ar1,answer_ar2,answer_ar3

,answer_en1,answer_en2,answer_en3,right_answer;

*/

itemHolder.item_id.setText(currentItem.getPrize_id());

itemHolder.item_description.setText(currentItem.getName_com_ar());

itemHolder.start_date.setText(currentItem.getStart_date());

itemHolder.end_date.setText(currentItem.getEnd_date());

itemHolder.name_com_ar.setText(currentItem.getName_com_ar());

itemHolder.name_com_en.setText(currentItem.getName_com_en());

itemHolder.answer_en1.setText(currentItem.getAnswer_en1());

itemHolder.answer_en2.setText(currentItem.getAnswer_en2());

itemHolder.answer_en3.setText(currentItem.getAnswer_en3());

itemHolder.answer_ar1.setText(currentItem.getAnswer_ar1());

itemHolder.answer_ar2.setText(currentItem.getAnswer_ar2());

itemHolder.answer_ar3.setText(currentItem.getAnswer_ar3());

itemHolder.right_answer.setText(currentItem.getRight_answer());

itemHolder.question_en.setText(currentItem.getQuestion_en());

itemHolder.question_ar.setText(currentItem.getQuestion_ar());

itemHolder.desc_ar.setText(currentItem.getPrize_desc_ar());

itemHolder.desc_en.setText(currentItem.getPrize_desc_en());

String urlLogo = currentItem.getPrize_pic1();

loadImages(urlLogo, itemHolder);

setDefferinceTimer(itemHolder , currentItem.getEnd_date());

if (updateFuture == null) {

final Handler mainHandler = new Handler(Looper.getMainLooper());

updateFuture = Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

setDefferinceTimer(itemHolder , currentItem.getEnd_date());

notifyDataSetChanged();

mainHandler.post(new Runnable() {

@Override

public void run() {

notifyDataSetChanged();

}

});

}

}, 0, 1000, TimeUnit.MILLISECONDS);

}

/* new Handler(Looper.getMainLooper()).post(new Runnable() {

@Override

public void run() {

new CountDownTimer(20000, 1000) {

public void onTick(long millisUntilFinished) {

startCountDown(itemHolder, currentItem.getEnd_date() + " 00:00:00");

notifyDataSetChanged();

}

public void onFinish() {

//counterTextView.setText("done!");

}

}.start();

}

});

*/

}

public void setDefferinceTimer(final RecyclerView.ViewHolder holder , String itemEndDate){

final ItemHolder itemHolder = (ItemHolder) holder;

current_date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

// reachableDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(itemEndDate);

try {

d1 = format.parse(current_date);

d2 = format.parse(itemEndDate+" 00:00:00");

} catch (ParseException e) {

e.printStackTrace();

}

diff = d2.getTime() - d1.getTime();

diffSeconds = diff / 1000 % 60;

diffMinutes = diff / (60 * 1000) % 60;

diffHours = diff / (60 * 60 * 1000) % 24;

diffDays = diff / (24 * 60 * 60 * 1000);

itemHolder.days_tf.setText(""+diffDays);

itemHolder.hours_tf.setText(""+diffHours);

itemHolder.minutes_tf.setText(""+diffMinutes);

itemHolder.seconds_tf.setText(""+diffSeconds);

}

private void loadImages(String urlThumbnail, final RecyclerView.ViewHolder holder) {

final ItemHolder itemHolder = (ItemHolder) holder;

mImageLoader.get(urlThumbnail, new ImageLoader.ImageListener() {

@Override

public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {

itemHolder.item_image.setImageBitmap(response.getBitmap());

//holder.salon_gender.setImageBitmap(response.getBitmap());

}

@Override

public void onErrorResponse(VolleyError error) {

}

});

}

@Override

public int getItemCount() {

return mListItems.size();

}

private class ItemHolder extends RecyclerView.ViewHolder {

public TextView item_id, item_description, end_date,

start_date, name_com_ar, name_com_en, question_ar,

question_en, answer_ar1, answer_ar2, answer_ar3, answer_en1,

answer_en2, answer_en3, right_answer , desc_ar , desc_en;

public TextView days_tf, hours_tf, minutes_tf, seconds_tf;

public CircleImageView item_image;

public ItemHolder(View itemView) {

super(itemView);

start_date = (TextView) itemView.findViewById(R.id.start_date);

end_date = (TextView) itemView.findViewById(R.id.end_date);

name_com_ar = (TextView) itemView.findViewById(R.id.name_com_ar);

name_com_en = (TextView) itemView.findViewById(R.id.name_com_en);

question_en = (TextView) itemView.findViewById(R.id.question_en);

question_ar = (TextView) itemView.findViewById(R.id.question_ar);

desc_ar = (TextView) itemView.findViewById(R.id.desc_ar);

desc_en = (TextView) itemView.findViewById(R.id.desc_en);

answer_ar1 = (TextView) itemView.findViewById(R.id.answer_ar1);

answer_ar2 = (TextView) itemView.findViewById(R.id.answer_ar2);

answer_ar3 = (TextView) itemView.findViewById(R.id.answer_ar3);

answer_en1 = (TextView) itemView.findViewById(R.id.answer_en1);

answer_en2 = (TextView) itemView.findViewById(R.id.answer_en2);

answer_en3 = (TextView) itemView.findViewById(R.id.answer_en3);

right_answer = (TextView) itemView.findViewById(R.id.right_answer);

item_id = (TextView) itemView.findViewById(R.id.item_id);

item_description = (TextView) itemView.findViewById(R.id.item_description);

item_image = (CircleImageView) itemView.findViewById(R.id.item_image);

days_tf = (TextView) itemView.findViewById(R.id.days_tf);

hours_tf = (TextView) itemView.findViewById(R.id.hours_tf);

minutes_tf = (TextView) itemView.findViewById(R.id.minutes_tf);

seconds_tf = (TextView) itemView.findViewById(R.id.seconds_tf);

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 RecyclerView 显示 Android Room 数据,您需要执行以下步骤: 1. 创建一个 RecyclerView 和一个 Adapter:RecyclerView 是用于显示数据的 View,而 Adapter 则将数据绑定到 RecyclerView 。 2. 创建一个 Entity 类来表示数据模型:这是用于将数据存储到 Room 数据库的类。 3. 创建一个 DAO:这是用于操作 Room 数据库的接口。 4. 创建一个 Database 类:这是用于创建 Room 数据库实例的类。 5. 将数据从 Room 数据库检索出来并将其传递给 Adapter。 下面是一个基本的代码示例,可以帮助您开始在 RecyclerView 显示 Room 数据: 1. 为 RecyclerView 创建一个 Adapter: ```kotlin class MyAdapter(private val itemList: List<Item>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() { inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val titleTextView: TextView = itemView.findViewById(R.id.titleTextView) val descriptionTextView: TextView = itemView.findViewById(R.id.descriptionTextView) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false) return MyViewHolder(itemView) } override fun getItemCount() = itemList.size override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val currentItem = itemList[position] holder.titleTextView.text = currentItem.title holder.descriptionTextView.text = currentItem.description } } ``` 2. 创建一个 Entity 类: ```kotlin @Entity(tableName = "items") data class Item( @PrimaryKey(autoGenerate = true) val id: Int, val title: String, val description: String ) ``` 3. 创建一个 DAO: ```kotlin @Dao interface ItemDao { @Query("SELECT * FROM items") fun getAll(): List<Item> @Insert fun insertAll(vararg items: Item) } ``` 4. 创建一个 Database 类: ```kotlin @Database(entities = [Item::class], version = 1) abstract class MyDatabase : RoomDatabase() { abstract fun itemDao(): ItemDao companion object { @Volatile private var INSTANCE: MyDatabase? = null fun getDatabase(context: Context): MyDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, MyDatabase::class.java, "my_database" ).build() INSTANCE = instance instance } } } } ``` 5. 将数据从 Room 数据库检索出来并将其传递给 Adapter: ```kotlin class MainActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private lateinit var adapter: MyAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView = findViewById(R.id.recyclerView) recyclerView.layoutManager = LinearLayoutManager(this) adapter = MyAdapter(emptyList()) recyclerView.adapter = adapter val database = MyDatabase.getDatabase(this) val itemDao = database.itemDao() itemDao.getAll().observe(this, Observer { adapter.itemList = it adapter.notifyDataSetChanged() }) } } ``` 这是一个基本的示例,您可以根据自己的需求进行更改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值