Java 在listview中滚动后,将交换元素

Java 在listview中滚动后,将交换元素,java,android,listview,Java,Android,Listview,我正在编写时间跟踪应用程序,listview的每一行都有两个按钮Start和Stop,还有一些textView来显示经过的时间 在listview中滚动后,将交换元素 在我的解决方案中我不确定,但我在模型类中加入了ViewHolder对象,用于获取更改视图元素的权限 下面是代码模型的片段 private String name; private Boolean isStart=false; private Long elapsedTime=0L,seconds=0L,hours=0L,min

我正在编写时间跟踪应用程序,listview的每一行都有两个按钮Start和Stop,还有一些textView来显示经过的时间

在listview中滚动后,将交换元素

在我的解决方案中我不确定,但我在模型类中加入了ViewHolder对象,用于获取更改视图元素的权限

下面是代码模型的片段

private String name;
private  Boolean isStart=false;
private  Long elapsedTime=0L,seconds=0L,hours=0L,minutes=0L,lastPause=0L,updateTime=0L,startTime=0L,days=0L;
private Runnable updateTimeThread=new Runnable() {
@Override
public void run() {
    if(isStart && startTime!=0) {
        updateTime = ((System.currentTimeMillis() - startTime) + lastPause);
        seconds = updateTime / 1000;
        minutes = seconds / 60;
        hours = minutes / 60;

        seconds = seconds % 60;
        minutes = minutes % 60;
        hours = hours % 24;

        holder.days.setText(String.format("%04d", days));
        holder.hours.setText(String.format("%02d", hours));
        holder.minutes.setText(String.format("%02d", minutes));
        holder.seconds.setText(String.format("%02d", seconds));
        Log.d("myTag",name+" "+seconds);
        MainActivity.handler.post(this);
    }
}
             };

MyAdapter.ViewHolder holder;

    public MyAdapter.ViewHolder getHolder() {
return holder;
  }

   public void setHolder(MyAdapter.ViewHolder holder) {
    this.holder = holder;
   }

     public Runnable getRunnable() {
return updateTimeThread;
         }
适配器的片段代码

public View getView(final int position, final View convertView, ViewGroup parent) {
View row = convertView;
final Tracker tracker = trackerList.get(position);
final Runnable updateTimeThread=tracker.getRunnable();


View.OnClickListener onClickListener;
ViewHolder holder;

if(row == null){
    holder = new ViewHolder();
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    row = inflater.inflate(R.layout.row,parent,false);
    holder.name = (TextView)row.findViewById(R.id.tvName);
    holder.days = (TextView)row.findViewById(R.id.tvDays);
    holder.hours = (TextView)row.findViewById(R.id.tvHours);
    holder.minutes = (TextView)row.findViewById(R.id.tvMinutes);
    holder.seconds = (TextView)row.findViewById(R.id.tvSeconds);
    holder.start = (Button)row.findViewById(R.id.btStart);
    holder.stop = (Button)row.findViewById(R.id.btStop);
    row.setTag(holder);
}else {
    holder = (ViewHolder) row.getTag();
}
    holder.start.setEnabled(true);
    holder.stop.setEnabled(false);
    holder.name.setText(tracker.getName());
    final ViewHolder finalHolder = holder;



if(tracker.getIsStart()){
    holder.start.setEnabled(false);
    holder.stop.setEnabled(true);
}


 onClickListener = new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         switch (v.getId()) {
             case R.id.btStart:
                 tracker.setStartTime(System.currentTimeMillis());
                 tracker.setIsStart(true);
                 tracker.setHolder(finalHolder);
                 MainActivity.handler.post(updateTimeThread);
                 finalHolder.start.setEnabled(false);
                 finalHolder.stop.setEnabled(true);
                 break;
             case R.id.btStop:
                 tracker.setLastPause(tracker.getUpdateTime());
                 MainActivity.handler.removeCallbacks(updateTimeThread);
                 finalHolder.stop.setEnabled(false);
                 finalHolder.start.setEnabled(true);
                 tracker.setIsStart(false);
                 break;
         }
     }
 };
holder.start.setOnClickListener(onClickListener);
holder.stop.setOnClickListener(onClickListener);
return row;
 }

static class ViewHolder{
TextView  name,days,hours,minutes,seconds;
Button start,stop;
}
更改此部分

holder.start.setEnabled(true);
holder.stop.setEnabled(false);
holder.name.setText(tracker.getName());
final ViewHolder finalHolder = holder;

if(tracker.getIsStart()){
holder.start.setEnabled(false);
holder.stop.setEnabled(true);
}    
对此

final ViewHolder finalholfder = holder;

finalholfder.start.setEnabled(true);
finalholfder.stop.setEnabled(false);
finalholfder.name.setText(tracker.getName());


if(tracker.getIsStart()){
finalholfder.start.setEnabled(false);
finalholfder.stop.setEnabled(true);
} else{
finalholfder.start.setEnabled(true);
finalholfder.stop.setEnabled(false);
}
 finalholfder.start.setOnClickListener(onClickListener);
 finalholfder.stop.setOnClickListener(onClickListener);
还有这个

holder.start.setOnClickListener(onClickListener);  
holder.stop.setOnClickListener(onClickListener);
对此

final ViewHolder finalholfder = holder;

finalholfder.start.setEnabled(true);
finalholfder.stop.setEnabled(false);
finalholfder.name.setText(tracker.getName());


if(tracker.getIsStart()){
finalholfder.start.setEnabled(false);
finalholfder.stop.setEnabled(true);
} else{
finalholfder.start.setEnabled(true);
finalholfder.stop.setEnabled(false);
}
 finalholfder.start.setOnClickListener(onClickListener);
 finalholfder.stop.setOnClickListener(onClickListener);

我只是将这两个方法添加到我的适配器中

  @Override
public int getViewTypeCount() {
    return getCount();
}

@Override
public int getItemViewType(int position) {
    return position;
}
更新 但对于加载器回调问题仍然是一样的。我按下最后一项的开始键,向下滚动,数值不可见,向上滚动一点,数值可见。可怜

更新2本文解决了我的问题,我只是将布局高度和laoyut权重从wrap_content更改为fill_parent,以避免多次调用getView方法。

谢谢您的回答!我不明白它是如何与listview中交换的元素链接的,我更改了代码,但问题仍然是每次滚动getview都会更改convertview,我经常遇到这个问题。我只是这样修复了它,对于我编写的每个if语句,计数器else station,并对每个位置使用finalviewholder。我再次测试,但它对我不起作用,如果我启动第一个计时器并滚动到最后一个,最后一个项将与first just值交换。这只是一种替代。