Android: Chronometer in ListView Row?
I got a row xml for my ListView with chronometer
<LinearLayout android:layout_width="fill_parent"
android:id="@+id/layout_orders_list_row_ll_Timer"
android:focusable="false"
android:layout_height="wrap_content"
android:gravity="center_horizontal|right"
android:layout_gravity="center">
<Chronometer android:text="@+id/Chronometer01"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:id="@+id/layout_orders_list_row_chr_Timer"
android:focusable="false" android:focusableInTouchMode="false"
android:layout_gravity="center" android:enabled="true">
</Chronometer>
<Button android:background="@drawable/check" android:layout_height="wrap_content"
android:id="@+id/layout_orders_list_row_bt_Done"
android:layout_width="wrap_content" android:focusable="false" android开发者_StackOverflow中文版:onClick="OnRowButtonClick">
</Button>
and I want to start my chronometer for each row.I'm getting data from database and fill the adapter.After that I'm connecting to each chronometer and trying to calculate it.But it doesn't work.
SimpleAdapter simpleAdapter = new SimpleAdapter(this, fillMaps,
R.layout.orders_list_row, from, to);
listView.setAdapter(simpleAdapter);
for (int i = 0; i < simpleAdapter.getCount(); i++) {
LinearLayout vwParentRow = (LinearLayout) simpleAdapter.getView(i,
null, null);
LinearLayout ChildTop = (LinearLayout) vwParentRow.getChildAt(0);
LinearLayout ChildTop2 = (LinearLayout) ChildTop.getChildAt(1);
final Chronometer chrono = (Chronometer) ChildTop2.getChildAt(0);
chrono.setText("00:00:00");
chrono.setBase(SystemClock.elapsedRealtime());
chrono.start();
chrono.setOnChronometerTickListener(new OnChronometerTickListener() {
public void onChronometerTick(Chronometer arg0) {
// TODO Auto-generated method stub
long minutes = ((elapsedTime - chrono.getBase()) / 1000) / 60;
long seconds = ((elapsedTime - chrono.getBase()) / 1000) % 60;
currentTime = minutes + ":" + seconds;
arg0.setText(currentTime);
elapsedTime = elapsedTime + 1000;
}
});
}
listView.invalidate();
What I'm doing wrong? Maybe there is other solution how to start chronometer in each row?
To deal with this problem, I created my own adapter, since there is no standard valuable option which suits to solution.
public class SimpleAdapterWithCheckbox extends SimpleAdapter {
public SimpleAdapterWithCheckbox(Context context,
List<? extends Map<String, ?>> data, int resource, String[] from,
int[] to) {
super(context, data, resource, from, to);
}
// method getView start for each row in adapter to show it in ListView
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
startChrono(v);// starting for each row
return v;
}
private void startChrono(View v){
//Here we need to know structure of layout to get our element
LinearLayout vwParentRow = (LinearLayout)v;
LinearLayout ChildTop = (LinearLayout) vwParentRow.getChildAt(0);
LinearLayout ChildTop2 = (LinearLayout) ChildTop.getChildAt(1);
//Now, we get chronometer and could work with it as we wont
Chronometer chrono = (Chronometer) ChildTop2.getChildAt(0);
chrono.setBase(SystemClock.elapsedRealtime());
chrono.start();
}
}
This is not best case scenario, but works just fine for me.
精彩评论