Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 选择项目后在listview中绘制屏幕顶部的微调器下拉列表_Android_Listview_Spinner - Fatal编程技术网

Android 选择项目后在listview中绘制屏幕顶部的微调器下拉列表

Android 选择项目后在listview中绘制屏幕顶部的微调器下拉列表,android,listview,spinner,Android,Listview,Spinner,我想知道为什么ListView的布局\u height=“wrap\u content”会弄乱列表末尾的微调器。我在下面用了不同的方法来修复它。我希望有人能解释一下我的行为,或者指出我在绘制视图/ui事件方面缺乏哪些android知识 1) 从视觉上可以看到问题 2) 更改ListItem属性后 android:descendantFocusability="afterDescendants" 我的行为有所改善,但仍有一些事情发生。似乎列表中的项目没有接收到事件,所以属性更改对我来说是有意义的

我想知道为什么ListView的布局\u height=“wrap\u content”会弄乱列表末尾的微调器。我在下面用了不同的方法来修复它。我希望有人能解释一下我的行为,或者指出我在绘制视图/ui事件方面缺乏哪些android知识

1) 从视觉上可以看到问题

2) 更改ListItem属性后

android:descendantFocusability="afterDescendants"
我的行为有所改善,但仍有一些事情发生。似乎列表中的项目没有接收到事件,所以属性更改对我来说是有意义的。 更新该属性后微调器的行为。 除了我实际选择了一个项目外,其他都可以正常工作

3) 设置ListView的布局\u height=“match\u parent”后,在选择项目后,问题似乎消失了。为了那个视频

活动:

public class SelectorActivity extends Activity {

public static final String TAG = SelectorActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(TAG, "onCreate");
    setContentView(R.layout.activity_selector);

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    ListView contents = (ListView) findViewById(R.id.list_view);    
    contents.addHeaderView(new TestView(this));
    contents.addFooterView(new View(this));
    SimpleBaseAdapter listAdapter = new SimpleBaseAdapter(this);

    // LOW RANGE
    LinearLayout lowRange = (LinearLayout) inflater.inflate(R.layout.list_item_edit, null);
    TextView lowRangeText = (TextView) lowRange.findViewById(R.id.text);
    EditText lowRangeEditText = (EditText) lowRange.findViewById(android.R.id.edit);
    // HIGH RANGE
    LinearLayout highRange = (LinearLayout) inflater.inflate(R.layout.list_item_edit, null);
    TextView highRangeText = (TextView) highRange.findViewById(R.id.text);
    EditText highRangeEditText = (EditText) highRange.findViewById(android.R.id.edit);
    // UNITS
    LinearLayout units = (LinearLayout) inflater.inflate(R.layout.list_item_units, null);
    TextView unitsText = (TextView) units.findViewById(android.R.id.text1);

    // SPINNERS
    LinearLayout spinners = (LinearLayout) inflater.inflate(R.layout.list_item_spinners, null);

    Spinner spinner1 = (Spinner) spinners.findViewById(R.id.spinner1);
    Spinner spinner2 = (Spinner) spinners.findViewById(R.id.spinner2);
    Spinner spinner3 = (Spinner) spinners.findViewById(R.id.spinner3);
    DebugAdapterViewListeners.set(spinner1, "spinner1");

    // VIEW SETUP
    lowRangeText.setText("text1");
    highRangeText.setText("text2");
    unitsText.setText("text3");
    // SPINNER SETUP
    String[] massUnits1 = new String[]{"one","two"};
    String[] massUnits2 = new String[]{"three","four"};
    String[] timeUnits = new String[]{"five","six"};

    ArrayAdapter<String> adapt1 = new ArrayAdapter<String>(this, R.layout.spinner_list_item_centered);
    ArrayAdapter<String> adapt2 = new ArrayAdapter<String>(this, R.layout.spinner_list_item_centered);
    ArrayAdapter<String> adapt3 = new ArrayAdapter<String>(this, R.layout.spinner_list_item_centered);
    adapt1.addAll(massUnits1);
    adapt2.addAll(massUnits2);
    adapt3.addAll(timeUnits);
    spinner1.setAdapter(adapt1);
    spinner2.setAdapter(adapt2);
    spinner3.setAdapter(adapt3);

    listAdapter.addView(lowRange);
    listAdapter.addView(highRange);
    listAdapter.addView(units);
    listAdapter.addView(spinners);

