使用自定义适配器刷新可见 ListView

Posted

技术标签:

【中文标题】使用自定义适配器刷新可见 ListView【英文标题】:Refresh visible ListView with Custom Adapter 【发布时间】:2013-08-25 22:30:37 【问题描述】:

所以基本上我的想法是我有 2 个 ListViews

最初:两个列表视图都是可见的,第一个被正确填充,第二个是但已经显示

点击第一个ListView的一行后:从数据库中获取数据并正确放入第二个

问题和问题:

正在正确获取数据,但第二个 ListView 仍然为空,并且根本没有调用 getView()

1-有没有办法在不刷新页面的情况下加载第二个ListView

2- getView() 没有被调用,因为该行不可见,对吗?如何绕过这个问题?

尝试使用 notifyDataSetChanged() 然后验证 第二个 ListView

非常感谢您的帮助

代码

CustomAdapter.java

public class CustomAdapter extends  ArrayAdapter<ListItem>
  
LayoutInflater inflater;
List<ListItem> items;

public CustomAdapter(Context context, int textViewResourceId, List<ListItem> items2) 
    super(context, textViewResourceId);
    this.items = items2;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);



@Override  
public int getCount()   
    return items.size();  
  


@Override
public ListItem getItem(int position) 
        return ((CustomAdapter) items).getItem(position);


@Override  
public long getItemId(int position)   
    return position;  

 
@Override  
public View getView(final int position, View convertView, ViewGroup parent)   
    
    final ListItem holder;
    final ListItem item = items.get(position);
    
    
    View vi=convertView;
    
    if(vi==null)
        vi = inflater.inflate(R.layout.popup_toping, null);
        holder = new ListItem();
        holder.text = (TextView) vi.findViewById(R.id.text);
        
        holder.Check = (CheckBox) vi.findViewById(R.id.check);
        
        vi.setTag(holder);
    else
        holder = (ListItem) vi.getTag();
   
    
    
    
    holder.text.setText(item.t);
    
    holder.Check.setChecked(item.IsChecked);
    
    return vi;
  


主要活动的实施

List<ListItem> items = new ArrayList<ListItem>();;
items.add(new ListItem()
                            t= c.getString("first_text");
                            IsChecked = false;
                        );
                        
                
CustomAdapter listadapter = new CustomAdapter(context, R.layout.popup, items);                      
myList.setAdapter(listadapter);
listadapter.notifyDataSetChanged();
myList.invalidate();

【问题讨论】:

第一个 ListView 是否与布局中的第二个重叠?在这种情况下,您将无法看到您的第二个列表,因为它前面有第一个。 根据您的描述,我希望调用 notifyDataSetChanged() 就足够了。那或更改第二个列表视图上的适配器。如果您可以发布一些代码,可能会更容易帮助您 我认为 notifyDataSetChanged 是刷新视图的正确方法。第二个列表视图的布局是否设置正确?如何检查 layout_width 和 layout_height 值。将背景颜色填充到列表视图并检查一切是否正常也是一个好主意。如果一切正常但不能正常工作,那么展示您的适配器实现对分析问题非常有帮助。 感谢大家的回复,我真的很喜欢它。我检查了布局,第二个实际上与第一个重叠,并且与 TextView 重叠。我以一种方式修复了布局它没有重叠,但它没有解决我的问题。我会在我下班后立即显示代码 好吧,你是对的,我的 ListView 有问题,它从一开始就完全不可见。我改变了背景并移动了它,这样它就可以正常可见,并且不会被其他任何东西重叠对象..但现在仍然很幸运...我在上面发布了一些代码 【参考方案1】:

出于几个原因,我建议您考虑实施 Fragments...

    片段有自己的生命周期 Fragments 可以非常轻松地在同一个 Activity 中进行通信 支持平板电脑良好 UI 的最佳做法

因此,如果您有 ListFragment A 和 Fragment B,您可以在“ListFragment B”上创建一个侦听器,以便在 ListFragment A 上选择项目时,Fragment B 会填充您的规范。我想这会对你有很大帮助。请看本文第 10 节中的此示例: http://www.vogella.com/articles/androidFragments/article.html

【讨论】:

感谢您的回复。好主意,我一下班就去看看 考虑到我正在处理的情况将是一个艰难的实现。但我 +1 你的帖子,因为它很有帮助【参考方案2】:

经过长时间的调试和挫折,我终于解决了我的问题..

问题:我在 AsyncTask

doInBackground 中设置了适配器

解决方案:我在 onPostExecute 中设置了适配器,它解决了我的问题..显然它以某种方式干扰了自定义适配器..

如果有人能解释原因,我将不胜感激..

非常感谢那些试图帮助我的人:)

【讨论】:

以上是关于使用自定义适配器刷新可见 ListView的主要内容,如果未能解决你的问题,请参考以下文章

删除数据库行后刷新自定义游标适配器

如何动态刷新 ListView?

安卓ListView的使用

自定义控件基础02_下拉刷新_侧拉菜单_自定义属性

如何从适配器访问 ListView

使用自定义(对象)适配器过滤 ListView