마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리스트뷰 안에서 개별적인 타이머를 돌리고 싶을때?

0 추천
아래는 소스입니다.



public class DataListAdapter extends BaseAdapter {
    private ArrayList<DataGetterSetters> dataList;
    private Context context;
    CountDownTimer timer;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        DataGetterSetters data = dataList.get(position);
        LayoutInflater inflater;
        if(v == null){
            inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.push_listitem_720x1280,null);
            holder = new ViewHolder();
            holder.itemImage = (ImageView)v.findViewById(R.id.itemImage);
            holder.itemPrice = (TextView)v.findViewById(R.id.itemPrice);
            holder.itemCount = (TextView)v.findViewById(R.id.itemCount);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
         1.현재시간을 가져옵니다.
Long nowTime = Long.parseLong(getNowTime());
 2.서버에서 기록된시간을 가져옵니다.
Long pickTime = Long.parseLong(data.getPurchaseItemThreeStr());
 3.현재시간과 서버에서 기록된시간을 뺍니다.   
data.setValLong(nowTime - pickTime);
4.기록된시간을 세터로 저장합니다..   
data.setTestInt(Integer.parseInt(Long.toString(data.getValLong())));
5.게터로 아까 저장한 값을 꺼내옵니다.
Log.d("총시간결과", Integer.toString(data.getTestInt()));
6.결과 값을 분기문으로 나눕니다 3가지 경우가 있습니다.(이하 1번 2번 3번이라함).
==> 여기까지는 잘 됩니다.
if (data.getTestInt() < 9000 ) {
    holder.itemPrice.setVisibility(View.VISIBLE);
//2. 타이머를 객체를 생성한다
==>문제는 이부분입니다.
totalTimeInt = data.getTestInt();
pickupTimer = new CountDownTimer(data.getTestInt() * 1000, 1000){
public void onTick(long millisUntilFinished){
  totalTimeInt--;
data.getTestInt()--; 
이렇게 하거나 포지션 별로 값을 처리하고 싶은데. 어떻게 해야할지를 모르겠습니다.
그리고 타이머가 돌긴 도는데 개별적으로 따로 따로 돌리고 싶기는 한데 어떻게 해야 할지를 모르겠습니다.
          holder.itemPrice.setText(totalTimeInt +" Sec");
==> 왜 텍스트뷰에도 표기가 안되지는지 궁금합니다.

          holder.itemPrice.setVisibility(View.VISIBLE);
              Log.d("타이머", Integer.toString(totalTimeInt));
    if( totalTimeInt == 1 ) {
           pickupTimer.cancel();
          holder.itemPrice.setVisibility(View.INVISIBLE);
           pickupTimer.onFinish();
    }
  }
  public void onFinish(){

  holder.itemPrice.setVisibility(View.INVISIBLE);
      }
  }.start();



} 
private String getNowTime(){
  String currentStr = "";
  
  Calendar cal = Calendar.getInstance();
  String dateToString , timeToString ;
  dateToString = String.format("%04d%02d%02d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
  timeToString = String.format("%02d%02d%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
  currentStr = dateToString+timeToString;
  
  return currentStr;
  
   }
static class ViewHolder {
        ImageView itemImage;

        TextView itemPrice;
        TextView itemCount;
}



}


05-13 23:56:21.663: D/타이머(25094): 1888
05-13 23:56:21.673: D/타이머(25094): 1887
05-13 23:56:22.674: D/타이머(25094): 1886
05-13 23:56:22.674: D/타이머(25094): 1885
05-13 23:56:23.675: D/타이머(25094): 1884
05-13 23:56:23.675: D/타이머(25094): 1883
05-13 23:56:24.666: D/타이머(25094): 1882
05-13 23:56:24.666: D/타이머(25094): 1881
05-13 23:56:25.677: D/타이머(25094): 1880
05-13 23:56:25.677: D/타이머(25094): 1879
05-13 23:56:26.678: D/타이머(25094): 1878
05-13 23:56:26.678: D/타이머(25094): 1877
05-13 23:56:27.679: D/타이머(25094): 1876
05-13 23:56:27.679: D/타이머(25094): 1875
05-13 23:56:28.680: D/타이머(25094): 1874
05-13 23:56:28.680: D/타이머(25094): 1873
05-13 23:56:29.681: D/타이머(25094): 1872

현재 서버에서 시간정보를 받아와 커스텀 리스트뷰 상에서 

타이머를 돌려 텍스트뷰로 해당 시간을 표기하려고 합니다.(각 뷰마다 타이머는 개별적으로 돌리려고 합니다.)

현재는 로그를 보시면 아실수 있겠지만 따로따로 안돌고 하나만 돕니다.

여러가지로 삽질을 해보았는데(1주 정도 나름대로)

해결책이 안나와 글을 올리게 되었습니다

버그도 참많았는데요.. 시간이 미친듯이 돌거나.. 여러 문제가 있었지만 일단 현재는 아래와 같은 상황입니다.

제가 해결하려고 하는 것은

왜 개별적으로 시간표기가 안되고 

    개별적으로 타이머가 안돌아가는지 궁금합니다..

아..딜레이가 되니까 돌아벌릴것 같네요..ㅠㅠ

 

 

풋사과1 (200 포인트) 님이 2013년 5월 14일 질문
풋사과1님이 2013년 5월 15일 수정
아래는 소스입니다.



public class DataListAdapter extends BaseAdapter {
    private ArrayList<DataGetterSetters> dataList;
    private Context context;
    CountDownTimer timer;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        DataGetterSetters data = dataList.get(position);
        LayoutInflater inflater;
        if(v == null){
            inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.push_listitem_720x1280,null);
            holder = new ViewHolder();
            holder.itemImage = (ImageView)v.findViewById(R.id.itemImage);
            holder.itemPrice = (TextView)v.findViewById(R.id.itemPrice);
            holder.itemCount = (TextView)v.findViewById(R.id.itemCount);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
         1.현재시간을 가져옵니다.
Long nowTime = Long.parseLong(getNowTime());
 2.서버에서 기록된시간을 가져옵니다.
Long pickTime = Long.parseLong(data.getPurchaseItemThreeStr());
 3.현재시간과 서버에서 기록된시간을 뺍니다.   
data.setValLong(nowTime - pickTime);
4.기록된시간을 세터로 저장합니다..   
data.setTestInt(Integer.parseInt(Long.toString(data.getValLong())));
5.게터로 아까 저장한 값을 꺼내옵니다.
Log.d("총시간결과", Integer.toString(data.getTestInt()));
6.결과 값을 분기문으로 나눕니다 3가지 경우가 있습니다.(이하 1번 2번 3번이라함).
==> 여기까지는 잘 됩니다.
if (data.getTestInt() < 9000 ) {
    holder.itemPrice.setVisibility(View.VISIBLE);
//2. 타이머를 객체를 생성한다
==>문제는 이부분입니다.
totalTimeInt = data.getTestInt();
pickupTimer = new CountDownTimer(data.getTestInt() * 1000, 1000){
public void onTick(long millisUntilFinished){
  totalTimeInt--;
data.getTestInt()--;
이렇게 하거나 포지션 별로 값을 처리하고 싶은데. 어떻게 해야할지를 모르겠습니다.
그리고 타이머가 돌긴 도는데 개별적으로 따로 따로 돌리고 싶기는 한데 어떻게 해야 할지를 모르겠습니다.
          holder.itemPrice.setText(totalTimeInt +" Sec");
==> 왜 텍스트뷰에도 표기가 안되지는지 궁금합니다.

          holder.itemPrice.setVisibility(View.VISIBLE);
              Log.d("타이머", Integer.toString(totalTimeInt));
    if( totalTimeInt == 1 ) {
           pickupTimer.cancel();
          holder.itemPrice.setVisibility(View.INVISIBLE);
           pickupTimer.onFinish();
    }
  }
  public void onFinish(){

  holder.itemPrice.setVisibility(View.INVISIBLE);
      }
  }.start();



}
private String getNowTime(){
  String currentStr = "";
  
  Calendar cal = Calendar.getInstance();
  String dateToString , timeToString ;
  dateToString = String.format("%04d%02d%02d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
  timeToString = String.format("%02d%02d%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));
  currentStr = dateToString+timeToString;
  
  return currentStr;
  
   }
static class ViewHolder {
        ImageView itemImage;

        TextView itemPrice;
        TextView itemCount;
}



}


05-13 23:56:21.663: D/타이머(25094): 1888
05-13 23:56:21.673: D/타이머(25094): 1887
05-13 23:56:22.674: D/타이머(25094): 1886
05-13 23:56:22.674: D/타이머(25094): 1885
05-13 23:56:23.675: D/타이머(25094): 1884
05-13 23:56:23.675: D/타이머(25094): 1883
05-13 23:56:24.666: D/타이머(25094): 1882
05-13 23:56:24.666: D/타이머(25094): 1881
05-13 23:56:25.677: D/타이머(25094): 1880
05-13 23:56:25.677: D/타이머(25094): 1879
05-13 23:56:26.678: D/타이머(25094): 1878
05-13 23:56:26.678: D/타이머(25094): 1877
05-13 23:56:27.679: D/타이머(25094): 1876
05-13 23:56:27.679: D/타이머(25094): 1875
05-13 23:56:28.680: D/타이머(25094): 1874
05-13 23:56:28.680: D/타이머(25094): 1873
05-13 23:56:29.681: D/타이머(25094): 1872

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...