    contents.setAdapter(listAdapter);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.selector, menu);
    return false;
}


}
公共类选择器活动扩展活动{
public static final String TAG=SelectorActivity.class.getSimpleName();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.v(标记为“onCreate”);
setContentView(R.layout.activity_选择器);
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
ListView内容=(ListView)findViewById(R.id.list\u视图);
addHeaderView(新测试视图(this));
contents.addFooterView(新视图(此));
SimpleBaseAdapter listAdapter=新的SimpleBaseAdapter(此);
//低档
LinearLayout Low Range=(LinearLayout)充气器充气(R.layout.list\u item\u edit,null);
TextView lowRangeText=(TextView)lowRange.findViewById(R.id.text);
EditText lowRangeEditText=(EditText)lowRange.findViewById(android.R.id.edit);
//高射程
LinearLayout highRange=(LinearLayout)充气器充气(R.layout.list\u item\u edit,null);
TextView highRangeText=(TextView)highRange.findViewById(R.id.text);
EditText highRangeEditText=(EditText)highRange.findViewById(android.R.id.edit);
//单位
LinearLayout units=(LinearLayout)充气器充气(R.layout.list\u item\u units,空);
TextView unitsText=(TextView)units.findViewById(android.R.id.text1);
//纺纱机
LinearLayout微调器=(LinearLayout)充气器。充气(R.layout.list\u item\u微调器,null);
Spinner spinner1=(Spinner)spinners.findViewById(R.id.spinner1);
Spinner spinner2=(Spinner)spinners.findViewById(R.id.spinner2);
Spinner spinner3=(Spinner)spinners.findViewById(R.id.spinner3);
DebugAdapterViewListeners.set(喷丝头1,“喷丝头1”);
//视图设置
lowRangeText.setText(“text1”);
setText(“text2”);
unitsText.setText(“文本3”);
//微调器设置
字符串[]massUnits1=新字符串[]{“一”,“二”};
字符串[]massUnits2=新字符串[]{“三”,“四”};
字符串[]时间单位=新字符串[]{“五”,“六”};
ArrayAdapter Adapter 1=新的ArrayAdapter(此,R.layout.spinner\u列表\u项目\u居中);
ArrayAdapter Adapter 2=新的ArrayAdapter(此,R.layout.spinner\u列表\u项目\u居中);
ArrayAdapter Adapter 3=新的ArrayAdapter(此,R.layout.spinner\u列表\u项目\u居中);
自适应1.添加所有(质量单位1);
addAll(质量单位2);
ADADALL(时间单位);
喷丝头1.设置适配器(适配器1);
喷丝头2.设置适配器(适配器2);
喷丝头3.设置适配器(适配器3);
listAdapter.addView(低范围);
listAdapter.addView(高范围);
listAdapter.addView(单位);
addView(微调器);
contents.setAdapter(listAdapter);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单选择器,菜单);
返回false;
}
}
以下是SimpleBaseAdapter类:

public class SimpleBaseAdapter extends BaseAdapter {

private ArrayList<View> views;
private Context context;

public SimpleBaseAdapter(Context context) {
    this.context = context;
    this.views = new ArrayList<View>();
}

public void addView(View view) {
    this.views.add(view);
}

@Override
public int getCount() {
    return views.size();
}

@Override
public Object getItem(int position) {
    View view = views.get(position);
    if (view instanceof AbsListView) {
        return ((AbsListView)view).getItemAtPosition(position);
    } else if (view instanceof AbsSpinner) {
        return ((AbsSpinner)view).getItemAtPosition(position);
    }  else {
        return null;
    }
}

@Override
public long getItemId(int position) {
    View view = views.get(position);
    if (view instanceof AbsListView) {
        return ((AbsListView)view).getItemIdAtPosition(position);
    } else if (view instanceof AbsSpinner) {
        return ((AbsSpinner)view).getItemIdAtPosition(position);
    }  else {
        return 0;
    }
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    return views.get(position);
}

}
公共类SimpleBaseAdapter扩展BaseAdapter{
私人ArrayList观点;
私人语境;
公共SimpleBaseAdapter(上下文){
this.context=上下文;
this.views=new ArrayList();
}
公共无效添加视图(视图){
this.views.add(视图);
}
@凌驾
public int getCount(){
返回视图。size();
}
@凌驾
公共对象getItem(int位置){
视图=视图。获取(位置);
if(查看AbsListView的实例){
return((AbsListView)视图).getItemAtPosition(位置);
}else if(查看AbsSpinner的实例){
返回((AbsSpinner)视图);
}否则{
返回null;
}
}
@凌驾
公共长getItemId(int位置){
视图=视图。获取(位置);
if(查看AbsListView的实例){
return((AbsListView)视图).getItemIDataPosition(位置);
}else if(查看AbsSpinner的实例){
返回((AbsSpinner)视图);
}否则{
返回0;
}
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
返回视图。获取(位置);
}
}
活动布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/green_1"
    android:orientation="vertical"
    >
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:headerDividersEnabled="true"
        android:footerDividersEnabled="true"        
        android:dividerHeight="0.5sp"
        android:divider="@color/black"
        android:clipToPadding="false"
        android:layout_marginTop="18sp"
        android:layout_marginBottom="18sp"
          />
</LinearLayout>

