大家好,我需要把一些信息放在屏幕上。需求是使用一个ListView,对于ListView的每一项,表现为,左边是一张图片,右边是一些重要文本。图片是从网络上下载下来的。
由于下载图片比较费时,而且图片也不是很重要,因此在实现的时候,需要先把ListView显示在屏幕上,在后台下载图片,没下载完一个图片,就实时的更新一下,这个时候需要获取到ListView的每一项的View中的ImageView控件,请问如何获取到?
或者有其他的实现方式?谢谢!!!
由于下载图片比较费时,而且图片也不是很重要,因此在实现的时候,需要先把ListView显示在屏幕上,在后台下载图片,没下载完一个图片,就实时的更新一下,这个时候需要获取到ListView的每一项的View中的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就会将新出现的图片显示出来
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;
。。
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 {
}
}
}
}
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是不能使用的。
谢谢大家!
第几项根据position来抓
// 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
关键不知道如何写ImageButton的事件响应。
可以,直接调用,就能够正常显示
在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;
}
position就能用了
holder.mButton.setTag(position);
这样试试看
在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不知道为什么总是不相同。
解决方法:每次进入getView都必须重新setTag。