【问题标题】:Android 2.3 Custom ArrayAdapter getView Method Not Being CalledAndroid 2.3 自定义 ArrayAdapter getView 方法未被调用
【发布时间】:2017-04-03 06:51:43
【问题描述】:

编辑:解决了...大部分。在 getView() 中对 Lod.g(...) 的调用仍然没有出现在 LogCat 中,但一切似乎都在工作。以下代码已更新为工作版本。

我的 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) {

        }
    });
}

【问题讨论】:

    标签: java android xml listview android-arrayadapter


    【解决方案1】:
    #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) {
    
            }
        });
    
        }
    }
    

    【讨论】:

    • 我很好奇为什么每次添加孩子时都需要调用 setAdapter() 。我以为这是一劳永逸的事情。我还删除了对 postAdapter.add(post) 的调用,因为它引发了空指针异常,并且还在 postAdatper 中创建了重复条目。然而,真正的问题仍未解决 - getView() 仍未被调用。
    • postAdapter.notifyDataSetChanged(); // 此函数用于在数据集发生更改时通知列表视图。所以不需要在 childAdded 监听器中调用 setAdapter。我有同样的问题,通过在创建数据集时调用 setAdapter 来解决,如果它对你有用,那就太好了。
    【解决方案2】:

    所以事实证明问题与我使用的 ContraintLayout 有关。对格式和列表进行了一些调整。我已经更新了代码以反映我现在的工作实现。有趣的是,我在 getView() 中的 Log.d(...) 调用仍然没有出现,即使所有的工作都必须调用 getView 必须。还是不知道怎么解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多