Android自定义列表视图查看计时器

时间:2015-12-22 09:40:19

标签: android listview timer

我的列表有问题。我的列表包含两行。第一个是关于对象的信息。当我点击第一项时,会出现第二行。它有一个计时器,一切都按预期工作,但重新获得的时间开始更快滴答。我知道有必要清理清单,或者我只是做错了什么。请帮帮我。 这是我的代码:

public class MainActivity extends Activity {

    ArrayList<Childrens> arrayList = new ArrayList<Childrens>();
    ChilndrensAdapter adapter;
    ListView listView;
    private static Context context;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = MainActivity.this;
        final Childrens ls = new Childrens();
        arrayList = ls.getListView();

        adapter = new ChilndrensAdapter(getApplicationContext(), arrayList);
        listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (arrayList.get(position).status == false) {
                    Log.d("True", " True");
                    adapter.setSelecterIndex(position);
                    adapter.toggleSelected(new Integer(position));
                    adapter.startUpdateTimer(position);
                    adapter.notifyDataSetChanged();
                } else if (arrayList.get(position).status == true) {
                    Log.d("False", " False");
                    adapter.setSelecterIndex(position);
                    adapter.toggleSelected(new Integer(position));
                    adapter.stopUpdateTimer(position);
                    adapter.notifyDataSetChanged();
                }

            }
        });


    }

    public static Context getContext() {
        return context;
    }
}

适配器:

public class ChilndrensAdapter extends BaseAdapter {

    ArrayList<Childrens> arrayList;
    Context context;

    private LayoutInflater cInflater;
    public ArrayList<Integer> selectedIds = new ArrayList<Integer>();
    private ArrayList<ViewHolder> lstHolders;


    private static final int END = 0;
    private static final int START = 1;
    Timer tmr = new Timer();

    private Handler mHandler = new Handler();

    private Runnable updateRemainingTimeRunnable = new Runnable() {
        @Override
        public void run() {
            //Log.d("Runnable","Runnable");
            synchronized (lstHolders) {
                long currentTime = 0L;
                //long currentTime = System.currentTimeMillis();
                for (ViewHolder holder : lstHolders) {
                    holder.updateTimeRemaining(currentTime);

                }
            }
        }
    };

    public ChilndrensAdapter(Context context, ArrayList<Childrens> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
        this.cInflater = LayoutInflater.from(context.getApplicationContext());
        lstHolders = new ArrayList<>();
        // startUpdateTimer();

    }

    public void startUpdateTimer(final int positon) {

        arrayList.get(positon).status = true;

        tmr.schedule(new TimerTask() {
            @Override
            public void run() {
                //Log.d("tmr","tmr");
                mHandler.post(updateRemainingTimeRunnable);
                // arrayList.get(positon).time = arrayList.get(positon).time + 1;

            }
        }, 1000, 1000);

        for (int i = 0; i < lstHolders.size(); i++) {
            //Log.d("Holders: ","H: "+ i+" " + lstHolders.get(i) +" Size: " + lstHolders.size() + " Time: "+arrayList.get(positon).time);
        }
    }

    public void stopUpdateTimer(int position) {

        arrayList.get(position).time = 0;
        arrayList.get(position).status = false;

        // Log.d("Timer Run:", "Time is:" + lstHolders.size());

    }

    @Override
    public int getCount() {
        if (arrayList == null) {
            return 0;
        }
        return arrayList.size();
    }

    public void setSelecterIndex(int ind) {
        notifyDataSetChanged();
    }

    public void toggleSelected(Integer position) {
        if (selectedIds.contains(position)) {
            selectedIds.remove(position);

        } else {
            selectedIds.add(position);

        }
    }

    @Override
    public int getItemViewType(int position) {
        if (selectedIds.contains(position)) {
            return 1;
        } else
            return 0;
    }

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

    @Override
    public Childrens getItem(int position) {
        return arrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        Childrens item = (Childrens) getItem(position);
        int type = getItemViewType(position);
        if (convertView == null) {
            switch (type) {
                case END:
                    holder = new ViewHolder();
                    convertView = cInflater.inflate(R.layout.listview_row_normal, parent, false);
                    holder.name = (TextView) convertView.findViewById(R.id.name);
                    holder.info = (TextView) convertView.findViewById(R.id.name_control);
                    convertView.setTag(holder);
                    break;
                case START:
                    holder = new ViewHolder();
                    convertView = cInflater.inflate(R.layout.listview_row_start, parent, false);
                    holder.name = (TextView) convertView.findViewById(R.id.name_start);
                    holder.button = (ImageView) convertView.findViewById(R.id.dialog_button);
                    holder.holderTimer = (TextView) convertView.findViewById(R.id.answerTime);

                    convertView.setTag(holder);
                    synchronized (lstHolders) {

                        lstHolders.add(holder);

                    }
                    break;
            }

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        switch (type) {
            case END:
                holder.name.setText(item.name);
                holder.info.setText("Time");
                break;
            case START:
                holder.setData(getItem(position));
                holder.name.setText(item.name);

                holder.button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        final Dialog dialog = new Dialog(MainActivity.getContext());
                        dialog.setTitle("Position " + position);
                        dialog.setContentView(R.layout.dialog);
                        dialog.show();

                    }
                });

