galleryのgetviewでpositionが0のときに2回問題を呼び出す
3298 ワード
回転: http://www.maxiaoguo.com/shipin/349.html
プロジェクトで問題が発生し、galleryのあるactivityに入るとgalleryの最初の画像がロードされません. スライドした後、または再び入ってから表示されます.
なぜなら、初めて入ったときにgetviewが1回呼び出され、その後また自動的に呼び出されたので、 つまり一度入ったactivity positionが0のときに2回呼び出されました.
初めて view初期化後にリクエストデータを開始し、2回目の場合 初期化後もデータを要求し、2回目の初期化のviewもposition=0の位置に置かれていましたが、プロジェクトに重複コミット要求防止の判断が書かれていたので、2回目のリクエストデータが失敗したため、表示されませんでした...坑お父さん...
解決策
一、 adaperで 初期化
private boolean first = true; private View temp; private int firstPosition = 0;
二、getviewに追加
if(first){ firstPosition = position; }else{ if(temp!=null&&(firstPosition==position||(getTitleCount()!=0&&position%getTitleCount()==firstPosition))){ return temp; }else{ temp = null; } }
メソッドの最上位に配置
三、getviewで
contentview=nullの場合、次のコードを追加します.
if(first){ temp = convertView; first = false; }
コードクリップ
プロジェクトで問題が発生し、galleryのあるactivityに入るとgalleryの最初の画像がロードされません. スライドした後、または再び入ってから表示されます.
なぜなら、初めて入ったときにgetviewが1回呼び出され、その後また自動的に呼び出されたので、 つまり一度入ったactivity positionが0のときに2回呼び出されました.
初めて view初期化後にリクエストデータを開始し、2回目の場合 初期化後もデータを要求し、2回目の初期化のviewもposition=0の位置に置かれていましたが、プロジェクトに重複コミット要求防止の判断が書かれていたので、2回目のリクエストデータが失敗したため、表示されませんでした...坑お父さん...
解決策
一、 adaperで 初期化
private boolean first = true; private View temp; private int firstPosition = 0;
二、getviewに追加
if(first){ firstPosition = position; }else{ if(temp!=null&&(firstPosition==position||(getTitleCount()!=0&&position%getTitleCount()==firstPosition))){ return temp; }else{ temp = null; } }
メソッドの最上位に配置
三、getviewで
contentview=nullの場合、次のコードを追加します.
if(first){ temp = convertView; first = false; }
コードクリップ
/**
* @author mawentao
* @param
*/
public class GameInfoGalleryAdapter extends BaseAdapter implements com.m4399.gamecenter.widget.TitleProvider{
private ArrayList<String> data;
private LayoutInflater mInflater;
private ImageLoader loader;
private Context c;
private int viewHeight;
private boolean first = true;
private View temp;
private int firstPosition = 0;
public GameInfoGalleryAdapter(LayoutInflater mInflater,Context context,ImageLoader loader){
this.c = context;
this.loader = loader;
this.mInflater = mInflater;
if(data==null){
data = new ArrayList<String>();
}
viewHeight = DensityUtil.dip2px(context, 180);
}
public void setDiscussData(ArrayList<String> data){
if(data!=null){
this.data = data;
}
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(first){
firstPosition = position;
}else{
if(temp!=null&&(firstPosition==position||(getTitleCount()!=0&&position%getTitleCount()==firstPosition))){
return temp;
}else{
temp = null;
}
}
ViewHolder holder = null;
if(convertView==null){
holder = new ViewHolder();
holder.imageView = new ImageView(c);
holder.imageView.setScaleType(ScaleType.FIT_XY);
Gallery.LayoutParams params = new Gallery.LayoutParams( Gallery.LayoutParams.WRAP_CONTENT,viewHeight);
holder.imageView.setLayoutParams(params);
holder.imageView.setFocusable(false);
convertView = holder.imageView;
convertView.setTag(holder);
if(first){
temp = convertView;
first = false;
}
}else{
holder = (ViewHolder) convertView.getTag();
}
final String imageUrl = data.get(position%data.size());
ImageUtil.setViewImage(holder.imageView, imageUrl, ImageUtil.DEFAULT_IMAGE_GAME_POSTER, loader, new BitmapOptions(0,viewHeight).setSetScaleTyep(BitmapOptions.SCALE_BY_HEIGHT));
return convertView;
}
private class ViewHolder{
ImageView imageView;
}
@Override
public String getTitle(int position) {
return data.get(position%data.size());
}
@Override
public int getTitleCount() {
return data.size();
}
}