1

我在一个婚礼应用程序中工作,我在其中维护一个列表视图的提要。

我的提要屏幕列表视图的第一个元素是有一个从当前日期到婚礼日期的计时器。

由于我采用了TIMERin ListView,因此很难更新TextViewinonTick()方法的文本。

婚礼时间仅在列表视图的第一个元素中可见。

_time = new CountDownTimer(WeddingTimeinMiliSec, 5000) {
                String showDate;
                long subtractvalue = 1000;

                Calendar currentTime = Calendar.getInstance();

                public void onTick(long millisUntilFinished) {
                    long diff = Day.getTimeInMillis() - currentTime.getTimeInMillis();
                    diff-=subtractvalue;
                    StringBuffer text = new StringBuffer("");
                    if (diff > DAY) {
                        //showDate = showDate+""+(diff / DAY)+("days ");
                        final long dif = diff;
                        if(holder!=null && holder._dayRespTextView!=null){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    holder._dayRespTextView.setText(String.valueOf((dif / DAY)));
                                }
                            });
                        }
                        text.append(diff / DAY).append(" days ");
                        diff %= DAY;
                    }
                    if (diff > HOUR) {
                        //  showDate = showDate+""+(diff / HOUR)+("hours ");
                        final long dif = diff;
                        if(holder!=null && holder._hoursRespTextView!=null){
                            runOnUiThread(new Runnable() {
                                public void run() {
                                    holder._hoursRespTextView.setText(String.valueOf((dif / HOUR)));
                                }
                            });
                        }
                        text.append(diff / HOUR).append(" hours ");
                        diff %= HOUR;
                    }
                    if (diff > MINUTE) {
                        //  showDate = showDate+""+(diff / MINUTE)+("minutes ");
                        final long dif = diff;
                        if(holder!=null && holder._minRespTextView!=null){
                            runOnUiThread(new Runnable() {
                                public void run() {
                                    holder._minRespTextView.setText(String.valueOf((dif / MINUTE)));
                                }
                            });
                        }

                        text.append(diff / MINUTE).append(" minutes ");
                        diff %= MINUTE;
                    }
                    if (diff > SECOND) {
                        //  showDate = showDate+""+(diff / SECOND)+("seconds ");
                        final long dif = diff;
                        if(holder!=null && holder._secRespTextView!=null){
                            runOnUiThread(new Runnable() {
                                public void run() {
                                    holder._secRespTextView.setText(String.valueOf((dif / SECOND)));
                                }
                            });                         
                        }

                        text.append(diff / SECOND).append(" seconds ");
                        diff %= SECOND;
                    }
                    /*_tvTime.setText(""+WeddingTime);*/    
                    showDate="";
                    subtractvalue+=1000;
                    notifyDataSetChanged();
                }
                public void onFinish() {

                }
            }.start();

这是我在 ListView ADAPTER 的 CONSTRUCTOR 中使用的 CountDownTimer 代码。

如何在 onTick 事件上更新 ListView 的第一个元素中的 TextViews 的文本。请给我建议。

4

2 回答 2

0

这是个有趣的问题。我以前从来没有这样做过,这个答案只是在黑暗中的一个镜头,但我认为你会通过查看这个答案找到一些前进的方向。

基本上,您需要跟踪哪些项目在您的ListView. 只更新TextView那些可见视图中的 s。要跟踪可见项目,您需要设置ListView's OnScrollListener。使用 ListView#getFirstVisiblePosition() 和 ListView#getLastVisiblePosition() 来保存第一个/最后一个位置,然后对这些信息做一些事情。我会尝试将它们发送到适配器,然后在处理其中一个位置时在适配器的 getView() 中执行您需要的操作。

就我个人而言,我可能会做一些事情,比如让我的适配器实现一些OnScrollListener可以用来将这些位置传递给适配器的接口。您可能需要多个CountDownTimer,或者您可能需要找到另一种计算每个事件剩余时间的方法。


更新

带有接口的东西可能更适合您的目的,但这里有一个概念验证示例代码,可以帮助理解我的观点。

此代码显示一个非常简单的列表,其中所有偶数项目都有一个每秒更新一次的时间显示。我没有声称这个解决方案的效率,只是它执行了预期的任务:


MainActivity.java

