Я работаю над android. Я хочу, чтобы в моем представлении списка отображалось содержимое по горизонтали, а не для заполнения всей ширины. Свойства wrap_content не работают. Что делать?
Android: wrap_content не работает с ListView
Ответ 1
Как Ромен Гай (Google Engineer работает над инструментарием пользовательского интерфейса) Сказал в своем посте
Установив ширину на wrap_content
, вы указываете, что ListView будет таким же широким, как и самый широкий из его дочерних элементов. Поэтому ListView должен измерять свои элементы и получать элементы, которые он должен вызвать getView() на адаптере. Это может происходить несколько раз в зависимости от количества пропусков макета, поведения родительского макета и т.д.
Итак, если вы установите ширину макета или высоту раскладки списка ListView в wrap_content
, ListView попытается измерить каждое прикрепленное к нему представление - это определенно не то, что вы хотите.
Имейте в виду: избегать установки wrap_content
для ListViews или GridViews в любое время, более подробно см. это Google I/O видео, рассказывающий о мире списка просмотров
Ответ 2
Чтобы достичь wrap_content
height в ListView
, нам нужно использовать CustomListView
, чтобы extends
наш родной ListView
.
MyListView.java
public class MyListView extends ListView {
private android.view.ViewGroup.LayoutParams params;
private int oldCount = 0;
public MyListView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas)
{
if (getCount() != oldCount)
{
int height = getChildAt(0).getHeight() + 1 ;
oldCount = getCount();
params = getLayoutParams();
params.height = getCount() * height;
setLayoutParams(params);
}
super.onDraw(canvas);
}
}
в вашем layout
используйте пользовательский вид, подобный этому,
layout.xml
<com.yourpackagename.MyListView
...
android:layout_width="match_parent"
android:layout_height="wrap_content"
... />
Ответ 3
I want my list view to wrap its content horizontally and not to fill all the width.
В случае просмотра списка вы не можете дать wrap_content, потому что если вы дадите wrap_content только для представления списка , будут показаны три первых элемента (строки), остальные будут игнорируется.. Поэтому не используйте wrap_content. Всегда используйте fill_parent или match_parent для просмотра списка
Для эффективного дизайна в представлении списка вы можете увидеть это World of ListView
Ответ 4
Он может быть реализован с помощью LinearLayout Создайте, как в этом примере
public class LinearLayoutAdapter {
LinearLayout linearLayout;
ArrayList<String> arrayList
private View rootView;
private static LayoutInflater inflater;
public ChoicesAdapter_(ArrayList<String> arrayList ,LinearLayout linearLayout)
{
this.index =index;
this.arrayList=arrayList;
this.linearLayout=linearLayout;
notifyDataSetChanged();
}
private void notifyDataSetChanged() {
linearLayout.removeAllViews();
for (int i =0;i<getCount();i++){
linearLayout.addView(getView(i,null,null));
}
}
public int getCount() {
return arrayList.size();
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(final int position, View convertView, ViewGroup parent) {
rootView = inflater.inflate(R.layout.row_list, null);
TextView textView = (TextView)rootView.findViewById(R.id.text);
textView.setText(arrayList.get(position));
return rootView;
}
Пример MainActivity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("Accent");
arrayList.add("Acclaim");
arrayList.add("Accord");
arrayList.add("Achieva");
arrayList.add("Aerio");
arrayList.add("Aerostar");
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.linearLayout);
linearLayoutAdapter= LinearLayoutAdapter(arrayList,linearLayout);
}
}
Пример XML
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:textColor="@color/dark_gray"
android:background="@color/white"
android:textSize="20dp"
android:text="" />