Java ListView第一项的值错误

Java ListView第一项的值错误,java,android,listview,adapter,android-cursoradapter,Java,Android,Listview,Adapter,Android Cursoradapter,我有一个列表视图,由光标或适配器填充。此列表视图的每个项目都有5个子视图s。我在我的CursorAdapter的onBind()(我正在使用ViewHolder模式)中设置这些子视图的值。这些值是:电话号码、通话状态、评论计数、通话持续时间、通话发生时间。如果错过或挂断呼叫,我会将持续时间视图设置为不可见。当所有呼叫都被“应答”时,一切都正常,但是,如果出现错过或掉线的呼叫,则列表视图中的第一个项目,我总是且仅重复第一个项目,其持续时间视图设置为不可见,计数视图,值错误。我不明白。所有其他第一项

我有一个
列表视图
,由
光标或适配器
填充。此
列表视图的每个项目都有5个子
视图
s。我在我的
CursorAdapter
onBind()
(我正在使用
ViewHolder
模式)中设置这些子
视图的值。这些值是:电话号码、通话状态、评论计数、通话持续时间、通话发生时间。如果错过或挂断呼叫,我会将持续时间
视图
设置为
不可见
。当所有呼叫都被“应答”时,一切都正常,但是,如果出现错过或掉线的呼叫,则
列表视图中的第一个项目
,我总是且仅重复第一个项目,其持续时间
视图
设置为
不可见
,计数
视图
,值错误。我不明白。所有其他第一项
View
s设置正确,但由于某些原因,持续时间错误。请帮我弄清楚这件事

这是我的
CursorAdaper
code:

package com.example.nrsearch.adapter;

import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.nrsearch.R;
import com.example.nrsearch.Utils;

public class NumberListAdapter extends CursorAdapter {
private static final String KEY_NUMBER = "number";
private static final String KEY_STATE = "state";
private static final String KEY_COUNT = "count";
private static final String KEY_TIME = "time";
private static final String KEY_DURATION = "duration";

public NumberListAdapter(Context context, Cursor c, int flags) {
    super(context, c, flags);
}

private class ViewHolder {
    private TextView numberView;
    private ImageView stateView;
    private TextView countView;
    private TextView timeView;
    private TextView durationView;
}

@Override
public View newView(Context context, Cursor c, ViewGroup parent) {
    Log.i(Utils.TAG, "newView() is called");
    View view = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE))
            .inflate(R.layout.numberlistitem, parent, false);

    ViewHolder holder = new ViewHolder();
    holder.numberView = (TextView) view.findViewById(R.id.number);
    holder.stateView = (ImageView) view.findViewById(R.id.state);
    holder.countView = (TextView) view.findViewById(R.id.count);
    holder.timeView = (TextView) view.findViewById(R.id.time);
    holder.durationView = (TextView) view.findViewById(R.id.duration);

    view.setTag(holder);

    return view;
}

@Override
public void bindView(View view, Context context, Cursor c) {
    Log.i(Utils.TAG, "bindView() is called");

    ViewHolder holder = (ViewHolder) view.getTag();

    holder.numberView.setText(c.getString(c.getColumnIndexOrThrow(KEY_NUMBER)));
    int stateCode = c.getInt(c.getColumnIndexOrThrow(KEY_STATE));
    if (stateCode == 0) holder.stateView.setBackgroundResource(R.drawable.red_arrow);
    else holder.stateView.setBackgroundResource(R.drawable.green_arrow);

    int count = c.getInt(c.getColumnIndexOrThrow(KEY_COUNT));
    if (count == -2) holder.countView.setBackgroundResource(R.drawable.count_bubble_unknown);
    else if (count == -1) holder.countView.setBackgroundResource(R.drawable.count_bubble_blocked);
    else {
        holder.countView.setBackgroundResource(R.drawable.count_bubble);
        holder.countView.setText(""+count);
    }

    holder.timeView.setText(parseElapsedTime(c.getLong(c.getColumnIndexOrThrow(KEY_TIME)),
            System.currentTimeMillis() / 1000L));


    if (stateCode != 0) {
        long duration = c.getLong(c.getColumnIndexOrThrow(KEY_DURATION));
        holder.durationView.setText(parseDuration(duration));
    } else holder.durationView.setVisibility(View.INVISIBLE);
}

private String parseElapsedTime(long pastTimeSecs, long presentTimeSecs) {
    long elapsedTimeSecs = presentTimeSecs - pastTimeSecs;
    if (elapsedTimeSecs >= 60L && elapsedTimeSecs < 3600L) {
        return "Pries " + Math.round(elapsedTimeSecs / 60L) + " min.";
    } else if (elapsedTimeSecs >= 3600L && elapsedTimeSecs < 86400L) {
        return "Pries " + Math.round(elapsedTimeSecs / 3600L) + " val.";
    } else if (elapsedTimeSecs >= 86400L && elapsedTimeSecs < 604800L) {
        return "Pries " + Math.round(elapsedTimeSecs / 86400L) + " d.";
    } else if (elapsedTimeSecs >= 604800L && elapsedTimeSecs < 2592000L) {
        return "Pries " + Math.round(elapsedTimeSecs / 604800L) + " sav.";
    } else if (elapsedTimeSecs >= 2592000L && elapsedTimeSecs < 31536000L) {
        return "Pries " + Math.round(elapsedTimeSecs / 2592000L) + " men.";
    } else if (elapsedTimeSecs >= 31536000L) {
        return "Pries " + Math.round(elapsedTimeSecs / 31536000L) + " m.";
    } else return "Pries " + Long.toString(elapsedTimeSecs) + " s.";
}

