- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在按照 View 持有者/适配器模式创建“文档”的 GridView 。在 Activity 中,我从网络类获得回调,因此我需要能够在不同时间更新每个网格单元。
我这样做的方法是将对象元素(文档)映射到相应的 View 持有者。我需要这样做,因为适配器正在回收单元格,所以有时我可能会收到回调以更新不可见的单元格,在这种情况下回调信息将被忽略。
我可以看到适配器的 getView
方法以这种方式针对位置 0 被调用了很多次。不过我一直在读到这是正常的。
inflating position 0 *** progressBar 1
recycling position 0
recycling position 0
inflating position 0 *** progressBar 2
recycling position 0
recycling position 0
recycling position 0
recycling position 0
recycling position 0
recycling position 0
我需要从回调中更新的 UI
元素之一是一个进度条,我通过将 viewHolder
添加到与文档关联的 map 来跟踪它。
除第一个位置外,整个方法适用于所有位置。我可以识别的唯一区别是对 getView
的多次调用,所以我从那里开始调试。我正在更新的 progressBar
是“progressBar
2”,这是 geView
膨胀的最新版本,但实际上它没有响应 setVisible
(View.VISIBLE)。然后我对代码做了一些更改以更新“progressBar
1”并且它有效。
这意味着 getView
在同一位置膨胀两次,但第二次没有被使用或显示。
我做错了什么?为什么 progressbar1 工作而 progressbar2 不工作?我希望 getView
会给我与某个位置对应的最新 View 。
谢谢。
适配器:
public class DocumentPickerGridViewAdapter extends ArrayAdapter<Document> implements Filterable {
private final DocumentPickerGridViewController picker;
private ArrayList values;
private ArrayList filtered;
private LayoutInflater inflater;
public DocumentPickerGridViewAdapter(Context context, ArrayList values) {
super(context, R.id.documentPickerGridView, values);
this.picker = (DocumentPickerGridViewController) context;
this.filtered = values;
this.values = (ArrayList)values.clone();
inflater = (LayoutInflater) picker.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder oldHolder;
ViewHolder holder;
Document doc = (Document) filtered.get(position);
if (v == null) {
v = inflater.inflate(R.layout.documentpickergriditem, parent, false);
holder = new ViewHolder();
holder.actionView = (Button) v.findViewById(R.id.document_action_button);
holder.coverView = (ImageView) v.findViewById(R.id.documentCoverImage);
holder.archiveButton = (Button) v.findViewById(R.id.document_archive_button);
holder.progressView = (ProgressView) v.findViewById(R.id.documentProgress);
holder.progressBar = (ProgressBar) v.findViewById(R.id.documentCoverImageProgressBar);
picker.allProgressViews.add(holder);
Log.d("MARIANO","adding to allProgressViews "+holder.progressView);
Log.d("MARIANO","inflating position "+position);
v.setTag(holder);
}
else{
// here we are recycling, we should clean old stuff.
holder = (ViewHolder)v.getTag();
synchronized (picker){
oldHolder = picker.documentHoldersMap.get(holder.doc);
}
if(oldHolder != null){
oldHolder.progressView.setVisibility(View.GONE);
oldHolder.progressBar.setVisibility(View.GONE);
}
// Document associated with previous holder it's now out of the adapter visible window.
// we have to remove it from the map so if picker receives any call back we won't update anything.
if(! holder.doc.uuid().equals(doc)){
synchronized (picker){
picker.documentHoldersMap.remove(holder.doc);
}
}
}
holder.doc = doc;
holder.position = position;
synchronized (picker){
picker.documentHoldersMap.put(doc,holder);
}
/*
TODO: check why view extendedGrid starts to measure the size of the grid after gridpicker view has disapear. This causes a ArrayOutofIndexes
exception. DocumentGridPicker view does setDocuments(null); which clears all arrays, but the adapter stays setting as many cells as before.
https://kaldorgroup.jira.com/browse/NEWSWEEK-49
*/
if(picker.documents() != null && picker.documents().size() > 0 ){
picker.setCoverView(holder.coverView, doc);
picker.setActionButton(holder.actionView, doc);
picker.setArchiveButton(holder.archiveButton, doc);
picker.refreshButton(doc);
}
TextView textView = (TextView) v.findViewById(R.id.documentName);
textView.setText(doc.name());
if(position == 0)
Log.d("MARIANO", "progressView: "+holder.progressView);
return v;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults result = new FilterResults();
if (constraint.equals(DocumentPickerGridViewController.FILTER_DOWNLOADED)) {
ArrayList items = new ArrayList();
synchronized (this) {
items.addAll(values);
}
for (int i = items.size() - 1; i >= 0; i--) {
if (((Document) items.get(i)).state() != DocumentStates.Downloaded)
items.remove(i);
}
result.count = items.size();
result.values = items;
} else { // ALL ITEMS
synchronized (this) {
result.count = values.size();
result.values = values;
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filtered = (ArrayList)results.values;
DocumentPickerGridViewAdapter.this.notifyDataSetChanged();
clear();
for(int i = 0, l = filtered.size(); i < l; i++)
add((Document)filtered.get(i));
notifyDataSetInvalidated();
}
};
}
static class ViewHolder{
ImageView coverView;
Button actionView;
Button archiveButton;
ProgressView progressView;
ProgressBar progressBar;
int position;
Document doc;
}
}
GridView :
<com.kaldorgroup.newsweek.ExpandableGridView
android:id="@+id/documentPickerGridView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnWidth="150dp"
android:numColumns="auto_fit"
android:horizontalSpacing="25dp"
android:stretchMode="spacingWidth"
android:verticalSpacing="20dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:isScrollContainer="false"
android:paddingTop="350dp" />
最佳答案
我在 GridView 中遇到了完全相同的问题。单击列表的第一项时,它不会刷新。我只是从
更改了代码 public View getView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
if (convertView == null)
{
LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.calendar_item, null);
}
.......
}
to
public View getView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
// if (convertView == null)
// {
LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.calendar_item, null);
// }
.......
}
It is working fine to me.. But I don't have idea how it happens...
Any Clarification on this will be more helpful!!
关于android - 在 getView 膨胀两次后更新第一个 gridview 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17296440/
我想要自定义微调器,在下拉列表中包含图像和 TextView ,因此我创建了不同的布局并对其进行了膨胀,其工作正常,但对于按微调器之前的微调器布局,我只想有一个类似“选择”的文本来自列表”但是当我用
所以我正在开发实时 ListView ,我需要 ListView 在单击按钮时更新,这些也是如此: private void ReloadData(){ DataList.clear();
我知道其他人也问过这个问题,但我看过其他解决方案,但仍然无法使其发挥作用。 适配器代码: private class CustomTextAndImageAdapter extends ArrayAd
我有一个通过 asynctask 填充的自定义 ListView 适配器,我在 onprogress 函数中调用 notificationdatasetchanged,并且 getCount() 返回
我正在显示联系人列表。一切都很好,除了设备有 1620 个联系人,所以列表滚动非常慢,甚至有时会挂起。 请帮帮我。 我尝试使用检查 ConvertView!=null 的 getView 方法,但它总
我想在每张图片下方添加一个文本,这是我的实际代码: @Override public View getView(int position, View convertView, ViewGroup pa
我在 Adapter extensions override of getView 中经常看到这一点: @Override public View getView(int position,
我正在尝试在对话框中制作 ListView 。但是我的适配器中的 getView 函数永远不会被调用。有什么想法吗? 适配器: public class DialogAdapter extends B
我有 public class MainActivity extends FragmentActivity 我编写了实现 AsyncResponse 的 Loader 类: public class
我有这样一段代码:)我想编辑我的自定义首选项布局的文本属性。但是从 getView 函数对对象所做的任何更改都不会影响首选项屏幕中的实际列表。有任何想法吗?我知道我不能扩展 PreferenceScr
我有一个扩展 simplecursoradapter 的适配器。新 View 应该从数据库中获取光标和图像,用几个复选框填充列表。出于某种原因,我似乎看不到,我的 getView 甚至没有被调用。我在
谁能解释一下这两种 getView() 实现之间的区别是什么? 第一个简单地检查 convertView 是否为 null;如果它为 null,则膨胀一个新的 View 对象。然后给子View设置合适
我做了一个 SingleItemAdapter extends ArrayAdapter,这个定制的 Adapter 用于 ListView。 在这个 SingleItemAdapter 中,我做了一
这里是相当新的 Android 开发者。 我遇到了一个奇怪的问题,我不确定如何解决。我在这里阅读了很多问题,听起来它们与我遇到的问题相同,但他们问题的解决方案似乎永远不适用于这里发生的事情。 我使用扩
我有一个带有 ListFragment 的自定义适配器,但根本没有调用适配器 getView()。 这是适配器的样子 - public class ModuleListItemAdapter exte
我正在将自定义 SimpleCursorAdapter 设置为 ListView。出于某种原因,对于数据库中的每个项目,FriendAdapter 的 getView() 被调用两次。经过一些调查(我
我有一个包含自定义适配器和自定义行的列表。 问题是当我滚动 ListView 时,图像位于错误的位置... 这是自定义行 xml: 这是 GetView: List it
public View getView(int index, View view, ViewGroup parent){ if (view == null) { // for the firs
我添加了两个按钮(添加和删除)来控制 ListView ,当我删除一个项目时,该项目不会立即在 ListView 中消失,只有当我在 ListView 上滑动时,新项目才会消失。除非我触摸屏幕或在 L
我已经多次尝试在我的 Controller 上使用 this.getView(),但我总是在我的控制台上收到 getView is not a function 错误。 是否有任何“技巧”或我可以做的
我是一名优秀的程序员,十分优秀!