我想用粗体将新添加的项目标记到我的列表中。一旦用户看到这个项目(即它在屏幕上显示3秒钟),我想将其标记为已读(即删除粗体)。我知道如何用粗体标记一些项目。但是当用户看到该项目时如何捕捉事件?
This question非常接近我要找的东西。但它没有被接受的答案。目前尚不清楚如何等待3秒钟。
答案 0 :(得分:1)
提示:
您的适配器有一个getView()。
您的适配器有一个数据源(列表,内容提供商等) 某种)。
您的适配器知道哪些位置可见(因为列表 要求那些)。
结合OnScrollListener,您可以判断列表的时间 移动。
如果在适配器中使用视图持有者模式(并且应该), 您可以判断何时重复使用视图。
您还可以设置一个3秒计时器,将“标记”项目读取为 只要它们仍然可见。
您可以通过询问列表来判断项目是否可见 (getFirstVisiblePosition()和last对应方)。
这是一个起点。
答案 1 :(得分:1)
在getView方法上启动一个线程。
- 检查项目是否已被阅读。
- 如果没有,请将标识符设置为视图的标记。
- 开始你的主题。
- 之后的前4秒睡觉。检查该视图标记是否仍然等于标识符。
- 如果是,则更改视图样式。并在您的数据结构中将项目设置为已读。
醇>
email.xml(项目布局):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@android:color/transparent" />
</LinearLayout>
EMail.java(项目类):
public class EMail {
public String title;
public boolean read;
public EMail(String title, boolean read) {
this.title = title;
this.read = read;
}
}
活动onCreate方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView)findViewById(R.id.listView1);
ListAdapter emails = new ListAdapter(this, 0, new ArrayList<EMail>());
emails.add(new EMail("Email 1", false));
emails.add(new EMail("Email 2", false));
emails.add(new EMail("Email 3", true));
emails.add(new EMail("Email 4", true));
emails.add(new EMail("Email 5", false));
emails.add(new EMail("Email 6", false));
emails.add(new EMail("Email 7", true));
emails.add(new EMail("Email 8", false));
emails.add(new EMail("Email 9", false));
emails.add(new EMail("Email 10", true));
emails.add(new EMail("Email 11", false));
emails.add(new EMail("Email 12", false));
emails.add(new EMail("Email 13", false));
emails.add(new EMail("Email 14", true));
emails.add(new EMail("Email 15", false));
emails.add(new EMail("Email 16", false));
emails.add(new EMail("Email 17", false));
emails.add(new EMail("Email 18", false));
emails.add(new EMail("Email 19", false));
emails.add(new EMail("Email 20", false));
lv.setAdapter(emails);
}
适配器:
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ListAdapter extends ArrayAdapter<EMail> {
private Timer timer = new Timer();
private int identifier = 0;
public ListAdapter(Context context, int textViewResourceId,
ArrayList<EMail> items) {
super(context, textViewResourceId, items);
}
@Override
public View getView(final int position, View v, ViewGroup parent) {
if (v == null) {
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.email, null);
}
final int id = identifier++;
v.setTag(id);
TextView titleTextView = (TextView)v.findViewById(R.id.title);
final LinearLayout back = (LinearLayout)v.findViewById(R.id.background);
final EMail e = getItem(position);
titleTextView.setText(e.title);
if (e.read)
back.setBackgroundColor(getContext().getResources().getColor(R.color.gray));
else
{
back.setBackgroundColor(getContext().getResources().getColor(R.color.white));
final View view = v;
TimerTask task = new TimerTask() {
public void run() {
if (view.getTag().toString().equals(id+""))
{
e.read = true;
((Activity) getContext()).runOnUiThread(new Runnable() {
public void run() {
back.setBackgroundColor(getContext().getResources().getColor(R.color.gray));
}
});
}
}
};
timer.schedule(task, 3000);
}
return v;
}
}
答案 2 :(得分:0)
您可以将OnScrollListener设置为ListView,并检查用户何时滚动到新项目。