gpt4 book ai didi

android - ListView 的 Layout_width

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:48:05 27 4
gpt4 key购买 nike

好的,我遇到了 listView 的属性 layout_width 的问题。

在我的项目中,我的 ListView 有一个不适合屏幕宽度的背景图像。因此,我将 layout_width 设置为 wrap_content,并将 listView 水平居中。

这似乎是个坏主意,因为在适配器中,调用 GetView 方法的次数超过显示单元格数的 3 倍。如果我在 fill_parent 上设置 layout_width,问题就解决了。我创建了一个显示问题的简单项目。

这是 Activity 的 xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
</RelativeLayout>

item_list xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>

最后是 Activity :

package fr.example.android.listviewbug;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class ExampleListViewBugActivity extends ListActivity{
public static int cpt;

public static final String[] COUNTRIES = new String[] {
"Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
"Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
"Armenia", "Aruba", "Australia", "Austria", "Azerbaijan",
"Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium",
"Belize", "Benin", "Bermuda", "Bhutan", "Bolivia",
"Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory",
"British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi",
"Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde",
"Cayman Islands", "Central African Republic", "Chad", "Chile"};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

cpt = 0;
setListAdapter(new CustomArrayAdapter(this, R.layout.list_item, COUNTRIES));
}

@Override
public void onDestroy() {
super.onDestroy();
Log.d("AdapterTest", "onDestroy()");
}

private class CustomArrayAdapter extends ArrayAdapter<String>{
public CustomArrayAdapter(Context context, int textViewResourceId, String[] countries) {
super(context, textViewResourceId, countries);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("AdapterTest", " cpt:"+ ++cpt);
return super.getView(position, convertView, parent);
}
}
}

所以我的解决方案是简单地在 fill_parent 上设置 layout_width,并修改 listview 背景的图像以添加一些透明边框以适合屏幕尺寸。

但我想知道为什么这个问题会出现在 ListView 上的 wrap_content 中,如果它是一个已知问题,为什么它不在文档中......

最佳答案

通过将宽度设置为“wrap_content”,您是在告诉 ListView 与其最宽的子项一样宽。因此,ListView 必须测量其项目并获取它必须调用 Adapter 上的 getView() 的项目。这可能会发生多次,具体取决于布局遍数、父布局的行为等。

请记住,无法保证在适配器上调用 getView() 的次数,也无法保证调用发生的顺序。因此,您必须尽可能高效地实现 getView()。底线是,这不是问题,这是这种情况下的预期行为。

关于android - ListView 的 Layout_width,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4270278/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com