获取视图不绑定所有子元素

时间:2012-04-05 07:28:54

标签: android

我正在使用Gallery,我将ImageViewImageButtonProcessBar绑定到它。在使用getView()时,图库和ViewGroup.getChildCount()方法中有超过50个图像。它只返回int值3。

为什么即使我滚动所有图像,ViewGroup.getChildCount()也会返回3。

所以我在方法中遇到错误:

ViewGroup.getChildAt(position).findViewById(R.id.progressbar_Horizontal).setVisibility(View.VISIBLE);

主要活动

public class SliderActivity extends Activity {  

     private Integer[] mImageIds = {
                R.drawable.sample_1,
                R.drawable.sample_2,
                R.drawable.sample_3,
                R.drawable.sample_4,
                R.drawable.sample_5,
                R.drawable.sample_6,
                R.drawable.sample_7
        };
    /** Called when the activity is first created. */

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);               

        Gallery gallery = (Gallery) findViewById(R.id.gallery);
        gallery.setAdapter(new ImageAdapter(this,mImageIds));      

    }


}

ImageAdapter类:

public class ImageAdapter extends BaseAdapter {

    private int mGalleryItemBackground;
    private Activity mContext;
    private Integer[] Images;
    private int[] ID;
    private ProgressBar process;
    private ImageButton imgBtn;
    private ImageView imageview;


    public ImageAdapter(Activity c,Integer[] images) {
        this.mContext = c;
        this.Images=images;
        TypedArray attr = mContext.obtainStyledAttributes(R.styleable.HelloGal999lery);
        mGalleryItemBackground = attr.getResourceId(
                R.styleable.HelloGal999lery_android_galleryItemBackground, 0);
        attr.recycle();

        ID=new int[getCount()];
    }

    public int getCount() {
        return Images.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return 1;
    }



    public View getView(final int position, View convertView,final ViewGroup parent) {  


         View rowView = convertView;

        if(rowView==null)
        {

         LayoutInflater inflater = mContext.getLayoutInflater();
         rowView = inflater.inflate(R.layout.test, null, true);

         imageview=(ImageView) rowView.findViewById(R.id.ImageViewuser);    
         imgBtn=(ImageButton)rowView.findViewById(R.id.Download);
         process=(ProgressBar)rowView.findViewById(R.id.progressbar_Horizontal);

         imageview.setImageResource(Images[position]);               
         imageview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
         imageview.setBackgroundResource(mGalleryItemBackground);        


         if(position==0)
         {
             if(ID[position]==1)
             {
                 imgBtn.setVisibility(View.INVISIBLE);
                 process.setVisibility(View.VISIBLE);
             }          
         }

         if(ID[position]==position && position!=0)
         {
             imgBtn.setVisibility(View.INVISIBLE);
             process.setVisibility(View.VISIBLE);
         }               
        }                                                    
        else{
            Log.e("Else", "Else case");     
        }

        imgBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {               
                // TODO Auto-generated method stub  
                if(position==0)
                {
                    ID[position]=1;                     
                }
                else
                {
                    ID[position]=position;
                }
                parent.getChildCount();
                Toast.makeText(mContext, position+"", Toast.LENGTH_SHORT).show();
                parent.getChildAt(position).findViewById(R.id.progressbar_Horizontal).setVisibility(View.VISIBLE);          
                BackgroundAsyncTask objDownload=new BackgroundAsyncTask(parent,position);
                objDownload.execute();
            }

        }); 
         return rowView;                    
    }



    private class BackgroundAsyncTask extends
        AsyncTask<Void, Integer, Void> {

      public BackgroundAsyncTask(ViewGroup vg,int position) {       
            this.subGroup=vg;   
            this.pos=position;
        }

    int myProgress; 
    private ViewGroup subGroup;
    private int pos;

      @Override
      protected void onPostExecute(Void result) {
       // TODO Auto-generated method stub


          subGroup.getChildAt(pos).findViewById(R.id.Download).setVisibility(View.VISIBLE);         
          subGroup.getChildAt(pos).findViewById(R.id.progressbar_Horizontal).setVisibility(View.INVISIBLE);             
          Toast.makeText(mContext,"Download finished "+pos, Toast.LENGTH_SHORT).show();

          ID[1]=0;

      }

      @Override
      protected void onPreExecute() {
       // TODO Auto-generated method stub           
       myProgress = 0;
       imgBtn.setVisibility(View.INVISIBLE);
      }

      @Override
      protected Void doInBackground(Void... params) {
       // TODO Auto-generated method stub
       while(myProgress<100){
        myProgress++;
        publishProgress(myProgress);
           SystemClock.sleep(100);               
       }
    return null;              
}

        protected void onProgressUpdate(Integer... values) {

            process.setProgress(values[0]);

      }
     }      
}

2 个答案:

答案 0 :(得分:0)

Android优化了这一点。 比如,你有一个ListView,它有无限数量的元素。 如果您查询它的子计数,它将返回例如10个孩子。它的发生是因为android只创建了当前在屏幕上的视图,并且它们只是重用它们。

您可以在有关Adapter.getView的文档中阅读更多内容,请查看第二个arg convertView

答案 1 :(得分:0)

修正您的getView

public View getView(final int position, View convertView,final ViewGroup parent) {  


     View rowView = convertView;

    if(rowView==null)
    {

     LayoutInflater inflater = mContext.getLayoutInflater();
     rowView = inflater.inflate(R.layout.test, null, true);

     imageview=(ImageView) rowView.findViewById(R.id.ImageViewuser);    
     imgBtn=(ImageButton)rowView.findViewById(R.id.Download);
     process=(ProgressBar)rowView.findViewById(R.id.progressbar_Horizontal);
     }

     imageview.setImageResource(Images[position]);               
     imageview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
     imageview.setBackgroundResource(mGalleryItemBackground);        


     if(position==0)
     {
         if(ID[position]==1)
         {
             imgBtn.setVisibility(View.INVISIBLE);
             process.setVisibility(View.VISIBLE);
         }          
     }

     if(ID[position]==position && position!=0)
     {
         imgBtn.setVisibility(View.INVISIBLE);
         process.setVisibility(View.VISIBLE);
     }               

    imgBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {               
            // TODO Auto-generated method stub  
            if(position==0)
            {
                ID[position]=1;                     
            }
            else
            {
                ID[position]=position;
            }
            parent.getChildCount();
            Toast.makeText(mContext, position+"", Toast.LENGTH_SHORT).show();
            parent.getChildAt(position).findViewById(R.id.progressbar_Horizontal).setVisibility(View.VISIBLE);          
            BackgroundAsyncTask objDownload=new BackgroundAsyncTask(parent,position);
            objDownload.execute();
        }

    }); 
     return rowView;                    
}