Подтвердить что ты не робот

Android: wrap_content не работает с ListView

Я работаю над android. Я хочу, чтобы в моем представлении списка отображалось содержимое по горизонтали, а не для заполнения всей ширины. Свойства wrap_content не работают. Что делать?

4b9b3361

Ответ 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=""  />