Java 在listview中滚动后,将交换元素
我正在编写时间跟踪应用程序,listview的每一行都有两个按钮Start和Stop,还有一些textView来显示经过的时间 在listview中滚动后,将交换元素 在我的解决方案中我不确定,但我在模型类中加入了ViewHolder对象,用于获取更改视图元素的权限 下面是代码模型的片段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
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值交换。这只是一种替代。