Android 不更改ListView中的元素将冻结

Android 不更改ListView中的元素将冻结,android,android-layout,android-listview,Android,Android Layout,Android Listview,我的ListView有问题。ListView的第一个元素是一个不变的视图。其他元素是在getView方法中自动创建的。问题是,第一个元素有时会冻结,其中的进度条不再转动。只有向下滚动然后再向上滚动到第一个元素时,才会发生这种情况。你知道我怎样才能解决那个问题吗 以下代码缩短,仅包含相关部分: ListView适配器: public class MyAdapter extends ArrayAdapter<String>{ private View main_control; pub

我的ListView有问题。ListView的第一个元素是一个不变的视图。其他元素是在getView方法中自动创建的。问题是,第一个元素有时会冻结,其中的进度条不再转动。只有向下滚动然后再向上滚动到第一个元素时,才会发生这种情况。你知道我怎样才能解决那个问题吗

以下代码缩短,仅包含相关部分:

ListView适配器:

public class MyAdapter extends ArrayAdapter<String>{
private View main_control;

public PictureShowAdapter(Context context, ArrayList<String> URLs){
    super(context, R.layout.picture_show_items, URLs);

    LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    main_control = li.inflate(R.layout.main, null, false);
}

public View getView(final int position, View arg1, ViewGroup parent) {
    if(position == 0){
        return main_control;
    } else{
        //...create and return other items
    }
}
公共类MyAdapter扩展了ArrayAdapter{
私有视图主控;
公共PictureShowAdapter(上下文、ArrayList URL){
超级(上下文、R.layout.picture\u show\u项目、URL);
LayoutInflater li=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
主控制=li.充气(R.layout.main,空,假);
}
公共视图getView(最终整数位置,视图arg1,视图组父视图){
如果(位置==0){
返回主控制;
}否则{
//…创建并返回其他项目
}
}
}

布局main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#dddddd" >
<LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">      
    <ProgressBar
        android:id="@+id/progressBar2"
        style="?android:attr/progressBarStyleInverse"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:visibility="gone" />
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="20dp"
        android:text=""
        android:visibility="gone" />
</LinearLayout>
<EditText
    android:id="@+id/editText1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:hint="@string/mainActivity_textView_Hint"
    android:singleLine="true"
    android:inputType="textUri"
    android:imeOptions="actionGo"
    android:text="" >
</EditText>
<Button
    android:id="@+id/button1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="onClickDownload"
    android:text="@string/mainActivity_button" />


也许您应该使用ListView标题,而不是创建或修改适配器来处理此组件的更改(因为您想要的元素更改了列表中的第一个元素?)

我怀疑适配器中的逻辑导致了一些长时间运行的操作,从而导致了您的问题

总之,创建顶部单元格元素作为标题,而不是使用apapter


Linky:

如果删除第一个元素的特殊处理,问题是否会消失?还有,为什么不使用“returnthis.main_control;”?什么是PictureShowActivity?PictureShowActivity.main\u控件具有什么值?我没看到它被初始化我很抱歉我把它缩短错了。我编辑了它以更正它。特殊处理意味着什么?您的
else
块重用视图是作为
arg1
传递的还是进一步传递给
super.getView
?否它总是膨胀一个新视图并返回它。我将在其余部分正常工作时实现ViewHolder模式。我还打算建议使用ViewHolder(但不想破坏答案)。这是一个必要的模式。谢谢你的回答。我尝试了你的解决方案,但问题仍然存在。那时你一定有什么东西阻塞了UI。你还有别的错误没有表现出来。我100%确信这是在列表顶部创建静态元素的正确解决方案。但是UI线程不能被阻止,因为ListView本身仍在正常滚动。对于这个特定的视图可能有不同的线程吗?