android – 在getView将其膨胀两次后更新第一个gridview元素

前端之家收集整理的这篇文章主要介绍了android – 在getView将其膨胀两次后更新第一个gridview元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在视图持有者/适配器模式之后创建“文档”的网格视图.在活动中,我从网络类中获得回调,因此我需要能够在不同的时间更新每个网格单元.

我这样做的方法是通过从对象元素(文档)到相应的视图持有者的映射映射.我需要这样做,因为适配器正在循环使用单元格,所以有时我可以收到一个回调来更新一个不可见的单元格,在这种情况下,回调信息将被忽略.

我可以看到适配器的getView方法被多次调用为位置0.我一直在读这是正常的.

  1. inflating position 0 *** progressBar 1
  2. recycling position 0
  3. recycling position 0
  4. inflating position 0 *** progressBar 2
  5. recycling position 0
  6. recycling position 0
  7. recycling position 0
  8. recycling position 0
  9. recycling position 0
  10. recycling position 0

我需要从回调中更新的一个UI元素是一个进度条,我通过将viewHolder添加到与文档关联的Map来跟踪.

除了第一个方法之外,这整个方法适用于所有位置.我可以识别的唯一区别是这些多次调用getView所以我从那里开始调试.我正在更新的progressBar是“progressBar 2”,这是geView膨胀的最新版本,但实际上它并没有响应setVisible(View.VISIBLE).然后我对代码进行了一些更改以更新“progressBar 1”并且它可以工作.

这意味着getView在同一位置膨胀两次,但第二次没有被使用或显示.

我能做错什么?为什么progressbar1工作而progressbar2没有?我希望getView会给我一个与位置相对应的最新视图.

谢谢.

