如何将ListView项目标记为“读取”一次显示几秒钟?

时间:2013-10-25 18:40:50

标签: android android-listview

我想用粗体将新添加的项目标记到我的列表中。一旦用户看到这个项目(即它在屏幕上显示3秒钟),我想将其标记为已读(即删除粗体)。我知道如何用粗体标记一些项目。但是当用户看到该项目时如何捕捉事件?

This question非常接近我要找的东西。但它没有被接受的答案。目前尚不清楚如何等待3秒钟。

3 个答案:

答案 0 :(得分:1)

提示:

  • 您的适配器有一个getView()。

  • 您的适配器有一个数据源(列表,内容提供商等) 某种)。

  • 您的适配器知道哪些位置可见(因为列表 要求那些)。

  • 结合OnScrollListener,您可以判断列表的时间 移动。

  • 如果在适配器中使用视图持有者模式(并且应该), 您可以判断何时重复使用视图。

  • 您还可以设置一个3秒计时器,将“标记”项目读取为 只要它们仍然可见。

  • 您可以通过询问列表来判断项目是否可见 (getFirstVisiblePosition()last对应方)。

这是一个起点。

答案 1 :(得分:1)

在getView方法上启动一个线程。

  
      
  1. 检查项目是否已被阅读。
  2.   
  3. 如果没有,请将标识符设置为视图的标记。
  4.   
  5. 开始你的主题。
  6.   
  7. 之后的前4秒睡觉。检查该视图标记是否仍然等于标识符。
  8.   
  9. 如果是,则更改视图样式。并在您的数据结构中将项目设置为已读。
  10.   

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,并检查用户何时滚动到新项目。