0

我的应用程序中有一个 ListView,其中只有 ImageViews。根据随机选择方法,每行显示 1、2 或 3 个图像。但是我现在面临的问题是,当我滚动时,图像的顺序会发生变化,而我希望它们始终保持不变。另外,即使我使用了高效的“int”迭代器来检索和显示该行中的下一个图像,图像也会重复。

我检查了其他处理类似问题的问题,但它们不处理 ImageViews。我是新手,所以任何帮助将不胜感激。

public class YPAdapter extends BaseAdapter{

public Context context; 
public ArrayList<ImageDetails> flowImages = new ArrayList<ImageDetails>();
LayoutInflater inflater;
private ArrayList mData = new ArrayList();
public int i = Home.getStart();

YPAdapter(Context context, ArrayList<ImageDetails> name, int start) {
    inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);     
    this.context = context; 
    this.flowImages = name; 
}
public void addItem(final int item) {
    mData.add(item);
    notifyDataSetChanged();
    }   
@Override
public int getViewTypeCount() {
    return 3;
}
@Override
    public int getCount() {
    return mData.size();
    }

@Override
public int getItemViewType(int position) {
int x = 0;
    if (Integer.parseInt(mData.get(position).toString()) == 1) x = 0;
    else if(Integer.parseInt(mData.get(position).toString()) == 2) x = 1;
    else if(Integer.parseInt(mData.get(position).toString()) == 3) x = 2;
    return x;
}

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


    int mode = getItemViewType(position);



        if(convertView == null)
        {   

        switch(mode){

        case 0:

            convertView = inflater.inflate(R.layout.image_container_1, parent, false);
        if(i < (flowImages.size()))
        {
        ImageView imageView = (ImageView) convertView.findViewById(R.id.logo_1);

        ArrayList<ImageDimensions> dimensions = new ArrayList<ImageDimensions>();

        dimensions = ImageSorter.getLayout(1);

        // get parameters

                // set image with url

        i++;

        }       

        break;

        case 1:                  
                convertView = inflater.inflate(R.layout.image_container_2, parent, false);          

        if(i < (flowImages.size()-1))
        {
        ImageView imageView1 = (ImageView) convertView.findViewById(R.id.logo_2_1);
        ImageView imageView2 = (ImageView) convertView.findViewById(R.id.logo_2_2);

        ArrayList<ImageDimensions> dimensions = new ArrayList<ImageDimensions>();

         // get parameters for 2 images

                // set image for first imageview    
        i++;
           // set image for second imageview
           i++;
        }
        break;

        case 2:              
                convertView = inflater.inflate(R.layout.image_container_3, parent, false);

        if(i < (flowImages.size()-2))
        {
        ImageView imageView1 = (ImageView) convertView.findViewById(R.id.logo_3_1);
        ImageView imageView2 = (ImageView) convertView.findViewById(R.id.logo_3_2);
        ImageView imageView3 = (ImageView) convertView.findViewById(R.id.logo_3_3);

        ArrayList<ImageDimensions> dimensions = new ArrayList<ImageDimensions>();

       // get parameters for 3 images

                // set image with url for first imageview
        i++;
        // set image for second imageview
        i++;
    // set image for third imageview
               i++;
        }

        break;
    }   
    }


    return convertView;

}



public Object getItem(int position) {
     return mData.get(position);
}

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

}

这是 ListView 的 XML:

<ListView
android:id = "@+id/home_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"       
    >         
</ListView>      
4

2 回答 2

1

但是我现在面临的问题是,当我滚动时,图像的顺序会发生变化,而我希望它们始终保持不变。

这很可能是因为您设置getViewItemType方法的方式(或者您尝试以getView错误的方式执行此操作)。我不明白您希望行类型如何显示,因此除非您更好地解释行的显示方式,否则我无法向您推荐某些内容。

另外,即使我使用了高效的“int”迭代器来检索和显示该行中的下一个图像,图像也会重复。

发生这种情况是因为您没有编写getView()考虑ListView' 回收机制的方法。您永远不应该只为null的情况设置数据,convertView因为这意味着作为ListView回收行,您不会为回收行设置正确的数据。

例如:

     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
        int mode = getItemViewType(position);
        if(convertView == null) {   
            switch(mode){
            case 0:
                convertView = inflater.inflate(R.layout.image_container_1, parent, false);
            break;
            case 1:                  
                convertView = inflater.inflate(R.layout.image_container_2, parent, false);          
            break;
            case 2:              
                convertView = inflater.inflate(R.layout.image_container_3, parent, false);
            break;
            }   
        }
        switch (mode) {
        case 0:
                    if(i < (flowImages.size()))
            {
            ImageView imageView = (ImageView) convertView.findViewById(R.id.logo_1);

            ArrayList<ImageDimensions> dimensions = new ArrayList<ImageDimensions>();

            dimensions = ImageSorter.getLayout(1);

            // get parameters

                    // set image with url

            i++; // I don't know what you try to measure with this variable but 
            // you shouldn't do it in a method like getView as this method is called a lot of times
            // for example the user coculd be playing, scrolling the ListView one item down and one item up for 500 times.
            } 
        break;        
        case 1:
            if(i < (flowImages.size()-1))
            {
            ImageView imageView1 = (ImageView) convertView.findViewById(R.id.logo_2_1);
            ImageView imageView2 = (ImageView) convertView.findViewById(R.id.logo_2_2);

            ArrayList<ImageDimensions> dimensions = new ArrayList<ImageDimensions>();

             // get parameters for 2 images

                    // set image for first imageview    
            i++;
               // set image for second imageview
               i++;
            }

        break;       
        case 2:

            if(i < (flowImages.size()-2))
            {
            ImageView imageView1 = (ImageView) convertView.findViewById(R.id.logo_3_1);
            ImageView imageView2 = (ImageView) convertView.findViewById(R.id.logo_3_2);
            ImageView imageView3 = (ImageView) convertView.findViewById(R.id.logo_3_3);

            ArrayList<ImageDimensions> dimensions = new ArrayList<ImageDimensions>();

           // get parameters for 3 images

                    // set image with url for first imageview
            i++;
            // set image for second imageview
            i++;
        // set image for third imageview
                   i++;
            }


    break;
    }
    return convertView;

}

为什么你不需要只考虑这种convertView == null情况:

ListView需要显示新行时(列表第一次出现在屏幕上或用户向上或向下滚动时),它将调用该getView方法。当一行从屏幕上消失时,ListView可以选择将该行保留在缓存中以供以后getView再次调用该方法时使用(通过这样做,该getView方法将不必再次构建该行,避免创建不必要的对象)。因此,在该getView方法中,您应该始终检查是否convertViewnull. 如果它为空,则构建行(并在空检查设置数据之后)。如果它不为空,那么您有一个回收视图,并且无需构建新行,您只需在其上设置数据(如果您在空检查中设置数据,那么回收视图将保留旧数据(从以前的位置),你会得到奇怪的结果)。

将在方法getItemViewType之前调用,以检查它是否具有该类型的回收视图(因此无论您在什么位置,都可以保证获得正确的回收视图)。在这里,我仍然不明白您要如何设置图像。您有可能包含您的图像的列表,但我不知道您希望如何分配它们,顺序,随机等getViewListViewflowImages

于 2012-08-31T06:42:16.790 回答
0

删除此条件
if(convertView == null)

于 2012-08-31T08:17:54.230 回答