java - 自定义 ListView 滚动 - 仅 Imageviews

标签 java android android-listview android-imageview

我的应用程序中有一个 ListView,其中仅包含 ImageView。每行显示 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>      

最佳答案

But the problem I am facing right now is that when I scroll, the order of the images gets changed, when I want them to stay constant all the time.

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

Plus, the images repeat themselves even though I have used an efficient "int" iterator to retrieve and display the next image in the line.

发生这种情况是因为您没有编写 getView() 方法来考虑 ListView 的回收机制。您不应该仅在 convertView 为 null 的情况下设置数据,因为这意味着当 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。如果为空,则构建行(并在空检查后设置数据)。如果它不为空,则您有一个回收 View ,无需构建新行,您只需在其上设置数据(如果您在空检查中设置数据,则回收 View 将保留旧数据(从之前的位置)你会得到奇怪的结果)。

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

关于java - 自定义 ListView 滚动 - 仅 Imageviews,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12207478/

相关文章:

java - 将流元素映射到 LocalDate,而不收集到列表

java - 无法通过网络发送 Vert.x 消息

android - 如何在android中获取蓝牙连接设备的MAC地址

android - 如何使用 Android 分页库向 PagedList 添加 header

java - 字符串.split ("_(B")

java - 如何获取刷新 token ?

android - 使用 HashMap 在带有 SimpleAdapter 的 ListView 中显示图像 - Android

android - Android Library Project Jar + IntelliJ IDEA 11

java - 具有自定义光标适配器的 ListView 为空

java - 如何在 Android 中创建 Accordion ListView?