适配器:

  1. public class DocumentPickerGridViewAdapter extends ArrayAdapter<Document> implements Filterable {
  2. private final DocumentPickerGridViewController picker;
  3. private ArrayList values;
  4. private ArrayList filtered;
  5. private LayoutInflater inflater;
  6.  
  7. public DocumentPickerGridViewAdapter(Context context,ArrayList values) {
  8. super(context,R.id.documentPickerGridView,values);
  9. this.picker = (DocumentPickerGridViewController) context;
  10. this.filtered = values;
  11. this.values = (ArrayList)values.clone();
  12. inflater = (LayoutInflater) picker.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  13. }
  14.  
  15. @Override
  16. public View getView(int position,View convertView,ViewGroup parent) {
  17. View v = convertView;
  18. ViewHolder oldHolder;
  19. ViewHolder holder;
  20. Document doc = (Document) filtered.get(position);
  21.  
  22. if (v == null) {
  23. v = inflater.inflate(R.layout.documentpickergriditem,parent,false);
  24.  
  25. holder = new ViewHolder();
  26. holder.actionView = (Button) v.findViewById(R.id.document_action_button);
  27. holder.coverView = (ImageView) v.findViewById(R.id.documentCoverImage);
  28. holder.archiveButton = (Button) v.findViewById(R.id.document_archive_button);
  29. holder.progressView = (ProgressView) v.findViewById(R.id.documentProgress);
  30. holder.progressBar = (ProgressBar) v.findViewById(R.id.documentCoverImageProgressBar);
  31.  
  32.  
  33. picker.allProgressViews.add(holder);
  34. Log.d("MARIANO","adding to allProgressViews "+holder.progressView);
  35. Log.d("MARIANO","inflating position "+position);
  36.  
  37. v.setTag(holder);
  38. }
  39. else{
  40. // here we are recycling,we should clean old stuff.
  41. holder = (ViewHolder)v.getTag();
  42.  
  43.  
  44.  
  45. synchronized (picker){
  46. oldHolder = picker.documentHoldersMap.get(holder.doc);
  47. }
  48.  
  49. if(oldHolder != null){
  50. oldHolder.progressView.setVisibility(View.GONE);
  51. oldHolder.progressBar.setVisibility(View.GONE);
  52. }
  53.  
  54. // Document associated with prevIoUs holder it's now out of the adapter visible window.
  55. // we have to remove it from the map so if picker receives any call back we won't update anything.
  56. if(! holder.doc.uuid().equals(doc)){
  57. synchronized (picker){
  58. picker.documentHoldersMap.remove(holder.doc);
  59. }
  60. }
  61. }
  62.  
  63. holder.doc = doc;
  64. holder.position = position;
  65. synchronized (picker){
  66. picker.documentHoldersMap.put(doc,holder);
  67. }
  68.  
  69. /*
  70. TODO: check why view extendedGrid starts to measure the size of the grid after gridpicker view has disapear. This causes a ArrayOutofIndexes
  71. exception. DocumentGridPicker view does setDocuments(null); which clears all arrays,but the adapter stays setting as many cells as before.
  72. https://kaldorgroup.jira.com/browse/NEWSWEEK-49
  73. */
  74. if(picker.documents() != null && picker.documents().size() > 0 ){
  75. picker.setCoverView(holder.coverView,doc);
  76. picker.setActionButton(holder.actionView,doc);
  77. picker.setArchiveButton(holder.archiveButton,doc);
  78. picker.refreshButton(doc);
  79. }
  80.  
  81. TextView textView = (TextView) v.findViewById(R.id.documentName);
  82. textView.setText(doc.name());
  83.  
  84. if(position == 0)
  85. Log.d("MARIANO","progressView: "+holder.progressView);
  86.  
  87. return v;
  88. }
  89.  
  90. @Override
  91. public Filter getFilter() {
  92. return new Filter() {
  93. @Override
  94. protected FilterResults performFiltering(CharSequence constraint) {
  95. FilterResults result = new FilterResults();
  96.  
  97. if (constraint.equals(DocumentPickerGridViewController.FILTER_DOWNLOADED)) {
  98. ArrayList items = new ArrayList();
  99.  
  100. synchronized (this) {
  101. items.addAll(values);
  102. }
  103.  
  104. for (int i = items.size() - 1; i >= 0; i--) {
  105. if (((Document) items.get(i)).state() != DocumentStates.Downloaded)
  106. items.remove(i);
  107. }
  108.  
  109. result.count = items.size();
  110. result.values = items;
  111. } else { // ALL ITEMS
  112. synchronized (this) {
  113. result.count = values.size();
  114. result.values = values;
  115. }
  116. }
  117. return result;
  118. }
  119.  
  120. @SuppressWarnings("unchecked")
  121. @Override
  122. protected void publishResults(CharSequence constraint,FilterResults results) {
  123. filtered = (ArrayList)results.values;
  124. DocumentPickerGridViewAdapter.this.notifyDataSetChanged();
  125. clear();
  126. for(int i = 0,l = filtered.size(); i < l; i++)
  127. add((Document)filtered.get(i));
  128. notifyDataSetInvalidated();
  129. }
  130. };
  131. }
  132.  
  133. static class ViewHolder{
  134. ImageView coverView;
  135. Button actionView;
  136. Button archiveButton;
  137. ProgressView progressView;
  138. ProgressBar progressBar;
  139. int position;
  140. Document doc;
  141. }
  142.  
  143. }

网格视图 :

  1. <com.kaldorgroup.newsweek.ExpandableGridView
  2. android:id="@+id/documentPickerGridView"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:columnWidth="150dp"
  6. android:numColumns="auto_fit"
  7. android:horizontalSpacing="25dp"
  8. android:stretchMode="spacingWidth"
  9. android:verticalSpacing="20dp"
  10. android:layout_marginTop="10dp"
  11. android:layout_marginBottom="5dp"
  12. android:layout_marginLeft="15dp"
  13. android:layout_marginRight="15dp"
  14. android:isScrollContainer="false"
  15. android:paddingTop="350dp" />

解决方法

我在GridView中遇到了完全相同的问题.在单击列表的第一项时,它不会刷新.我只是改变了代码
  1. public View getView(int position,ViewGroup parent)
  2. {
  3. View v = convertView;
  4. if (convertView == null)
  5. {
  6. LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  7. v = vi.inflate(R.layout.calendar_item,null);
  8. }
  9. .......
  10. }
  11.  
  12. to
  13.  
  14. public View getView(int position,ViewGroup parent)
  15. {
  16. View v = convertView;
  17. // if (convertView == null)
  18. // {
  19. LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  20. v = vi.inflate(R.layout.calendar_item,null);
  21. // }
  22. .......
  23. }
  24.  
  25. It is working fine to me.. But I don't have idea how it happens...
  26. Any Clarification on this will be more helpful!!

猜你在找的Android相关文章