2017-01-02 5 views
0

Handler를 사용하여 매초 00:00:00부터 시작하는 timer로 textView를 업데이트하려고합니다. 나 또한 맞춤형 어댑터로 작업하고있다. 그래서 각 행에는 타이머 textView, 시작 및 중지 버튼이 있습니다. 동일한 행에서 timerTextView를 업데이트하려고 시도했지만 listView의 마지막 행에서 textView를 업데이트하는 결과가 발생했습니다.누구나 사용자 정의 어댑터를 사용하여 동일한 행에서 TextView (Timer TextView가 Handler를 사용하여 매초마다 업데이트 됨)를 업데이트 할 수 있습니까?

public class ItemAdapter extends ArrayAdapter<Items> 
{ 


TextView labelTimer; 
int passedSeconds = 0; 
Boolean isActivityRunning = false; 
Timer timer; 
TimerTask timerTask; 
Context myContext; 
int myLayoutResourceID; 
Items[] myData = null; 
ItemHolder holder = null; 
Integer pos; 



public ItemAdapter(Context myContext, int myLayoutResourceID, Items[]  myData) { 
super(myContext,myLayoutResourceID,myData); 
this.myContext = myContext; 
this.myData = myData; 
this.myLayoutResourceID = myLayoutResourceID; 
} 

@Override 
public Items getItem(int position) 
{ 
return super.getItem(position); 
} 




@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
View row = convertView; 
//ItemHolder holder = null; 


if(row == null) { 
    LayoutInflater inflater = LayoutInflater.from(myContext); 
    row = inflater.inflate(myLayoutResourceID, parent, false); 


    holder = new ItemHolder(); 


    holder.nameView = (TextView) row.findViewById(R.id.nameTextView); 
    holder.timerView = (TextView) row.findViewById(R.id.timerTextView); 
    holder.imageView = (ImageView) row.findViewById(R.id.imageView); 
    holder.startButton = (Button) row.findViewById(R.id.startButton); 
    holder.stopButton = (Button) row.findViewById(R.id.stopButton); 


    row.setTag(holder); 
} 

else 
{ 
    holder = (ItemHolder) row.getTag(); 
} 

Items item = myData[position]; 


holder.timerView.setText(item.timer); 

final Button srBtn = holder.startButton; 
srBtn.setText("START"); 

//Setup and reuse the same listener each row 

Integer rowPosition = position; 
pos = position; 


holder.startButton.setTag(rowPosition); 
holder.timerView.setTag(rowPosition); 

final TextView timeV = holder.timerView; 
labelTimer = timeV; 
labelTimer.setTag(pos); 


Log.v("Get tag while creating"+labelTimer.getTag()+" ",""); 



//Setting the view to reflect the data we need to display 
holder.nameView.setText(item.itemName); 



int resid = myContext.getResources().getIdentifier(item.itemImage,"drawable",myContext.getPackageName()); 
holder.imageView.setImageResource(resid); 

holder.startButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (isActivityRunning) { 
      //pause running activity 
      timer.cancel(); 
      srBtn.setText("START"); 
      isActivityRunning = false; 
     } else { 
      reScheduleTimer(); 
      srBtn.setText("PAUSE"); 
      isActivityRunning = true; 
     } 

    } 
}); 



holder.stopButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     timer.cancel(); 
     passedSeconds = 0; 
     timeV.setText("00 : 00 : 00"); 
     srBtn.setText("START"); 
     isActivityRunning = false; 
    } 
}); 
return row; 
} 




public void reScheduleTimer(){ 

timer = new Timer(); 
timerTask = new myTimerTask(); 
timer.schedule(timerTask, 0, 1000); 
} 


private class myTimerTask extends TimerTask { 
@Override 
public void run() { 
    // TODO Auto-generated method stub 
    passedSeconds++; 
    updateLabel.sendEmptyMessage(0); 
}  
} 


private Handler updateLabel = new Handler(){ 
@Override 
public void handleMessage(Message msg) { 
    // TODO Auto-generated method stub 
    //super.handleMessage(msg); 
    int seconds = passedSeconds % 60; 
    int minutes = (passedSeconds/60) % 60; 
    int hours = (passedSeconds/3600); 

    Log.v("Get tag while updating = "+labelTimer.getTag()+" ",""); 
    labelTimer.setText(String.format("%02d : %02d : %02d", hours, minutes, seconds)); 
} 
}; 

private static class ItemHolder { 
TextView nameView; 
TextView timerView; 
ImageView imageView; 
Button startButton; 
Button stopButton; 
} 

} 

누군가 구현 방법을 설명 할 수 있습니까? 아래에 주어진 답은 저에게 해결책을 제공하지 않습니다.

유사한 응용 프로그램에 대한 링크는 다음과 같습니다 https://play.google.com/store/apps/details?id=com.aloggers.atimeloggerapp&hl=en

답변

1

나는 적어도 몇 가지 방법을 참조하십시오. 귀하의 다공성에 달려 있습니다. 1) 어댑터에서 생성 된 모든 뷰에 액세스 할 수 있어야하는 컨트롤러를 생성하십시오. 소유자 (보기 태그에서 특정보기에 대한 코드 개체를 찾을 수있는 충분한 정보가 있어야 함). 또한 하나의 TimerTask를 호스팅합니다. rimer 태스크 콜백은 각 뷰 업데이트 서클에 대해 수행해야합니다. 2)이 메소드는 알림 데이터 세트가 변경된 표준 listView API를 사용했습니다.

+0

설명에 코드를 입력 해주세요. –

+0

죄송합니다. 샘플 애플리케이션을 작성할 시간이 없습니다. –

0

어댑터와 잘 작동하지 않기 때문에 메인 레이아웃에서 팽창하는 행을 사용하여 이렇게했습니다.

모든보기를 바인딩 한 후 처리기를 사용했습니다.

final Handler handler = new Handler(); 

private void getList() { 
    // arr_savedeal is my ArrayList 
    if (arr_savedeal != null) { 
     lnr_saved_deal.removeAllViews(); 

     for (int i = 0; i < 5; i++) { 
      // here i am inflating my rows in main layout using linear inflator, same like you did in getView() method of adapter 
      rowSavedDeal(arr_savedeal.get(i), i); 
     } 

     if (arr_savedeal.size() > 0) { 
      handler.postDelayed(updateTimerThread, 1000); // where 1000 is 1000ms , means its 1s. 
     } 
    } 
} 

private Runnable updateTimerThread = new Runnable() { 
    @Override 
    public void run() { 
     //Do something after 1 second, I am refreshing view here. 
     getList(); 
    } 
}; 

이 코드를 사용해보십시오. 희망이 당신을 도울 것입니다.

+0

이렇게하면 목록보기가 없으므로 몇 가지보기와 함께 사용할 수 있습니다. 2 ~ 3 개의 수직 화면이 있다면 접근 방법이 흐트러집니다. – TAC