自定义ListView滚动 - 仅图像视图

时间:2012-08-31 00:36:51

标签: java android android-listview android-imageview

我的应用程序中有一个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>      

2 个答案:

答案 0 :(得分:1)

  

但我现在面临的问题是,当我滚动时,订单   当我希望它们保持不变时,图像会发生变化   时间。

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

  

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

这种情况正在发生,因为您没有编写getView()方法来考虑ListView的循环机制。您应该永远不会仅在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方法中,您应该始终检查convertView是否为null。如果它为null,则构建行(并在null检查之后设置数据)。如果它不是null,那么你有一个循环视图,你不需要构建一个新行,你只需要在其上设置数据(如果你在null检查中设置数据,那么循环视图将保留旧数据(从以前的位置)你会得到奇怪的结果。)

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

答案 1 :(得分:0)

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