0

アプリに 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>      
4

2 に答える 2

1

しかし、私が今直面している問題は、スクロールすると、画像を常に一定に保ちたいときに、画像の順序が変更されることです。

これは、メソッドをセットアップするgetViewItemType方法が原因である可能性が最も高いです (または、間違っている方法でそれを実行しようとしていますgetView)。行タイプをどのように表示したいのか理解できないので、行がどのように表示されるかをよりよく説明しない限り、何かをお勧めすることはできません.

さらに、効率的な「int」反復子を使用して行の次の画像を取得して表示したにもかかわらず、画像が繰り返されます。

これは、のリサイクル メカニズムgetView()を考慮してメソッドを記述していないために発生しています。が nullの場合にのみデータをセットアップしListViewないでください。これは、行がリサイクルされると、リサイクルされた行の正しいデータがセットアップされないことを意味するためです。convertViewListView

例えば:

     @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メソッドが呼び出されます。画面から 1 つの行が消えると、ListViewその行をキャッシュに保持して、後でgetViewメソッドが再度呼び出されたときに使用することができます (これにより、getViewメソッドは行を再度構築する必要がなくなり、不要なオブジェクトの作成が回避されます)。したがって、getViewメソッドでconvertViewは、null. null の場合は、行を作成します (null チェックの後にデータをセットアップします)。null でない場合は、リサイクルされたビューがあり、新しい行を作成する必要はありません。その上にデータをセットアップするだけです (null チェック内にデータを設定すると、リサイクルされたビューは古いデータを保持します)。 (前の位置から)奇妙な結果が得られます)。

はメソッドのgetItemViewType前に呼び出され、そのタイプのリサイクル ビューがあるかどうかをチェックします (そのため、現在の位置に関係なく、正しいリサイクル ビューを取得することが保証されます)。ここで、画像をどのようにセットアップしたいのかまだわかりません。おそらく画像を保持するリストがありますが、それらをどのように割り当て、順次、ランダムなどにするかわかりませんgetViewListViewflowImages

于 2012-08-31T06:42:16.790 に答える
0

この条件を削除する
if(convertView == null)

于 2012-08-31T08:17:54.230 に答える