请教:获取ListView的第N项的View

BuleRiver 2011-05-23 05:15:33
大家好,我需要把一些信息放在屏幕上。需求是使用一个ListView,对于ListView的每一项,表现为,左边是一张图片,右边是一些重要文本。图片是从网络上下载下来的。
由于下载图片比较费时,而且图片也不是很重要,因此在实现的时候,需要先把ListView显示在屏幕上,在后台下载图片,没下载完一个图片,就实时的更新一下,这个时候需要获取到ListView的每一项的View中的ImageView控件,请问如何获取到?
或者有其他的实现方式?谢谢!!!
...全文
1159 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxiaojun92 2012-12-13
  • 打赏
  • 举报
回复
引用 20 楼 BuleRiver 的回复:
引用 19 楼 radardsp 的回复:我也遇到过position混乱问题,现已解决。 解决方法:每次进入getView都必须重新setTag。 是的,必须重新设置。否则会引起混乱。这是因为ListView内部用了少数的View,来复用所有的View引起的。
不好意思,我明白什么意思了,谢谢啊。
zhangxiaojun92 2012-12-13
  • 打赏
  • 举报
回复
引用 20 楼 BuleRiver 的回复:
引用 19 楼 radardsp 的回复:我也遇到过position混乱问题,现已解决。 解决方法:每次进入getView都必须重新setTag。 是的,必须重新设置。否则会引起混乱。这是因为ListView内部用了少数的View,来复用所有的View引起的。
您好,我在写代码的时候也遇到position混乱的问题了,我想问一下“每次进入getView都必须重新setTag”是什么意思呢?您在17楼的代码中不是每次进如getView中都执行“holder.mImageButton.setTag(Integer.valueOf(position));”语句么?
BuleRiver 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 radardsp 的回复:]
我也遇到过position混乱问题,现已解决。
解决方法:每次进入getView都必须重新setTag。
[/Quote]
是的,必须重新设置。否则会引起混乱。这是因为ListView内部用了少数的View,来复用所有的View引起的。
radardsp 2011-12-13
  • 打赏
  • 举报
回复
我也遇到过position混乱问题,现已解决。
解决方法:每次进入getView都必须重新setTag。
BuleRiver 2011-05-24
  • 打赏
  • 举报
回复
现在需求变化了,在右边添加了一个按钮:也就是说从左到右依次是: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是不能使用的。
谢谢大家!
hijovi 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 buleriver 的回复:]

引用 15 楼 yongyuandeni 的回复:
引用 11 楼 buleriver 的回复:
关键不知道如何写ImageButton的事件响应。
holder.mButton.setTag(position);
这样试试看

试过了,不知道为什么,TAG总是不对:
在getView()里面设置TAG:
Java code

holder.mImageButton.setTa……
[/Quote]

别用匿名类试试
BuleRiver 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yongyuandeni 的回复:]
引用 11 楼 buleriver 的回复:
关键不知道如何写ImageButton的事件响应。
holder.mButton.setTag(position);
这样试试看
[/Quote]
试过了,不知道为什么,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不知道为什么总是不相同。
jayqean 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hijovi 的回复:]

引用 11 楼 buleriver 的回复:

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


在getview里ImageButton.setTag(position);
然后设置一个监听。。
在监听类里

先判断id
然后在 根据传进来的view
view.getTag();得到position 这个时候你就知道第几项了 ^_^,,,如……
[/Quote]
好办法,让我想起了swing
yongyuandeni 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 buleriver 的回复:]

关键不知道如何写ImageButton的事件响应。
[/Quote]

holder.mButton.setTag(position);
这样试试看
jayqean 2011-05-24
  • 打赏
  • 举报
回复
改参数吧,final int position
position就能用了
hijovi 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 buleriver 的回复:]

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

在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;
}



yongyuandeni 2011-05-24
  • 打赏
  • 举报
回复
// 1、下载完图片,mBmp不为空.是否调用notifyDataSetChanged()即可
可以,直接调用,就能够正常显示
BuleRiver 2011-05-24
  • 打赏
  • 举报
回复
图片加载都已经写好了。
关键不知道如何写ImageButton的事件响应。
jayqean 2011-05-24
  • 打赏
  • 举报
回复
LZ可以去网上搜下懒加载的图片列子吧
  • 打赏
  • 举报
回复
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
Jim@luckeeinc.com 2011-05-24
  • 打赏
  • 举报
回复
View getView(final int position....
第几项根据position来抓
BuleRiver 2011-05-24
  • 打赏
  • 举报
回复
大家都没有遇到过类似的问题吗?
期待高手解答,谢谢!!!
changy 2011-05-23
  • 打赏
  • 举报
回复
写点代码你参考,更新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 {

}
}
}

}
socketsyuhai 2011-05-23
  • 打赏
  • 举报
回复
用楼上的方面 使用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;
。。。。。
easycoola 2011-05-23
  • 打赏
  • 举报
回复
获取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就会将新出现的图片显示出来

加载更多回复(2)

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