大家好,我需要把一些信息放在屏幕上。需求是使用一个ListView,对于ListView的每一项,表现为,左边是一张图片,右边是一些重要文本。图片是从网络上下载下来的。
由于下载图片比较费时,而且图片也不是很重要,因此在实现的时候,需要先把ListView显示在屏幕上,在后台下载图片,没下载完一个图片,就实时的更新一下,这个时候需要获取到ListView的每一项的View中的ImageView控件,请问如何获取到?
或者有其他的实现方式?谢谢!!!

解决方案 »

  1.   

    动态更改 listview 的 Adapter 的值, 然后刷新一下 listview 可否??
      

  2.   

    ListView 中的数据 不就是 Adapter的么? 操作Adapter 就好了,然后刷新
      

  3.   

    获取imageview:
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = mInflater.inflate(R.layout.item, null);
    ImageView mImageView = (ImageView) convertView.findViewById(R.id.imageview);
    不过感觉用处不大。
    不如重启个线程用来下载图片,下载好一个就handler一个消息,接受的消息就调用一次adapter.notifyDataSetChanged();通知数据发生变化。listview就会将新出现的图片显示出来
      

  4.   

    用楼上的方面 使用adapter.notifyDataSetChanged()事件 或者用下面的 
    public View getView(int position, View convertView, ViewGroup parent) {
    final int nowPosition = position;
      lo.setOnClickListener(new View.OnClickListener() { @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    int position = nowPosition;
                                    。。
      

  5.   

    写点代码你参考,更新m_bitmaps数据后,调用update()即可:class myList extend ListView{
        Bitmap[] m_bitmaps;
         
        public myList(){
           setAdpater(new myAdapter());
        }
     
       public void update(){ ((BaseAdapter)getAdapter()).notifyDatasetChanged(); }
     
       class myAdapter extends BaseAdapter {   public void getView(View convertview, int pos){
          ...
          ImageView iv = convertview.findViewById(...);
          if(m_bitmaps[pos] != null){ 
          iv.setImage(m_bitmaps[pos]);
          }else {
           
          }
       }
       }
          
    }
      

  6.   

    现在需求变化了,在右边添加了一个按钮:也就是说从左到右依次是:ImageView, TextView, ImageButton。因此我的Adapter的getView方法是这样写的:@Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (null == convertView) {
    holder = new ViewHolder();
    convertView = mInflater.inflate(R.layout.my_list, null);
    holder.mImageView = (ImageView)convertView.findViewById(R.id.imageview_id);
    holder.mTextView = (TextView)convertView.findViewById(R.id.textview_id);
    holder.mImageButton = (ImageButton)convertView.findViewById(R.id.imagebutton_id);
    holder.mImageButton.setFocusable(false);
    convertView.setTag(holder);
    } else {
    holder = (ViewHolder)convertView.getTag();
    } Data detail = mList.getItem(position);
    holder.mTextView.setText(detail.mText);
    if (detail.mBmp != null) { // 1、下载完图片,mBmp不为空.是否调用notifyDataSetChanged()即可
    holder.mImageView.setImageBitmap(detail.mBmp);
    }

    holder.mButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
    // 2、这里如何得到,这是第几项的相应?
    }
    });
    return convertView;
    }请教两个问题,分别见上面的注释:
    1、当下载完某项的图片后,mBmp成员不为null,是否调用notifyDataSetChanged()即可?
    2、在上面的onClick函数中,如何获取到,这是第几项?我试过了,getView的参数position是不能使用的。
    谢谢大家!
      

  7.   

    View getView(final int position....
    第几项根据position来抓
      

  8.   

    public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    if(position==0)//刷新
    {
        View weiboitem=LayoutInflater.from(context).inflate(R.layout.moreitemsview,null);
      TextView tv=(TextView)weiboitem.findViewById(R.id.tvItemContent);
         tv.setText("刷新");
     return weiboitem;
    }else if(position==this.getCount()-1)//更多
    {
     View weiboitem=LayoutInflater.from(context).inflate(R.layout.moreitemsview,null);
      TextView tv=(TextView)weiboitem.findViewById(R.id.tvItemContent);
         tv.setText("更多");
     return weiboitem;
    }else
    {
    View weiboitem=null;

    if(convertView!=null&&convertView.findViewById(R.id.tvItemName)!=null)
         {Log.d("getview", "doGetView-------get TextView-----------"+position);
    weiboitem=convertView;
          }else
    {Log.d("getview", "doGetView-------new TextView-----------"+position);
    //把xml布局文件变成View对象
      weiboitem=LayoutInflater.from(context).inflate(R.layout.itemview, null);
      }
      //昵称
    vh.ivItemPortrait = (ImageView)weiboitem.findViewById(R.id.ivItemPortrait);
    vh.tvItemName = (TextView)weiboitem.findViewById(R.id.tvItemName);
    vh.ivItemV = (ImageView)weiboitem.findViewById(R.id.ivItemV);
    vh.tvItemDate = (TextView)weiboitem.findViewById(R.id.tvItemDate);
    vh.ivItemPic = (ImageView)weiboitem.findViewById(R.id.ivItemPic);
    vh.tvItemContent = (TextView)weiboitem.findViewById(R.id.tvItemContent);
    vh.contentPic = (ImageView)weiboitem.findViewById(R.id.contentPic);
    vh.subLayout = weiboitem.findViewById(R.id.subLayout);
    vh.tvItemSubContent = (TextView)vh.subLayout.findViewById(R.id.tvItemSubContent);
    vh.subContentPic = (ImageView)vh.subLayout.findViewById(R.id.subContentPic);
    //vh.ivItemV =(ImageView)vh.subLayout.findViewById(R.id.ivItemV);

    // tv.setText(+":"
    // +allstatus.get(position).getText());

        vh.tvItemName.setText(allstatus.get(position-1).getUser().getName());
        vh.tvItemContent.setText(allstatus.get(position-1).getText());
        //微博内容
    //     TextViewLink.addURLSpan(allstatus.get(position-1).getText(), vh.tvItemContent);
         //转发内容
        if(allstatus.get(position-1).getRetweeted_status()!=null){
    vh.subLayout.setVisibility(View.VISIBLE);
    String txt=allstatus.get(position-1)
    .getRetweeted_status().getText();
    int len=0;
    if(txt.length()>15)
    {len=14;}else{
    len=txt.length();
    }
    vh.tvItemSubContent.setText(txt.substring(0, len));
    // TextViewLink.addURLSpan(" "
    // +allstatus.get(position-1)
    // .getRetweeted_status().getText(), vh.tvItemSubContent);
    //  vh.tvItemSubContent.setFocusable(false);
    //
    }else{
    vh.subLayout.setVisibility(View.GONE);
    }
        vh.tvItemDate.setText(DateUtil.getCreateAt(allstatus.get(position-1).getCreatedAt()));
    //是否实名认证
        if(allstatus.get(position-1).getUser().isVerified())
        {  Log.d("ok","ok isVerified");
         vh.ivItemV.setVisibility(View.VISIBLE); 
        }else
        {
           vh.ivItemV.setVisibility(View.GONE);
        }
        //判断有没有图片
        if(allstatus.get(position-1).getThumbnail_pic()!=null)
        {
         vh.ivItemPic.setVisibility(View.VISIBLE);
        }else
        {
         vh.ivItemPic.setVisibility(View.GONE);
        }
        //头像
        //如果头像已经下载
        if(MainService.allIcon.get(allstatus.get(position-1).getUser().getId())!=null)
            {
         vh.ivItemPortrait.setImageDrawable(MainService.allIcon.get(
          allstatus.get(position-1).getUser().getId()));
            }else
            {// 设定缺省的图片
             vh.ivItemPortrait.setImageResource(R.drawable.portrait);
            }
        return weiboitem;
    }
    }
    跟我们的类似,看看我们写的adapter
      

  9.   

    图片加载都已经写好了。
    关键不知道如何写ImageButton的事件响应。
      

  10.   

    // 1、下载完图片,mBmp不为空.是否调用notifyDataSetChanged()即可
    可以,直接调用,就能够正常显示
      

  11.   


    在getview里ImageButton.setTag(position);
    然后设置一个监听。。
    在监听类里先判断id
    然后在 根据传进来的view
    view.getTag();得到position 这个时候你就知道第几项了 ^_^,,,如下     holder.mButton.setTag(position);
        holder.mButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {         int position = (Integer) arg0.getTag();         //do it
            }
            });
            return convertView;
        }
      

  12.   

    改参数吧,final int position
    position就能用了
      

  13.   


    holder.mButton.setTag(position);
    这样试试看
      

  14.   

    试过了,不知道为什么,TAG总是不对:
    在getView()里面设置TAG:holder.mImageButton.setTag(Integer.valueOf(position));设置监听者的时候获取TAG:holder.mImageButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
    Integer i = (Integer)arg0.getTag();
    int position = i.intValue(); // 不知道为什么,这里的position总是不对
    }
    });设置的TAG和获取的TAG不知道为什么总是不相同。
      

  15.   

    我也遇到过position混乱问题,现已解决。
    解决方法:每次进入getView都必须重新setTag。
      

  16.   

    是的,必须重新设置。否则会引起混乱。这是因为ListView内部用了少数的View,来复用所有的View引起的。
      

  17.   

    您好,我在写代码的时候也遇到position混乱的问题了,我想问一下“每次进入getView都必须重新setTag”是什么意思呢?您在17楼的代码中不是每次进如getView中都执行“holder.mImageButton.setTag(Integer.valueOf(position));”语句么?