Java Android ListView显示错误的位置

Java Android ListView显示错误的位置,java,android,xml,listview,Java,Android,Xml,Listview,我对列表视图有问题。下面是适配器的代码: public class AdapterListViewEncyclopedia extends ArrayAdapter<Apple> { private int layoutResourceId; private Context context; private List<Apple> data; private CellHolder holder; public AdapterLi

我对
列表视图有问题。下面是适配器的代码:

public class AdapterListViewEncyclopedia extends ArrayAdapter<Apple> {

    private int layoutResourceId;
    private Context context;
    private List<Apple> data;
    private CellHolder holder;

    public AdapterListViewEncyclopedia(Context context, int layoutResourceId, List<Apple> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }


    static class CellHolder
    {
        ImageView imageApple;
        TextView tvCellAppleName;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View row = convertView;

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new CellHolder();
            holder.imageApple = (ImageView) row.findViewById(R.id.imageApple);
            holder.tvCellAppleName = (TextView)row.findViewById(R.id.tvAppleName);

            ImageLoader imageLoader = ImageLoader.getInstance();
            imageLoader.displayImage(InterfaceConfig.serverURL+data.get(position).getImageURL(), holder.imageApple);


            holder.tvCellAppleName.setText(data.get(position).getName());
            System.out.println(position);
            row.setTag(holder);
        }
        else
        {
            holder = (CellHolder)row.getTag();
        }

        return row;
    }

}
公共类适配器列表百科全书扩展了ArrayAdapter{
私人内部布局资源;
私人语境;
私人名单数据;
私人手机持有者;
公共适配器列表百科全书(上下文上下文、内部布局资源ID、列表数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
静态类信元保持器
{
ImageView imageApple;
文本视图tvCellAppleName;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图行=转换视图;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新的CellHolder();
holder.imageApple=(ImageView)row.findViewById(R.id.imageApple);
holder.tvCellAppleName=(TextView)row.findViewById(R.id.tvAppleName);
ImageLoader ImageLoader=ImageLoader.getInstance();
imageLoader.displayImage(InterfaceConfig.serverURL+data.get(position.getImageURL(),holder.imageApple);
holder.tvCellAppleName.setText(data.get(position.getName());
系统输出打印项次(位置);
row.setTag(支架);
}
其他的
{
holder=(CellHolder)行。getTag();
}
返回行;
}
}
主要问题:

1.我在
ArrayAdapter
中有10个数据,当我用
ListView
打开页面,用
System.out.println
打印位置代码时,代码显示为0,1,2,3,4,5,0 2.当我滚动
列表视图时,顶部和底部隐藏的是随机位置


有人能帮我解决问题吗?

我已经更新了代码,请试试这个。必须在if-else块之后设置数据,否则在绑定数据时无法在listview中获得正确的位置。请参阅android视图持有者属性

公共类适配器列表百科全书扩展了ArrayAdapter{
私人内部布局资源;
私人语境;
私人名单数据;
私人手机持有者;
公共适配器列表百科全书(上下文上下文、内部布局资源ID、列表数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
静态类信元保持器
{
ImageView imageApple;
文本视图tvCellAppleName;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图行=转换视图;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新的CellHolder();
holder.imageApple=(ImageView)row.findViewById(R.id.imageApple);
holder.tvCellAppleName=(TextView)row.findViewById(R.id.tvAppleName);
row.setTag(支架);
}
其他的
{
holder=(CellHolder)行。getTag();
}
//您可以在这里设置数据
设置数据(位置、支架);
返回行;
}
私有无效设置数据(内部位置,单元持有者)
{
ImageLoader ImageLoader=ImageLoader.getInstance();
imageLoader.displayImage(InterfaceConfig.serverURL+data.get(position.getImageURL(),holder.imageApple);
holder.tvCellAppleName.setText(data.get(position.getName());
}
}

我已经更新了代码,请尝试一下。必须在if-else块之后设置数据,否则在绑定数据时无法在listview中获得正确的位置。请参阅android视图持有者属性

公共类适配器列表百科全书扩展了ArrayAdapter{
私人内部布局资源;
私人语境;
私人名单数据;
私人手机持有者;
公共适配器列表百科全书(上下文上下文、内部布局资源ID、列表数据){
超级(上下文、布局资源ID、数据);
this.layoutResourceId=layoutResourceId;
this.context=上下文;
这个数据=数据;
}
静态类信元保持器
{
ImageView imageApple;
文本视图tvCellAppleName;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图行=转换视图;
if(行==null)
{
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新的CellHolder();
holder.imageApple=(ImageView)row.findViewById(R.id.imageApple);
holder.tvCellAppleName=(TextView)row.findViewById(R.id.tvAppleName);
row.setTag(支架);
}
其他的
{
holder=(CellHolder)行。getTag();
}
//您可以在这里设置数据
设置数据(位置、支架);
返回行;
}
私有无效设置数据(内部位置,单元持有者)
{
ImageLoader ImageLoader=ImageLoader.getInstance();
imageLoader.displayImage(InterfaceConfig.serverURL+data.get(position.getImageURL(),holder.imageApple);
holder.tvCellAppleName.setText(data.get(position.getName());
}
}

阅读您的代码。。。当您设置文本时?除非…我也不知道为什么那些人使用那个臭名昭著的视图持有者。。。与它的问题相比,它能提供多少帮助?@selvin:对不起,我已经更新了代码。@pskink:我以前做过。它运行得很好,但在这种情况下,我不知道为什么在滚动页面时它运行错误。那么您在哪里/何时调用
setText
?阅读您的代码。。。当您设置文本时?除非…我也不知道为什么那些人使用那个臭名昭著的视图持有者。。。与它的问题相比,它能提供多少帮助?@selvin:对不起,我已经更新了代码。@pskink:我以前做过
public class AdapterListViewEncyclopedia extends ArrayAdapter<Apple> {

private int layoutResourceId;
private Context context;
private List<Apple> data;
private CellHolder holder;

public AdapterListViewEncyclopedia(Context context, int layoutResourceId, List<Apple> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}


static class CellHolder
{
    ImageView imageApple;
    TextView tvCellAppleName;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    View row = convertView;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new CellHolder();
        holder.imageApple = (ImageView) row.findViewById(R.id.imageApple);
        holder.tvCellAppleName = (TextView)row.findViewById(R.id.tvAppleName);
        row.setTag(holder);
    }
    else
    {
        holder = (CellHolder)row.getTag();
    }
    // you can set the data here 
    setData(position,holder);

    return row;
}
private void setData(int position, CellHolder holder)
{
    ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.displayImage(InterfaceConfig.serverURL+data.get(position).getImageURL(), holder.imageApple);

    holder.tvCellAppleName.setText(data.get(position).getName());
}
}