gpt4 book ai didi

android - BaseAdapter.notifyDataSetChanged 反转元素的顺序

转载 作者:行者123 更新时间:2023-11-29 00:48:22 26 4
gpt4 key购买 nike

对于我的 Android 应用程序中的导航,我使用 ListView 并在 Activity 的 onCreate 方法中为其创建和设置一个 BaseAdapter。

BaseAdapter 访问 ArrayList 以检索元素 (cache.getNavigation()):

public class NavigationAdapter extends BaseAdapter {
Context mContext;

public NavigationAdapter(Context c) {
mContext = c;
}

@Override
public int getCount() {
return cache.getNavigation() != null ? cache.getNavigation().size()
: 0;
}

@Override
public Object getItem(int position) {
return cache.getNavigation() != null ? cache.getNavigation().get(
position) : 0;
}

@Override
public long getItemId(int position) {
return cache.getNavigation() != null ? cache.getNavigation().get(
position).getId() : 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
LayoutInflater li = getLayoutInflater();

v = li.inflate(R.layout.list_nav_icon, null);
TextView tv = (TextView) v.findViewById(R.id.list_nav_text);
tv.setText(((TemplateInstanceDto) getItem(position))
.getName());

ImageView icon = (ImageView) v
.findViewById(R.id.list_nav_icon);
byte[] binary = ((TemplateInstanceDto) getItem(position))
.getIcon();
Bitmap bm = BitmapFactory.decodeByteArray(binary, 0,
binary.length);
icon.setImageBitmap(bm);

ImageView arrow = (ImageView) v
.findViewById(R.id.list_nav_arrow);
arrow.setImageResource(R.drawable.arrow);


} else {
v = convertView;
}
return v;
}
}

所以导航是建立在从缓存启动的基础上的。同时,我启动一个 AsyncTask,它从服务器检索导航 ArrayList,当它发生更改时,它将新导航保存到缓存中:

private class RemoteTask extends
AsyncTask<Long, Integer, List<TemplateInstanceDto>> {
protected List<TemplateInstanceDto> doInBackground(Long... ids) {
try {
RemoteTemplateInstanceService service = (RemoteTemplateInstanceService) ServiceFactory
.getService(RemoteTemplateInstanceService.class,
getClassLoader());

List<TemplateInstanceDto> templates = service
.findByAccountId(ids[0]);

return templates;
} catch (Exception e) {
return null;
}
}

protected void onPostExecute(List<TemplateInstanceDto> result) {
if (result != null && result.size() > 0) {
cache.saveNavigation(result);
populateData();
} else {
Toast text = Toast.makeText(ListNavigationActivity.this,
"Server communication failed.", 3);
text.show();
}
}
}

当我在 populateData() 中什么都不做时,ListView 不会更新。当我调用 ((BaseAdapter) ListView.getAdapter()).notifyDataSetChanged() 时, View 会更新,但顺序会颠倒。第一项是最后一项,最后一项是第一项,依此类推。

需要举行!提前致谢。

最佳答案

问题在于 getView() 函数。通过方法的不同调用,View 对象被缓存,但不与位置耦合。

通过适当的日志,您还可以将此行为视为:

 pos1: View1 
pos2: View2
pos3: View3
pos3: View1
pos2: View2
pos1: View3

这就是列表倒置的原因。解决方案:在每次调用 getView 时,即使对象存在,也要在 Value 中设置值。即:

 public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
LayoutInflater li = getLayoutInflater();
v = li.inflate(R.layout.list_nav_icon, null);
} else {
v = convertView;
}
TextView tv = (TextView) v.findViewById(R.id.list_nav_text);
tv.setText(((TemplateInstanceDto) getItem(position))
.getName());

ImageView icon = (ImageView) v
.findViewById(R.id.list_nav_icon);
byte[] binary = ((TemplateInstanceDto) getItem(position))
.getIcon();
Bitmap bm = BitmapFactory.decodeByteArray(binary, 0,
binary.length);
icon.setImageBitmap(bm);

ImageView arrow = (ImageView) v
.findViewById(R.id.list_nav_arrow);
arrow.setImageResource(R.drawable.arrow);

return v;
}

关于android - BaseAdapter.notifyDataSetChanged 反转元素的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4944052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com