Android ListView的自定义适配器

Android ListView的自定义适配器,android,multithreading,android-listview,android-imageview,Android,Multithreading,Android Listview,Android Imageview,我的ListView有多个项目。每个项目都有一个TextView和两个ImageView。我已经使用自定义适配器实现了这一点。myListView中的每个ImageView都有5个图像。如何在自定义适配器的ImageView中重复显示5个图像?我想在15秒内重复所有ImageView中的图像 public class CategoryAdapter extends BaseAdapter { public Activity adapterActivity; LayoutInfla

我的
ListView
有多个项目。每个项目都有一个
TextView
和两个
ImageView
。我已经使用自定义适配器实现了这一点。my
ListView
中的每个
ImageView
都有5个图像。如何在自定义适配器的
ImageView
中重复显示5个图像?我想在15秒内重复所有
ImageView
中的图像

public class CategoryAdapter extends BaseAdapter {
    public Activity adapterActivity;
    LayoutInflater adapterInflater;
    ImageLoader compImageLoader;
    List<Categary> list;

    ArrayList<String> category = new ArrayList<String>();
    ArrayList<String> leftImage = new ArrayList<String>();
    ArrayList<String> rightImage = new ArrayList<String>();

    public CategoryAdapter(Activity activity, List<Categary> listData) {
        list = listData;
        adapterActivity = activity;
        adapterInflater = (LayoutInflater) adapterActivity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        compImageLoader = new ImageLoader(
                adapterActivity.getApplicationContext());
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

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

    @Override
    public long getItemId(int position) {
        return position;
    }

    public class ViewHolder {
        public ImageView lPic, rPic;
        public TextView category;
    }

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

        View vi = convertView;
        final ViewHolder holder;
        if (vi == null) {

            vi = adapterInflater.inflate(R.layout.categoryadapter, null);
            holder = new ViewHolder();
            holder.lPic = (ImageView) vi.findViewById(R.id.imageView1);
            holder.rPic = (ImageView) vi.findViewById(R.id.imageView2);
            holder.category = (TextView) vi
                    .findViewById(R.id.textView_category);
            vi.setTag(holder);
        } else {
            holder = (ViewHolder) vi.getTag();
        }
        final Categary assingValue = list.get(position);
        holder.lPic.setTag(assingValue.leftPicture);
        holder.rPic.setTag(assingValue.rightPicture);
        holder.category.setText(assingValue.id);
        compImageLoader.DisplayImage(assingValue.leftPicture, holder.lPic);
        compImageLoader.DisplayImage(assingValue.rightPicture, holder.rPic);
        return vi;
    }          
}
公共类CategoryAdapter扩展了BaseAdapter{
公共活动适应性;
平面调整器适配器平面调整器;
图像加载器compImageLoader;
名单;
ArrayList类别=新建ArrayList();
ArrayList leftImage=新建ArrayList();
ArrayList rightImage=新建ArrayList();
公共类别适配器(活动,列表数据){
列表=列表数据;
适应性活动=活动;
AdapterFlater=(LayoutFlater)适配器活动性
.getSystemService(上下文布局\充气机\服务);
compImageLoader=新的ImageLoader(
adapterActivity.getApplicationContext());
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回list.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共类视图持有者{
公共图像视图lPic、rPic;
公共文本视图类别;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图vi=转换视图;
最终持票人;
如果(vi==null){
vi=适配器充气(R.layout.categoryadapter,null);
holder=新的ViewHolder();
holder.lPic=(ImageView)vi.findViewById(R.id.imageView1);
holder.rPic=(ImageView)vi.findViewById(R.id.imageView2);
holder.category=(TextView)vi
.findViewById(R.id.textView\U类别);
vi.setTag(支架);
}否则{
holder=(ViewHolder)vi.getTag();
}
最终分类值=list.get(位置);
holder.lPic.setTag(assingValue.leftPicture);
holder.rPic.setTag(assingValue.rightPicture);
holder.category.setText(assingValue.id);
compImageLoader.DisplayImage(assingValue.leftPicture,holder.lPic);
compImageLoader.DisplayImage(assingValue.rightPicture,holder.rPic);
返回vi;
}          
}

您可以在
getView
函数中为每个
ListView
项生成线程,并在两个图像之间设置15秒的延迟

像这样:

    final ImageView iv = (ImageView) v.findViewById(R.id.myImageView);
    new Thread(new Runnable() {

        @Override
        public void run() {
            while(true){
                iv.setImageResource(iconID);
                Thread.sleep(15000);
            }
        }
    }).start();

假设图像的ID在一个数组中

int i=0;
new CountDownTimer(15000, 1000) {

    @Override
    public void onTick(long millisUntilFinished) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onFinish() {
        imgView.setImageResource(arrayIds[i]);
    i++;
        if(i==arrayIds.length)
            i=0;
        start();//restart the count down timer for another 15 seconds again
    }
}.start();
以下是正确的组件:

在您的
getView()
中,我假设您有一个名为
ImageView
ImageView
。我还假设您有一个表示图像的可绘制数组:

AnimationDrawable animation = new AnimationDrawable();
for (Drawable image : images) {
    animation.addFrame(image, 15 * 1000L);
}
imageView.setImageDrawable(animation);
animation.start();

这可能会根据图像在应用程序中的可用性而发生变化。

您可以使用animationdrawable进行更改。如何在自定义适配器中实现animationdrawable?可能吗?先生,你能解释一下吗?看看我的答案。如果你需要更多关于如何在动画中放置图像的详细信息,请发布一些代码,说明如何在适配器中使用图像i添加在我的整个适配器上方。请看一看。现在还不太清楚什么是Categray,Categray里面有什么左图片和右图片(我想是URL,其他的在哪里?),还有什么ImageLoader,我想那是universalImageLoader?谢谢你,先生。我已经使用了你的代码,这取决于我的应用程序。