package com.example.selectivelistitemupdating;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {

    ListView mListView;
    MyCountDownTimer mMyCountDownTimer;

    @Override
    protected void onCreate( Bundle savedInstanceState ) {

        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );

        mListView = (ListView) findViewById( R.id.listView );
        MyAdapter adapter = new MyAdapter( this );
        mListView.setAdapter( adapter );

        mMyCountDownTimer = new MyCountDownTimer( 1000, 1000, adapter );
    }

    @Override
    protected void onResume() {

        super.onResume();
        mMyCountDownTimer.start();
    }

    @Override
    protected void onPause() {

        mMyCountDownTimer.cancel();
        super.onPause();
    }
}

MyCountDownTimer.java

package com.example.selectivelistitemupdating;

import android.os.CountDownTimer;
import android.widget.BaseAdapter;

public class MyCountDownTimer extends CountDownTimer {

    BaseAdapter mAdapter;

    public MyCountDownTimer(long millisInFuture, long countDownInterval, BaseAdapter adapter) {

        super( millisInFuture, countDownInterval );
        mAdapter = adapter;
    }

    @Override
    public void onFinish() {

        mAdapter.notifyDataSetChanged();
        this.start();
    }

    @Override
    public void onTick( long millisUntilFinished ) {

        // NO OP
    }

}

我的适配器.java

package com.example.selectivelistitemupdating;

import java.text.DateFormat;
import java.util.Calendar;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

    private static final int COUNT = 30;

    private Context context;
    private DateFormat dateFormat;

    public MyAdapter(Context context) {

        this.context = context;
        dateFormat = DateFormat.getTimeInstance();
    }

    @Override
    public int getCount() {

        return COUNT;
    }

    @Override
    public String getItem( int position ) {

        return "Item " + String.valueOf( position );
    }

    @Override
    public long getItemId( int position ) {

        return position;
    }

    @Override
    public View getView( int position, View convertView, ViewGroup parent ) {

        if ( convertView == null ) {
            convertView = LayoutInflater.from( getContext() ).inflate( android.R.layout.two_line_list_item, parent, false );
        }

        TextView text1 = (TextView) convertView.findViewById( android.R.id.text1 );
        TextView text2 = (TextView) convertView.findViewById( android.R.id.text2 );

        text1.setText( getItem( position ) );
        text2.setText( getTimeString( position ) );

        return convertView;
    }

    private CharSequence getTimeString( int position ) {

        if ( position % 2 == 0 ) {

            return dateFormat.format( Calendar.getInstance().getTime() );
        }
        else {
            return null;
        }
    }

    private Context getContext() {

        return context;
    }
}

activity_main.xml

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
于 2014-01-06T07:48:41.090 回答
-1

试试这个..

/**
* ADDING HEADER LAYOUT TO THE LISTVIEW
*/

View headerView = ((LayoutInflater)PostScreen.this.getSystemService(PostScreen.this.LAYOUT_INFLATER_SERVICE)).
inflate(R.layout.header_layout, null, false);
textview = (TextView)headerView.findViewById(R.id.countdown_tv);


 _time = new CountDownTimer(WeddingTimeinMiliSec, 5000) {
String showDate;
long subtractvalue = 1000;

Calendar currentTime = Calendar.getInstance();
public void onTick(long millisUntilFinished) {
long diff = Day.getTimeInMillis() - currentTime.getTimeInMillis();
diff-=subtractvalue;
StringBuffer text = new StringBuffer("");
if (diff > DAY) {
//showDate = showDate+""+(diff / DAY)+("days ");
final long dif = diff;
dayThread = String.valueOf((dif / DAY));
text.append(diff / DAY).append(" days ");
diff %= DAY;
}
if (diff > HOUR) {
final long dif = diff;
hoursThread = String.valueOf((dif / HOUR));
text.append(diff / HOUR).append(" hours ");
diff %= HOUR;
}
if (diff > MINUTE) {
final long dif = diff;
minThread = String.valueOf((dif / MINUTE));
text.append(diff / MINUTE).append(" minutes ");
diff %= MINUTE;
}
if (diff > SECOND) {
final long dif = diff;
secThread = String.valueOf((dif / SECOND));
text.append(diff / SECOND).append(" seconds ");
diff %= SECOND;
}
showDate="";
subtractvalue+=1000;

String dateText = "<font color="+countDown_TextColor+">"+dayThread+
" DIAS </font> <font color="+countDown_TextColor+">"+hoursThread+
" HOURAS </font><font color="+countDown_TextColor+">"+minThread+" MIN</font>" +
"<font color="+countDown_TextColor+">"+secThread+" MIN</font>";
textview.setText(Html.fromHtml(dateText));
}

public void onFinish() {

}
}.start();
于 2014-03-10T10:24:52.897 回答