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

3
所以基本思路是我有2个ListView。 最初:两个listViews都可见,第一个正确填充,第二个为空但已显示。 点击第一个ListView的一行后:从数据库中获取数据并正确放入第二个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是否与第二个重叠?如果是这样,那么你只是看不到第二个列表,因为第一个在它前面。 - Droidman
从您所描述的情况来看,我认为调用notifyDataSetChanged()应该已经足够了。或者是更改第二个列表视图上的适配器。如果您能发布一些代码,那么帮助您可能会更容易些。 - Corey Scott
我认为 notifyDataSetChanged 是正确的方法来刷新视图。第二个列表视图的布局设置正确吗?检查一下 layout_width 和 layout_height 的值。填充背景颜色到 listview 也是个不错的主意,确保一切正常。如果一切正常但是仍然无法正常工作,展示你的适配器实现将非常有帮助,以便分析问题。 - Chansuk
感谢大家的回复,我非常感激。 我检查了布局,发现第二个布局实际上被第一个布局覆盖,并且与一个TextView重叠。我以一种不会重叠的方式修复了布局,但这并没有解决我的问题。 等我下班后会立即展示代码。 - Odin
好的,你是对的,我在ListView上遇到了问题,它一开始根本不可见...我改变了背景并将其移动到正确的位置,以便它能够正确地显示而不被任何其他对象覆盖...但仍然没有运气...我已经在上面发布了一些代码。 - Odin
经过尝试调试,代码无法通过myList.setAdapter(listadapter); 因此适配器可能存在问题... 适配器仅能通过构造函数。有任何想法吗? - Odin
2个回答

2
我建议您考虑实现片段 (Fragments),原因如下:
  1. 片段有自己的生命周期
  2. 片段可以在同一个活动中很容易地进行通信
  3. 支持平板电脑良好用户界面的最佳做法

enter image description here

如果您有一个ListFragment A和Fragment B,您可以在 "ListFragment B" 上创建监听器,以便在 "ListFragment A" 上选择项目时,使用您的规格填充 Fragment B。我认为这会对您有很大帮助。请查看本文第10节中的示例: http://www.vogella.com/articles/AndroidFragments/article.html

谢谢回复。好主意,我下班后会立即查看。 - Odin
考虑到我正在处理的情况,实现起来可能会很困难...但我给你点赞,因为这篇文章很有帮助。 - Odin

1
经过长时间的调试和挫折,我终于解决了我的问题。
问题是:我在AsyncTask的doInBackground中设置了适配器。
解决方案是:我在onPostExecute中设置了适配器,这样就解决了问题。显然,它与自定义适配器有所干扰。
如果有人能解释一下为什么会这样,我将不胜感激。
非常感谢那些尝试帮助我的人 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接