2017-01-02 6 views
0

ハンドラを使用して毎秒00:00:00から開始するタイマーでtextViewを更新しようとしています。私はカスタムアダプターも扱っています。したがって、各行には、タイマーのtextView、startおよびstopボタンがあります。同じ行のtimerTextViewを更新しようとしましたが、listViewの最後の行のtextViewを更新しました。誰も私に、カスタムアダプタを使用して同じ行のTextView(毎秒更新するTimer TextView)を更新する方法を教えてもらえますか?

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)アダプタで作成されたすべてのビューにアクセスできるコントローラを作成します。 (ビューTAGには、特定のビューのコーデルオブジェクトを見つけるのに十分な情報が必要です)。また、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

関連する問題