I have simple ListView with ArrayAdapter which is working just fine. The problems start with RTL language (Arabic in this case).
When you open it for the first time, everything looks ok:
But after scrolling down and back up, some items appears to be rendered incorrectly:
The code is straightforward. Note that if I do not REUSE view and instead inflate it unconditionally every time (see the commented line below), the issue is GONE. But this is obviously not right, I want to REUSE items for better performance and smooth scrolling.
Please also note that I have multiple ListView
s in the app, and all of them shows this kind of incorrect rendering in Arabic. For this question I picked up the simplest case when I just set text and icon for every list item.
Please advice. The portion of code of my implementation of ArrayAdapter
:
public class PagesListAdapter extends ArrayAdapter<IPageRef> {
...
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
final IPageRef b = getItem(position);
View row = convertView == null ? mInflater.inflate(R.layout.lang_item, parent, false) : convertView;
//View row = mInflater.inflate(R.layout.wordlist_item, parent, false);
TextView title = row.findViewById(R.id.title);
ImageView img = row.findViewById(R.id.img);
... // (setting the title & img properties)
return row;
}
}
lang_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="horizontal" >
<ImageView
android:id="@+id/img"
android:layout_marginBottom="5dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_width="50dp"
android:layout_height="38dp"
android:padding="1dp"
/>
<TextView
android:id="@+id/title"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:textSize="25sp" >
</TextView>
</LinearLayout>
In this case, the icon’s position should be flipped in the RTL layout. Some form inputs should remain left-aligned in RTL — for example, email and mobile-number inputs. It's worth noting that if the placeholder content is in Arabic or other RTL language, then the placeholder should be aligned to the right.
The system chooses an image named file.layoutdir-rtl.png when the app runtime language (see Understand user profile languages and app manifest languages) is set to an RTL language. This approach may be necessary when some part of the image is flipped, but another part isn't.
Over 292 million people around the world speak Arabic as their first language. Arabic (al-Arabiyyah, pronounced /al ʕarabijja/, /ʕarabiː/) is my native language, and I sometimes build websites that need to support both left-to-right (LTR) and right-to-left (RTL) styles. The default page direction in CSS is LTR.
For a tabs component in LTR, the icons would be to the left of the label. In RTL, these should be flipped. For a horizontal card, the order of the image and the text should be flipped in RTL.
change your layout to:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingBottom="5dp"
android:paddingTop="5dp">
<ImageView
android:id="@+id/img"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:layout_width="50dp"
android:layout_height="38dp"
android:padding="1dp"
/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/img"
android:textSize="25sp" />
</RelativeLayout>
To support RTL alignment you first need to add android:supportsRtl="true"
to the <application>
element in your manifest file.
Major thing:-
Or you can just do for all layouts using Android Studio > Refactor > Add RTL
support where possible…
For more references on RTL follow this article for drawables as well here It will surely solve your problem using each step.
Try manually setting the direction based on configuration (that is quite reliably updated based on device language) by adding rowView.setLayoutDirection(getContext().getResources().getConfiguration().getLayoutDirection());
in the getView of your ListAdapter.
From: ListView's first entry always incorrect for RTL
This solved my problem that was similar to your.
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