[英]Android 2.3 Custom ArrayAdapter getView Method Not Being Called
编辑:解决了...大部分。 在LogCat中仍未显示对getView()中的Lod.g(...)的调用,但一切似乎都正常。 以下代码已更新为工作版本。
我的ArrayAdapter类:
public class PostAdapter extends ArrayAdapter<Post> {
//fields
private LayoutInflater inflater;
private ArrayList<Post> posts;
//constructor
public PostAdapter(Context context, ArrayList<Post> posts) {
super(context, R.layout.post_layout, R.id.title, posts);
this.inflater = LayoutInflater.from(context);
this.posts = posts;
}
//methods
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//get data item for this position
Post post = (Post)getItem(position);
//check if existing view is being reused, otherwise inflate the view
if(convertView == null) {
convertView = inflater.inflate(R.layout.post_layout, parent, false);
}
//Populate views with data
TextView title = (TextView) convertView.findViewById(R.id.title);
title.setText(post.getTitle());
TextView subTitle = (TextView) convertView.findViewById(R.id.subTitle);
subTitle.setText(post.getDescription());
//return completed view to render on screen
return convertView;
}
@Override
public int getCount() {
return posts.size();
}
}
以及我创建ArrayAdapter的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_screen);
//Initializing feed variables
posts = new ArrayList<>();
postAdapter = new PostAdapter(this, posts);
list = (ListView) findViewById(R.id.list);
//attaching Adapter to ListView
list.setAdapter(postAdapter);
DatabaseReference p = database.getReference("posts");
p.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
//get reference to post
HashMap<Object, Object> entry = (HashMap<Object, Object>) dataSnapshot.getValue();
//convert to Post.class datatype
Post post = new Post();
if (entry.get("category") != null) { post.setCategory(entry.get("category").toString()); }
if (entry.get("title") != null) { post.setTitle(entry.get("title").toString()); }
if (entry.get("description") != null) { post.setDescription(entry.get("description").toString()); }
if (entry.get("hasImg") != null) { post.setImg((boolean)entry.get("hasImg")); }
if (entry.get("postKey") != null) { post.setPostKey(entry.get("postKey").toString()); }
if (entry.get("posterID") != null) { post.setPosterID(entry.get("posterID").toString()); }
if (entry.get("schoolID") != null) { post.setSchoolID(entry.get("schoolID").toString()); }
if (entry.get("flagged") != null) { post.setFlagged((long)entry.get("flagged")); }
if (entry.get("time") != null) { post.setTime((long)entry.get("time")); };
//add to ArrayList
posts.add(post);
postAdapter.notifyDataSetChanged();
Log.d("LIST", "Post Added: Posts: " + postAdapter.getCount());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
#List adapter is getting initialized with zero posts elements.
#list.setAdapter(postAdapter) : put into childAdded listener.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_screen);
//retrieve post data from firebase
posts = new ArrayList<>();
//ListView and PostAdapter
list = (ListView) findViewById(R.id.list);
postAdapter = new PostAdapter(this, posts);
DatabaseReference p = database.getReference("posts");
p.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
//get reference to post
HashMap<Object, Object> entry = (HashMap<Object, Object>) dataSnapshot.getValue();
//convert to Post.class datatype
Post post = new Post();
if (entry.get("category") != null) { post.setCategory(entry.get("category").toString()); }
if (entry.get("title") != null) { post.setTitle(entry.get("title").toString()); }
if (entry.get("description") != null) { post.setDescription(entry.get("description").toString()); }
if (entry.get("hasImg") != null) { post.setImg((boolean)entry.get("hasImg")); }
if (entry.get("postKey") != null) { post.setPostKey(entry.get("postKey").toString()); }
if (entry.get("posterID") != null) { post.setPosterID(entry.get("posterID").toString()); }
if (entry.get("schoolID") != null) { post.setSchoolID(entry.get("schoolID").toString()); }
if (entry.get("flagged") != null) { post.setFlagged((long)entry.get("flagged")); }
if (entry.get("time") != null) { post.setTime((long)entry.get("time")); };
//add to ArrayList
posts.add(post);
postAdapter.add(post);
//attaching Adapter to ListView
list.setAdapter(postAdapter);
Log.d("LIST", "Item count: " + postAdapter.getCount());
postAdapter.notifyDataSetChanged();
Log.d("LIST", "Post Added: Posts: " + postAdapter.getCount());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
因此事实证明,问题与我使用的ContraintLayout有关。 对格式和列表进行了一些调整。 我已经更新了代码以反映我现在可以正常工作的实现。 有趣的是,即使必须正常运行getView,我在getView()中的Log.d(...)调用仍然没有显示。 仍然不确定如何解释这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.