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