I want background of a list item to work like a progress bar. For example, like in tTorrent file list:
This is how it is done now: I use a relativelayout and two linearlyouts. One has textviews and another has two views which work as progressbar. "Progress" is changed using weight of the views, which is set dynamically in getView method. Then linearlayout with textviews is brought on the front. Here's the code:
Layout:
<LinearLayout
android:padding="5dp"
android:id="@+id/catStatsRowLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<!-- textviews on the front -->
...
</LinearLayout>
<!-- views which work as progress bar -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignBottom="@id/catStatsRowLay"
android:layout_alignLeft="@id/catStatsRowLay"
android:layout_alignRight="@id/catStatsRowLay"
android:layout_alignTop="@id/catStatsRowLay"
android:layout_below="@id/catStatsRowLay"
android:layoutDirection="rtl"
android:orientation="horizontal" >
<View
android:id="@+id/catStatsRowBar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".70"
android:background="#cc550000" />
<View
android:id="@+id/catStatsRowBar2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".30"
android:background="@android:color/transparent" />
</LinearLayout>
</RelativeLayout>
And getView method:
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.categories_stats_list_row,
parent, false);
//filling textviews
...
//getting bars that work as progressbar
View bar = (View) rowView.findViewById(R.id.catStatsRowBar);
View bar2 = (View) rowView.findViewById(R.id.catStatsRowBar2);
//calculating and setting weights
float percent = cs.getBarWeight();
LinearLayout.LayoutParams barPar = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT, (1-percent));
LinearLayout.LayoutParams bar2Par = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, percent);
bar.setLayoutParams(barPar);
bar2.setLayoutParams(bar2Par);
bar.setBackgroundColor(cs.getColor(position));
//bringing LinearLayout with textviews to front
LinearLayout ll = (LinearLayout) rowView
.findViewById(R.id.catStatsRowLay);
ll.bringToFront();
return rowView;
}
It perfectly works on 4.2.2 and lower devices (screenshot below).
The problem: 4.3 and higher (both emulators and devices) do not show "progress" views. I tried not bringing linearlayout with textviews to the front, setting weights to constants, changing linearlayout's aligments - no result, "progress" views are not shown. How can I make it work on new versions of android?
Solution was easy.
After replacing RelativeLayout on FrameLayout everything seems to work properly now, both devices and emulators 4.3+
Code for getView method is the same, except for bringing LinearLayout with textviews to front - there is no need for it now.
Code for layout:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"
android:orientation="horizontal" >
<View
android:id="@+id/catStatsRowBar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".70"
android:background="#cc550000" />
<View
android:id="@+id/catStatsRowBar2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".30"
android:background="@android:color/transparent" />
</LinearLayout>
<LinearLayout
android:padding="5dp"
android:id="@+id/catStatsRowLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<!-- textviews on the front -->
</LinearLayout>
</FrameLayout>
For some reason, relativelayout works in a different way on 4.3+, I still dont know why exactly.
Thanks to Gabor from ttorrent team that showed me the right way.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With