开发者

Android: Chronometer in ListView Row?

开发者 https://www.devze.com 2023-01-31 10:18 出处:网络
I got a row xml for my ListView with chronometer <LinearLayout android:layout_width=\"fill_parent\"

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消