2017-04-03 125 views
0

編輯:解決...主要。調用LOD.g(...)在getView()中仍然沒有出現在LogCat中,但似乎一切正常。下面的代碼已更新爲工作版本。Android 2.3自定義ArrayAdapter getView方法不被稱爲

我一個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) { 

     } 
    }); 
} 

回答

0
#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) { 

     } 
    }); 

    } 
} 
+0

我很好奇爲什麼每次添加子項時都要調用setAdapter()。我認爲這是一個一勞永逸的事情。我還刪除了對postAdapter.add(post)的調用,因爲它引發了空指針異常,並且還在postAdatper中創建了重複條目。然而,真正的問題仍然沒有解決 - getView()仍然沒有被調用。 – Hayden

+0

postAdapter.notifyDataSetChanged(); //這個函數用於在數據集發生變化時通知列表視圖。所以不需要在childAdded監聽器中調用setAdapter。 我有同樣的問題,這是通過創建數據集時調用setAdapter來解決的,如果它適用於您,那麼它很好。 –

0

因此,原來,這個問題曾與做我正在使用的ContraintLayout。顯示格式和列表的一些調整。我已經更新了代碼以反映我現在的工作實施。有趣的是,我的Log.d(...)調用裏面getView()仍然沒有顯示出來,即使對於所有的工作getView 必須被調用。仍然不知道如何解釋一個。

相關問題