编辑列表项布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:padding="@dimen/row_padding"
        android:background="@android:color/white"
    >
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text"
            android:layout_weight="50"
        android:gravity="top"
        android:textSize="@dimen/font_size_standard"
      android:textColor="@drawable/selector_row_item_detail_text"
      />
    <EditText
            android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:id="@android:id/edit"
        android:layout_weight="50"
        android:inputType="number"
        android:gravity="right"
        />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/spinner_container"
        android:orientation="horizontal"
        android:background="@android:color/white"
        android:paddingTop="@dimen/header_row_padding_vertical"


        >
            <Spinner
              android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="33"
                android:id="@+id/spinner1"
                android:gravity="center"
                android:spinnerMode="dropdown"
                />
            <Spinner
              android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="33"
                android:id="@+id/spinner2"
                android:gravity="center"
                android:spinnerMode="dialog"
                />
            <Spinner
              android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="33"
                android:id="@+id/spinner3"
                android:gravity="center"
                android:spinnerMode="dialog"
                />
        </LinearLayout>

微调器行项目布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" 
    android:padding="@dimen/row_padding"
        android:background="@android:color/white"
    >
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text"
            android:layout_weight="50"
        android:gravity="top"
        android:textSize="@dimen/font_size_standard"
      android:textColor="@drawable/selector_row_item_detail_text"
      />
    <EditText
            android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:id="@android:id/edit"
        android:layout_weight="50"
        android:inputType="number"
        android:gravity="right"
        />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/spinner_container"
        android:orientation="horizontal"
        android:background="@android:color/white"
        android:paddingTop="@dimen/header_row_padding_vertical"


        >
            <Spinner
              android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="33"
                android:id="@+id/spinner1"
                android:gravity="center"
                android:spinnerMode="dropdown"
                />
            <Spinner
              android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="33"
                android:id="@+id/spinner2"
                android:gravity="center"
                android:spinnerMode="dialog"
                />
            <Spinner
              android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="33"
                android:id="@+id/spinner3"
                android:gravity="center"
                android:spinnerMode="dialog"
                />
        </LinearLayout>

您应该扩展SpinnerAdapter而不是BaseAdapter。它有getDropdownView()和getView(),我相信它本身可以处理一些特殊情况。我正在android 4.2上以类似的布局扩展这个适配器,我看不出您有什么问题


我猜getDropdownView()处理将视图附加到根目录的方式的不同会导致这种差异,但我没有研究代码来检查这一点。您面临的问题是微调器的基本行为,因此需要修改微调器。这是微调器的代码,其初始ie。默认情况下,可视化为“选择项”(如果.xml中声明的提示类似于
android:prompt=“@string/Select Item”
)&下拉视图的大小与原始微调器相同。这种改进的微调器的局限性在于它不会
public class SelectorActivity extends Activity {

public static final String TAG = SelectorActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate");
setContentView(R.layout.activity_selector);

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

ListView contents = (ListView) findViewById(R.id.list_view);    
contents.addHeaderView(new TestView(this));
contents.addFooterView(new View(this));
SimpleBaseAdapter listAdapter = new SimpleBaseAdapter(this);

// LOW RANGE
LinearLayout lowRange = (LinearLayout) inflater.inflate(R.layout.list_item_edit, null);
TextView lowRangeText = (TextView) lowRange.findViewById(R.id.text);
EditText lowRangeEditText = (EditText) lowRange.findViewById(android.R.id.edit);
// HIGH RANGE
LinearLayout highRange = (LinearLayout) inflater.inflate(R.layout.list_item_edit, null);
TextView highRangeText = (TextView) highRange.findViewById(R.id.text);
EditText highRangeEditText = (EditText) highRange.findViewById(android.R.id.edit);
// UNITS
LinearLayout units = (LinearLayout) inflater.inflate(R.layout.list_item_units, null);
TextView unitsText = (TextView) units.findViewById(android.R.id.text1);

// SPINNERS
LinearLayout spinners = (LinearLayout) inflater.inflate(R.layout.list_item_spinners, null);

NoDefaultSpinner spinner1 = (NoDefaultSpinner) spinners.findViewById(R.id.spinner1);
NoDefaultSpinner spinner2 = (NoDefaultSpinner) spinners.findViewById(R.id.spinner2);
NoDefaultSpinner spinner3 = (NoDefaultSpinner) spinners.findViewById(R.id.spinner3);
DebugAdapterViewListeners.set(spinner1, "spinner1");

// VIEW SETUP
lowRangeText.setText("text1");
highRangeText.setText("text2");
unitsText.setText("text3");
// SPINNER SETUP
String[] massUnits1 = new String[]{"one","two"};
String[] massUnits2 = new String[]{"three","four"};
String[] timeUnits = new String[]{"five","six"};

ArrayAdapter<String> adapt1 = new ArrayAdapter<String>(this, R.layout.spinner_list_item_centered);
ArrayAdapter<String> adapt2 = new ArrayAdapter<String>(this, R.layout.spinner_list_item_centered);
ArrayAdapter<String> adapt3 = new ArrayAdapter<String>(this, R.layout.spinner_list_item_centered);
adapt1.addAll(massUnits1);
adapt2.addAll(massUnits2);
adapt3.addAll(timeUnits);
spinner1.setAdapter(adapt1);
spinner2.setAdapter(adapt2);
spinner3.setAdapter(adapt3);

listAdapter.addView(lowRange);
listAdapter.addView(highRange);
listAdapter.addView(units);
listAdapter.addView(spinners);

contents.setAdapter(listAdapter);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.selector, menu);
return false;
}