Eri*_*rik 130 android android-arrayadapter android-listview
我有一个ListView显示新闻项目.它们包含图像,标题和一些文本.图像被加载到一个单独的线程(带有队列和所有)中,当下载图像时,我现在调用notifyDataSetChanged()列表适配器来更新图像.这是有效的,但是getView()因为notifyDataSetChanged()调用getView()了所有可见的项目而被过于频繁地调用.我想只更新列表中的单个项目.我该怎么做?
我目前使用的方法存在的问题是:
Eri*_*rik 197
我找到了答案,感谢你的信息米歇尔.你确实可以使用正确的视图View#getChildAt(int index).问题是它从第一个可见项开始计数.实际上,您只能获取可见项目.你解决这个问题ListView#getFirstVisiblePosition().
例:
private void updateView(int index){
View v = yourListView.getChildAt(index -
yourListView.getFirstVisiblePosition());
if(v == null)
return;
TextView someText = (TextView) v.findViewById(R.id.sometextview);
someText.setText("Hi! I updated you manually!");
}
Run Code Online (Sandbox Code Playgroud)
mre*_*elt 71
这个问题已在Google I/O 2010上提出,您可以在此处观看:
基本上什么罗曼盖伊解释是调用getChildAt(int)上ListView得到的看法和(我认为)调用getFirstVisiblePosition(),找出位置和指数之间的相关性.
Romain也指出了名为Shelves的项目作为一个例子,我认为他可能意味着方法ShelvesActivity.updateBookCovers(),但我找不到调用getFirstVisiblePosition().
令人敬畏的更新即将来临:
RecyclerView将在不久的将来解决这个问题.正如http://www.grokkingandroid.com/first-glance-androids-recyclerview/所指出的,您将能够调用方法来准确指定更改,例如:
void notifyItemInserted(int position)
void notifyItemRemoved(int position)
void notifyItemChanged(int position)
Run Code Online (Sandbox Code Playgroud)
此外,每个人都希望使用基于RecyclerView的新视图,因为他们将获得漂亮的动画奖励!未来看起来很棒!:-)
我就这样做了:
您的项目(行)必须具有唯一ID,以便稍后更新.当列表从适配器获取视图时,设置每个视图的标记.(如果在其他地方使用默认标签,您也可以使用密钥标签)
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = super.getView(position, convertView, parent);
view.setTag(getItemId(position));
return view;
}
Run Code Online (Sandbox Code Playgroud)
对于更新检查列表的每个元素,如果具有给定id的视图在那里它是可见的,所以我们执行更新.
private void update(long id)
{
int c = list.getChildCount();
for (int i = 0; i < c; i++)
{
View view = list.getChildAt(i);
if ((Long)view.getTag() == id)
{
// update view
}
}
}
Run Code Online (Sandbox Code Playgroud)
它实际上比其他方法更容易,当你处理id不是位置时更好!此外,您必须为可见的项目调用更新.
| 归档时间: |
|
| 查看次数: |
137807 次 |
| 最近记录: |