当前位置:编程学习 > wap >>

listview 自动 删除一行 导致 getview() 重复执行

我在做一个倒计时的效果

想要的是:点击[存档]中的某一项,此项就添加到[运行中]去,同时开始倒计时
现在可以做到数据添加到[运行中]去,同时倒计时。

在倒计时完毕后自动删除计时已经完毕的列表项,这时就出现了问题,
在getView 里写的删除语句,删除一项之后执行notifyDataSetChanged(),还会重复执行getView(),导致 ListView 中的项目位置文本都变得混乱
不知道有什么方法可以达到这个目标呢?
在网上找了一圈都没有好的解决方案啊

删除代码写在 BaseAdapter 中的 getView函数里:

... ...

public static MyAdapter listItemAdapter;

public class CrsTimer extends FragmentActivity {

    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
        View view = inflater.inflate(R.layout.tab1_fragment_layout, container, false);        
        listItemAdapter = new MyAdapter(this);  
     
        //绑定Layout里面的ListView  
        list = (ListView)view.findViewById(R.id.tab1_lvwTimer);      
  
        //添加  Adapter
        list.setAdapter(listItemAdapter);
    }
   ... ...

    class MyAdapter extends BaseAdapter {
        private Context context;
        private LayoutInflater inflater;
        public ArrayList<String> arr;

        public MyAdapter(Context context) {
            super();
            this.context = context;
            inflater = LayoutInflater.from(context);
            arr = new ArrayList<String>();
        }

        ... ...

        @Override
        public View getView(final int position, View convertView, ViewGroup arg2) {
           
            ((TextView) convertView.findViewById(R.id.TextView1)).setText("p:"+postion);
            int timespan = random.nextInt(20);
            new CountDownTimer(timespan  *1000, 1000) {
                    
                    public void onTick(long millisUntilFinished) {  
                         ((TextView) convertView.findViewById(R.id.TextView2)).setText(millisUntilFinished / 1000 + " / " +timespan );  
                    }  

                    //time out
                    public void onFinish() {

                        Log.i("Test Timer","Time Out! Postion:" + String.valueOf(position));                        
                        
                        //删除倒计时完毕的选项
                        listItemAdapter.arr.remove(position);
                        listItemAdapter.notifyDataSetChanged();                        
                    }  
                }.start();
    }
}

listview  getview() notifyDataSetChanged 删除 --------------------编程问答-------------------- 1. notifyDataSetChanged()实际上就是通知ListView,我的数据变了,需要你ListView去刷新,当然会调用getView了。

2. 问一下你几个问题:
1)convertView为何你没有重用?
2)getView会在创建ListView,滑动的时候等情况都会被反复调用,为什么要在getView中创建new CountDownTimer?你这样做会创建无数个CountDownTimer对象。
3)为何的你convertView没有绑定数据?

3. 建议你先好好看看ListView的用法 --------------------编程问答-------------------- 我的代码是利用了convertView的,完整的如下:

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

 TextView title = null;
TextView text = null;
 ImageView ivw = null;

 final ViewHolder holder;

if(convertView == null){ 
 convertView = inflater.inflate(R.layout.tab1_lvwitem, null); 

//得到当前条目的数据
 title = (TextView)convertView.findViewById(R.id.tab1_ItemTitle);
  text = (TextView)convertView.findViewById(R.id.tab1_ItemText);
 ivw = (ImageView) convertView.findViewById(R.id.tab1_ItemImage);

  holder = new ViewHolder();

 //得到各个控件的对象                    
 holder.title = title;
holder.text = text;
 holder.ivw = ivw;

convertView.setTag(holder);//绑定ViewHolder对象  
  }
else
 {
holder = (ViewHolder) convertView.getTag();
}
 

if (position == getCount()-1)
{
holder.title.setText(Tab2Fragment.ItemTitle + "  
                   p"+position);
               holder.ivw.setImageResource(R.drawable.play);

iItemText = Integer.parseInt(Tab2Fragment.ItemText);


 Log.i("getView",String.valueOf(position));

    new CountDownTimer(iItemText *1000, 1000) {

                    public void onTick(long millisUntilFinished) {  
                 holder.text.setText(dealTime(millisUntilFinished / 1000) + " / " 
                         + dealTime(iItemText));  
                    }  
                    public void onFinish() {

                        holder.text.setText("TimeOut!");         
                     Log.i("time out",String.valueOf(position));
            
            
            
                   if (Tab1Fragment.tab1_listItemAdapter.arr.size()-1 >= position)
                   {
                        tab1_listItemAdapter.arr.remove(position);
                        tab1_listItemAdapter.notifyDataSetChanged();
              list.invalidateViews();
                   }
            
                   }  
               }.start(); 
        

}


// 返回LinearLayout实例
return convertView;
}


现在的问题的确是如何在getview()中实现倒计时,并删除倒计时完毕的项
不new CountDownTimer 的话不知道还有什么好的方法? --------------------编程问答-------------------- 为什么在getview里面删除??

要删除就删除你那个存放内容的list,把不需要的那个remove掉,然后再通知界面更新,肯定不会有问题的。不要做的这么混淆 --------------------编程问答-------------------- listview 说白了就是用来显示list中的信息,你把list修改后再通知界面更新显示就可以了 --------------------编程问答-------------------- 网上动态添加删除不是这样写的吗?



private class MyAdapter extends BaseAdapter {

private Context context;
private LayoutInflater inflater;
public ArrayList<String> arr;

public MyAdapter(Context context) {

super();
this.context = context;
inflater = LayoutInflater.from(context);
arr = new ArrayList<String>();
for (int i = 0; i < 3; i++) { // listview初始化3个子项
arr.add("");
}
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return arr.size();
}

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}

@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}

@Override
public View getView(final int position, View view, ViewGroup arg2) {

// TODO Auto-generated method stub
if (view == null) {
view = inflater.inflate(R.layout.listview_item, null);
}

final EditText edit = (EditText) view.findViewById(R.id.edit);
edit.setText(arr.get(position)); // 在重构adapter的时候不至于数据错乱
Button del = (Button) view.findViewById(R.id.del);
edit.setOnFocusChangeListener(new OnFocusChangeListener() {

@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
if (arr.size() > 0) {
arr.set(position, 
                                                edit.getText().toString());
}
}
});

del.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// 从集合中删除所删除项的EditText的内容
arr.remove(position);
adapter.notifyDataSetChanged();
}
});

return view;

}

}
--------------------编程问答-------------------- 为啥子你要在getView里面删除呢。。。 --------------------编程问答-------------------- 我是看网上的例子,是在getview 中删的(见上排代码)

否则在哪个地方写删除语句,同时还能同步呢? --------------------编程问答-------------------- 你的问题很好解决的把定时器和监听去全部拿出adapter,将他们在listview的onitemlistenner里面去做。 --------------------编程问答-------------------- 这个是点击事件,不能完成计时监听吧
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,