                break;
        }


        return convertView;
    }


    public class ViewHolder {
        private TextView name;
        private TextView info;
        public TextView holderTimer;
        public ImageView button;

        Childrens mChildrens;


        public void setData(Childrens item) {
            mChildrens = item;
            updateTimeRemaining(System.currentTimeMillis());

        }

        public void updateTimeRemaining(long currentTime) {


            int sec = (mChildrens.time) % 60;
            int min = (mChildrens.time / 60) % 60;
            holderTimer.setText(String.format("%02d", min) + ":" + String.format("%02d", sec));
            // holderTimer.setText("Time: " + min +":"+ sec);
        }


    }
}

对象

public class Childrens {
    public String name;
    public int id;
    public long answerTime = 0;
    public boolean status;
    public int time;

    final static Childrens CHILDRENS_STATE = new Childrens();

    Childrens(String n, int id, long answerTime) {
        this.name = n;
        this.id = id;
        this.answerTime = answerTime;

    }

    Childrens() {

    }


    public String getName() {
        return name;

    }

    public int getId() {
        return id;

    }

    public static Childrens getInstance() {
        return CHILDRENS_STATE;
    }

    public ArrayList<Childrens> getListView() {
        ArrayList<Childrens> arrayList = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Childrens c = new Childrens();
            c.status = false;
            c.name = "Child: " + i;
            c.time = 0;
            arrayList.add(c);
            //arrayList.add(new Childrens("Tata"+ i, i, answerTime));
        }
        return arrayList;
    }
}

2 个答案:

答案 0 :(得分:0)

抱歉,适配器出现了错误

    public class ChilndrensAdapter extends BaseAdapter {

    ArrayList<Childrens> arrayList;
    Context context;

    private LayoutInflater cInflater;
    public ArrayList<Integer> selectedIds = new ArrayList<Integer>();
    private ArrayList<ViewHolder> lstHolders;


    private static final int END = 0;
    private static final int START =  1;
    Timer tmr = new Timer();

    private Handler mHandler = new Handler();

    private Runnable updateRemainingTimeRunnable = new Runnable() {
        @Override
        public void run() {
                synchronized (lstHolders) {
                    for (ViewHolder holder : lstHolders) {
                    holder.updateTimeRemaining();

                }
            }
        }
    };

    public ChilndrensAdapter(Context context, ArrayList<Childrens> arrayList){
        this.context = context;
        this.arrayList = arrayList;
        this.cInflater = LayoutInflater.from(context.getApplicationContext());
        lstHolders = new ArrayList<>();


    }

    public void startUpdateTimer(final int positon) {

        arrayList.get(positon).status = true;

        tmr.schedule(new TimerTask() {
            @Override
            public void run() {

                mHandler.post(updateRemainingTimeRunnable);
                arrayList.get(positon).time = arrayList.get(positon).time + 1;

            }
        }, 1000, 1000);


    }
    public void stopUpdateTimer(int position) {

        arrayList.get(position).time = 0;
        arrayList.get(position).status = false;

    }
    @Override
    public int getCount() {
        if(arrayList == null){
            return 0;
        }
        return arrayList.size();
    }
    public void setSelecterIndex(int ind){
        notifyDataSetChanged();
    }
    public void toggleSelected(Integer position){
        if (selectedIds.contains(position)){
            selectedIds.remove(position);

        }else {
            selectedIds.add(position);

        }
    }
    @Override
    public int getItemViewType(int position) {
        if (selectedIds.contains(position)){
            return 1;
        }else
            return 0;
    }
    @Override
    public int getViewTypeCount() {
        return 2;
    }
    @Override
    public Childrens getItem(int position) {
        return arrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
         Childrens item = (Childrens) getItem(position);
        int type = getItemViewType(position);
        if(convertView == null){
            switch (type){
                case END:
                    holder = new ViewHolder();
                    convertView = cInflater.inflate(R.layout.listview_row_normal, parent,false);
                    holder.name = (TextView)convertView.findViewById(R.id.name);
                    holder.info = (TextView)convertView.findViewById(R.id.name_control);
                    convertView.setTag(holder);
                    break;
                case START:
                    holder = new ViewHolder();
                    convertView = cInflater.inflate(R.layout.listview_row_start, parent, false);
                    holder.name = (TextView)convertView.findViewById(R.id.name_start);
                    holder.button = (ImageView)convertView.findViewById(R.id.dialog_button);
                    holder.holderTimer = (TextView)convertView.findViewById(R.id.answerTime);

                    convertView.setTag(holder);
                    synchronized (lstHolders) {

                        lstHolders.add(holder);

                    }
                    break;
            }

        }else {
            holder = (ViewHolder) convertView.getTag();
        }

        switch (type){
            case END:
                holder.name.setText(item.name);
                holder.info.setText("Time");
                break;
            case START:
                holder.setData(getItem(position));
                holder.name.setText(item.name);

                holder.button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        final Dialog dialog = new Dialog(MainActivity.getContext());
                        dialog.setTitle("Position " + position);
                        dialog.setContentView(R.layout.dialog);
                        dialog.show();

                    }
                });

                break;
        }

            return convertView;
        }



    public class ViewHolder{
        private TextView name;
        private TextView info;
        public TextView holderTimer;
        public ImageView button;
        Childrens mChildrens;

        public void setData(Childrens item) {
            mChildrens = item;
            updateTimeRemaining();

        }

        public void updateTimeRemaining(long currentTime) {

            int sec = (mChildrens.time)%60;
            int min = (mChildrens.time/60)%60;
            holderTimer.setText(String.format("%02d", min) + ":" + String.format("%02d", sec));

        }


    }
}

