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修改后再通知界面更新显示就可以了 --------------------编程问答-------------------- 网上动态添加删除不是这样写的吗?
--------------------编程问答-------------------- 为啥子你要在getView里面删除呢。。。 --------------------编程问答-------------------- 我是看网上的例子,是在getview 中删的(见上排代码)
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;
}
}
否则在哪个地方写删除语句,同时还能同步呢? --------------------编程问答-------------------- 你的问题很好解决的把定时器和监听去全部拿出adapter,将他们在listview的onitemlistenner里面去做。 --------------------编程问答-------------------- 这个是点击事件,不能完成计时监听吧
补充:移动开发 , Android