Java 使用位置0多次调用适配器getView

Java 使用位置0多次调用适配器getView,java,android,Java,Android,我在从动态布局渲染ListView时遇到一些问题。我不知道为什么只使用位置0调用getView,并且多次调用 我在网上和stackoverflow上搜索,但找不到合适的答案 实际上,我正在尝试做一个演示: 值得注意的是,我的主布局文件被滚动条包围 主活动布局文件: <ListView android:id="@+id/city_list" android:layout_width="fill_parent" android:layou

我在从动态布局渲染ListView时遇到一些问题。我不知道为什么只使用位置0调用
getView
,并且多次调用

我在网上和stackoverflow上搜索,但找不到合适的答案

实际上,我正在尝试做一个演示:

值得注意的是,我的主布局文件被滚动条包围

主活动布局文件:

    <ListView
        android:id="@+id/city_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/questionsList"
        android:paddingTop="20sp" >
    </ListView>
主要活动代码snipps:

    List listCity= new ArrayList();

    listCity.add(new City("London","http://en.wikipedia.org/wiki/London","london"));
    listCity.add(new City("Rome","http://en.wikipedia.org/wiki/Rome","rome"));
    listCity.add(new City("Paris","http://en.wikipedia.org/wiki/Paris","paris"));

    ListView listViewCity = ( ListView ) findViewById( R.id.city_list);

    listViewCity.setAdapter( new CityListAdapter(this, R.layout.layout_city, listCity     ) );

试试这种方法,希望这能帮助你解决问题。

public class CityListAdapter extends BaseAdapter{
    private Context context;
    private List objects;

    public CityListAdapter ( Context context, int resourceId, List objects) {
        this.context=context;
        this.objects=objects;

    }

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

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public Object getItem(int position) {
        return objects.get(position);
    }

    @Override
    public View getView ( int position, View convertView, ViewGroup parent ) {
        ViewHolder holder;

        if(convertView==null){
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.layout_city,null);
            holder.txtName = (TextView) convertView.findViewById(R.id.cityName);
            holder.txtWiki = (TextView) convertView.findViewById(R.id.cityLinkWiki);
            holder.imageCity = (ImageView) convertView.findViewById(R.id.ImageCity);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        holder.txtName.setText(((City)getItem(position)).getName());
        holder.txtWiki.setText(((City)getItem(position)).getUrlWiki());

        return convertView;
    }

    class ViewHolder{
        TextView txtName;
        TextView txtWiki;
        ImageView imageCity;
    }
}

使用
ViewHolder
图案可获得更好的性能

将getView更改为

    @Override
    public View getView ( int position, View convertView, ViewGroup parent ) {

        ViewHolder holder;
        if(convertView == null)
        {

        convertView = ( RelativeLayout ) inflater.inflate( resource, parent, false );
        holder = new ViewHolder();
        holder.txtName = (TextView) convertView.findViewById(R.id.cityName);  
        holder.txtWiki = (TextView) convertView.findViewById(R.id.cityLinkWiki);  
        holder.imageCity = (ImageView) convertView.findViewById(R.id.ImageCity);
        convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag(); 
        } 

        City city = (City)getItem( position );

        holder.txtName.setText(city.getName());
        holder.txtWiki.setText(city.getUrlWiki());

        return convertView;
    }
ListView回收视图的资源。你可能还想读书


尝试将布局充气机设置为 LayoutInflater充气器=(LayoutInflater)context.getSystemService (上下文、布局、充气机和服务);
这可能行得通

好的,我通过尽可能扩展ListView解决了这个问题。意思是说,给一个动态的全高,使所有项目变得可见

我遵循以下解决方案:


我遇到了同样的问题。我的列表视图基本上正常工作,但是有一系列的操作会使某些项目消失。之后单击它们会导致NullPointerException

以下是重现错误的步骤:

  • 将项目拖到顶部
  • 向上或向下拖动另一项
  • 顶部的项目将消失
  • 向上或向下拖动另一项
  • 顶部项目将重新出现
  • 如果转到步骤2,行为将继续
  • 调试之后,我发现我的StabyRayAdvult.GETVIEW()方法被调用了两次,只针对列表顶部的空白项。


    为了解决这个问题,根据masum7的回答,我将DynamicListView的布局高度设置为“包裹内容”。

    使用ViewHolder模式。使用
    充气器。充气(资源、父项、false)
    值得注意的是,我的主布局文件被滚动条包围。
    ?什么意思?那就展示给大家看,读一下@Raghunandan我试过这个。。现在getView只被调用了一次,但应该用不同的位置调用三次Hi-mate我试过了。。但仍然面临同样的问题。我在getView中放置了一个Log.v。似乎使用0 09-11 02:40:13.006 2508-2508/V/test调用getView﹕ #0 09-11 02:40:13.063 2508-2508/V/测试﹕ #0 09-11 02:40:13.066 2508-2508/V/测试﹕ #0 09-11 02:40:13.068 2508-2508/V/测试﹕ #0 09-11 02:40:13.070 2508-2508/V/测试﹕ #0@masum7它应该会起作用。永远不要把listview放在scrollview中。我有什么替代方法?而不是ListView?我必须有一个scrollview@masum7您可以将视图作为页眉和页脚添加到listview。ListView将自动滚动。所以千万不要把listview放在ScorlView里面实际上我的主要活动布局有很多输入,它需要ScrollView我也有同样的问题。在我的例子中,我将ListView和一些额外的组件放在ScrollView中,并设置ScrollView包装内容
    public class CityListAdapter extends BaseAdapter{
        private Context context;
        private List objects;
    
        public CityListAdapter ( Context context, int resourceId, List objects) {
            this.context=context;
            this.objects=objects;
    
        }
    
        @Override
        public int getCount() {
            return objects.size();
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public Object getItem(int position) {
            return objects.get(position);
        }
    
        @Override
        public View getView ( int position, View convertView, ViewGroup parent ) {
            ViewHolder holder;
    
            if(convertView==null){
                holder = new ViewHolder();
                convertView = LayoutInflater.from(context).inflate(R.layout.layout_city,null);
                holder.txtName = (TextView) convertView.findViewById(R.id.cityName);
                holder.txtWiki = (TextView) convertView.findViewById(R.id.cityLinkWiki);
                holder.imageCity = (ImageView) convertView.findViewById(R.id.ImageCity);
                convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag();
            }
    
            holder.txtName.setText(((City)getItem(position)).getName());
            holder.txtWiki.setText(((City)getItem(position)).getUrlWiki());
    
            return convertView;
        }
    
        class ViewHolder{
            TextView txtName;
            TextView txtWiki;
            ImageView imageCity;
        }
    }
    
    static class ViewHolder
    {
         TextView txtName,txtWiki;
         ImageView imageCity; 
    }
    
        @Override
        public View getView ( int position, View convertView, ViewGroup parent ) {
    
            ViewHolder holder;
            if(convertView == null)
            {
    
            convertView = ( RelativeLayout ) inflater.inflate( resource, parent, false );
            holder = new ViewHolder();
            holder.txtName = (TextView) convertView.findViewById(R.id.cityName);  
            holder.txtWiki = (TextView) convertView.findViewById(R.id.cityLinkWiki);  
            holder.imageCity = (ImageView) convertView.findViewById(R.id.ImageCity);
            convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag(); 
            } 
    
            City city = (City)getItem( position );
    
            holder.txtName.setText(city.getName());
            holder.txtWiki.setText(city.getUrlWiki());
    
            return convertView;
        }