gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:33 25 4
gpt4 key购买 nike

我正在按照 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/

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