答案 1 :(得分:0)

我解决了问题,我想与您分享准备好的代码。 在创建一个新的计时器时,我会将它改为你的数组,并在第二次单击一个元素时发现该计时器被重置为零。虽然此时我要将数据发送到服务器为零。一般来说它有效,请检查!

public class ChilndrensAdapter extends BaseAdapter {

ArrayList<Childrens> arrayList;
Context context;

private LayoutInflater cInflater;
public ArrayList<Integer> selectedIds = new ArrayList<Integer>();
private ArrayList<ViewHolder> lstHolders;


private static final int END = 0;
private static final int START =  1;
Timer tmr;

private Handler mHandler = new Handler();

private Runnable updateRemainingTimeRunnable = new Runnable() {
    @Override
    public void run() {
        synchronized (lstHolders) {

            for (ViewHolder holder : lstHolders) {
                holder.updateTimeRemaining();

            }
        }
    }
};

public ChilndrensAdapter(Context context, ArrayList<Childrens> arrayList){
    this.context = context;
    this.arrayList = arrayList;
    this.cInflater = LayoutInflater.from(context.getApplicationContext());
    lstHolders = new ArrayList<>();


}

public void startUpdateTimer(final int positon) {

    arrayList.get(positon).status = true;
    tmr = new Timer();
    arrayList.get(positon).timer = tmr;
    tmr.schedule(new TimerTask() {
        @Override
        public void run() {
            mHandler.post(updateRemainingTimeRunnable);
            arrayList.get(positon).time = arrayList.get(positon).time + 1;

        }
    }, 1000, 1000);


}
public void stopUpdateTimer(int position) {
    arrayList.get(position).timer.cancel();
    arrayList.get(position).timer = null;
    arrayList.get(position).time = 0;
    arrayList.get(position).status = false;
}
@Override
public int getCount() {
    if(arrayList == null){
        return 0;
    }
    return arrayList.size();
}
public void setSelecterIndex(int ind){
    notifyDataSetChanged();
}
public void toggleSelected(Integer position){
    if (selectedIds.contains(position)){
        selectedIds.remove(position);

    }else {
        selectedIds.add(position);

    }
}
@Override
public int getItemViewType(int position) {
    if (selectedIds.contains(position)){
        return 1;
    }else
        return 0;
}
@Override
public int getViewTypeCount() {
    return 2;
}
@Override
public Childrens getItem(int position) {
    return arrayList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
     Childrens item = (Childrens) getItem(position);
    int type = getItemViewType(position);
    if(convertView == null){
        switch (type){
            case END:
                holder = new ViewHolder();
                convertView = cInflater.inflate(R.layout.listview_row_normal, parent,false);
                holder.name = (TextView)convertView.findViewById(R.id.name);
                holder.info = (TextView)convertView.findViewById(R.id.name_control);
                convertView.setTag(holder);
                break;
            case START:
                holder = new ViewHolder();
                convertView = cInflater.inflate(R.layout.listview_row_start, parent, false);
                holder.name = (TextView)convertView.findViewById(R.id.name_start);
                holder.button = (ImageView)convertView.findViewById(R.id.dialog_button);
                holder.holderTimer = (TextView)convertView.findViewById(R.id.answerTime);
                convertView.setTag(holder);
                synchronized (lstHolders) {
                    lstHolders.add(holder);
                }
                break;
        }

    }else {
        holder = (ViewHolder) convertView.getTag();
    }

    switch (type){
        case END:
            holder.name.setText(item.name);
            holder.info.setText("Time");
            break;
        case START:
            holder.setData(getItem(position));
            holder.name.setText(item.name);
            holder.button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final Dialog dialog = new Dialog(MainActivity.getContext());
                    dialog.setTitle("Position " + position);
                    dialog.setContentView(R.layout.dialog);
                    dialog.show();

                }
            });

            break;
    }

        return convertView;
    }



public class ViewHolder{
    private TextView name;
    private TextView info;
    public TextView holderTimer;
    public ImageView button;

    Childrens mChildrens;



    public void setData(Childrens item) {
        mChildrens = item;
        updateTimeRemaining();

    }

    public void updateTimeRemaining() {
        int sec = (mChildrens.time)%60;
        int min = (mChildrens.time/60)%60;
        holderTimer.setText(String.format("%02d", min) + ":" + String.format("%02d", sec));

    }


}

}

相关问题