private String parseDuration(long timeSeconds) {
    int hours = Math.round(timeSeconds / 3600);
    int minutes = Math.round((timeSeconds - hours * 3600) / 60);
    long seconds = timeSeconds - hours * 3600 - minutes * 60;

    String h, min, s;

    if (hours / 10 < 1)
        h = "0" + hours;
    else
        h = "" + hours;
    if (minutes / 10 < 1)
        min = "0" + minutes;
    else
        min = "" + minutes;
    if (seconds / 10 < 1)
        s = "0" + seconds;
    else
        s = "" + seconds;

    return h + ":" + min + ":" + s;
}

}
package com.example.nrsearch.adapter;
导入android.content.Context;
导入android.database.Cursor;
导入android.support.v4.widget.CursorAdapter;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.TextView;
导入com.example.nrsearch.R;
导入com.example.nrsearch.Utils;
公共类NumberListAdapter扩展游标适配器{
私有静态最终字符串键\u NUMBER=“NUMBER”;
私有静态最终字符串KEY_STATE=“STATE”;
私有静态最终字符串键\u COUNT=“COUNT”;
私有静态最终字符串键\u TIME=“TIME”;
私有静态最终字符串键\u DURATION=“DURATION”;
PublicNumberListAdapter(上下文上下文、光标c、int标志){
super(上下文、c、标志);
}
私有类视窗持有者{
私有文本视图编号视图;
私有图像视图stateView;
私有文本视图countView;
私有文本视图时间视图;
私有文本视图持续视图;
}
@凌驾
公共视图newView(上下文上下文、光标c、视图组父对象){
i(Utils.TAG,“newView()被调用”);
视图=((LayoutFlater)context.getSystemService(context.LAYOUT\u充气机\u服务))
.充气(R.layout.numberlistem,父项,false);
ViewHolder=新的ViewHolder();
holder.numberView=(TextView)view.findViewById(R.id.number);
holder.stateView=(ImageView)view.findViewById(R.id.state);
holder.countView=(TextView)view.findViewById(R.id.count);
holder.timeView=(TextView)view.findViewById(R.id.time);
holder.durationView=(TextView)view.findViewById(R.id.duration);
视图.设置标签(支架);
返回视图;
}
@凌驾
public void bindView(视图、上下文、光标c){
i(Utils.TAG,“调用bindView()”);
ViewHolder=(ViewHolder)view.getTag();
holder.numberView.setText(c.getString(c.getColumnIndexOrThrow(键号));
int stateCode=c.getInt(c.getColumnIndexOrThrow(KEY_STATE));
if(stateCode==0)holder.stateView.setBackgroundResource(R.drawable.red_箭头);
else holder.stateView.setBackgroundResource(R.drawable.green_箭头);
int count=c.getInt(c.getColumnIndexOrThrow(KEY_count));
if(count==-2)holder.countView.setBackgroundResource(R.drawable.count\u bubble\u未知);
否则,如果(计数==-1)holder.countView.setBackgroundResource(R.drawable.count\u bubble\u blocked);
否则{
holder.countView.setBackgroundResource(R.drawable.count_bubble);
holder.countView.setText(“+count”);
}
holder.timeView.setText(parseLapsedTime(c.getLong(c.getColumnIndexOrThrow(KEY_TIME)),
System.currentTimeMillis()/1000L));
如果(状态代码!=0){
long duration=c.getLong(c.getColumnIndexOrThrow(KEY_duration));
holder.durationView.setText(parseDuration(duration));
}else holder.durationView.setVisibility(View.INVISIBLE);
}
专用字符串ParseLapsedTime(长pastTimeSecs、长presentTimeSecs){
long elapsedTimeSecs=当前时间秒-过去时间秒;
如果(elapsedTimeSecs>=60L&&elapsedTimeSecs<3600L){
返回“Pries”+数学圆(elapsedTimeSecs/60L)+“min.”;
}否则如果(elapsedTimeSecs>=3600L&&elapsedTimeSecs<86400L){
返回“Pries”+数学圆(elapsedTimeSecs/3600L)+“val.”;
}否则如果(elapsedTimeSecs>=86400L&&elapsedTimeSecs<604800L){
返回“Pries”+数学圆(elapsedTimeSecs/86400L)+“d.”;
}否则如果(elapsedTimeSecs>=604800L&&elapsedTimeSecs<2592000L){
返回“Pries”+数学圆(elapsedTimeSecs/604800L)+“sav.”;
}否则如果(elapsedTimeSecs>=2592000L&&elapsedTimeSecs<31536000L){
返回“Pries”+数学圆(elapsedTimeSecs/2592000L)+“men.”;
}否则如果(elapsedTimeSecs>=31536000L){
返回“Pries”+数学圆(elapsedTimeSecs/31536000L)+“m.”;
}否则返回“Pries”+Long.toString(elapsedTimeSecs)+“s.”;
}
私有字符串解析持续时间(长时间秒){
整小时=数学整周(时间秒/3600);
整数分钟=数学整数((时间秒-小时*3600)/60);
长秒=时间秒-小时*3600-分钟*60;
字符串h,min,s;
如果(小时/10<1)
h=“0”+小时;
其他的
h=”“+小时;
如果(分钟/10<1)
min=“0”+分钟;
其他的
min=”“+分钟;
如果(秒/10<1)
s=“0”+秒;
其他的
s=”“+秒;
返回h+“:”+min+“:”+s;
}
}

尝试在if子句中将可见性设置为VISIBLE。我最近对此有点问题。

谢谢。这是正确的解决方案,尽管在你回答之前我自己找到了。
    if (stateCode != 0) {
       long duration = c.getLong(c.getColumnIndexOrThrow(KEY_DURATION));
       holder.durationView.setText(parseDuration(duration));
       holder.durationView.setVisibility(View.VISIBLE)
    } else{
       holder.durationView.setVisibility(View.INVISIBLE);
    }