我正在使用Gallery
,我将ImageView
,ImageButton
和ProcessBar
绑定到它。在使用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]);
}
}
}
答案 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;
}