1

从我可以收集它似乎可能是因为我的ListView没有显示,我已验证getCount返回的值不是零,但我可以看不出我做错了什么。ListFragment没有渲染和getView()在适配器没有被调用

所有的加载和行为都像在工作,但是ListView从不出现,我在mixed.xml中的片段引用上放置了一个背景颜色,它在那里并占据了全屏幕,但是当我在我的背景上设置了背景颜色ListView没有出现,就像它根本没有被渲染。

更奇怪的是,我的适配器中没有调用getView,这是我移植到碎片的常规活动的所有工作代码。

我已经打过电话notifyDataSetChanged这并没有改变任何东西,调试显示适配器充满数据和getCount将确实返回准确计数大于0

感谢您的帮助,我被困。

项目已经开放,可以在这里查看http://code.google.com/p/shack-droid/source/browse/#svn%2FTrunk,但我在这里也包括了相关的代码。

这是ListFragment:

public class FragmentTopicView extends ListFragment implements ShackGestureEvent { 

     private ArrayList<ShackPost> posts; 
     private String storyID = null; 

     private String errorText = ""; 
     private Integer currentPage = 1; 
     private Integer storyPages = 1; 
     private String loadStoryID = null; 
     private Boolean threadLoaded = true; 
     private Hashtable<String, String> postCounts = null; 
     private AdapterLimerifficTopic tva; 

     public FragmentTopicView() { 

     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
       // TODO Auto-generated method stub 
       super.onCreate(savedInstanceState); 

       this.setRetainInstance(true); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

       return inflater.inflate(R.layout.topics, null); 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
       super.onActivityCreated(savedInstanceState); 

       final ShackGestureListener listener = Helper.setGestureEnabledContentView(R.layout.topics, getActivity()); 
       if (listener != null) { 
         listener.addListener(this); 
       } 

       if (savedInstanceState == null) { 
         // get the list of topics 
         GetChattyAsyncTask chatty = new GetChattyAsyncTask(getActivity()); 
         chatty.execute(); 
       } 

       ListView lv = getListView(); 
       lv.setOnScrollListener(new OnScrollListener() { 

         @Override 
         public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

           // start loading the next page 
           if (threadLoaded && firstVisibleItem + visibleItemCount >= totalItemCount && currentPage + 1 <= storyPages) { 

             // get the list of topics 
             currentPage++; 
             GetChattyAsyncTask chatty = new GetChattyAsyncTask(getActivity()); 
             chatty.execute(); 

           } 
         } 

         @Override 
         public void onScrollStateChanged(AbsListView view, int scrollState) { 

         } 

       }); 



     } 



    class GetChattyAsyncTask extends AsyncTask<String, Void, Void> { 
       protected ProgressDialog dialog; 
       protected Context c; 

       public GetChattyAsyncTask(Context context) { 
         this.c = context; 
       } 

       @Override 
       protected Void doInBackground(String... params) { 

         threadLoaded = false; 

         try { 
           final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c); 
           final String feedURL = prefs.getString("shackFeedURL", getString(R.string.default_api)); 
           final URL url; 

           if (loadStoryID != null) { 
             if (currentPage > 1) 
               url = new URL(feedURL + "/" + loadStoryID + "." + currentPage.toString() + ".xml"); 
             else 
               url = new URL(feedURL + "/" + loadStoryID + ".xml"); 
           } 
           else { 
             if (currentPage > 1) 
               url = new URL(feedURL + "/" + storyID + "." + currentPage.toString() + ".xml"); 
             else 
               url = new URL(feedURL + "/index.xml"); 
           } 

           // Get a SAXParser from the SAXPArserFactory. 
           final SAXParserFactory spf = SAXParserFactory.newInstance(); 
           final SAXParser sp = spf.newSAXParser(); 

           // Get the XMLReader of the SAXParser we created. 
           final XMLReader xr = sp.getXMLReader(); 
           // Create a new ContentHandler and apply it to the XML-Reader 
           SaxHandlerTopicView saxHandler = new SaxHandlerTopicView(c, "topic"); 

           xr.setContentHandler(saxHandler); 

           // Parse the xml-data from our URL. 
           xr.parse(new InputSource(HttpHelper.HttpRequestWithGzip(url.toString(), c))); 

           // Our ExampleHandler now provides the parsed data to us. 
           if (posts == null) { 
             posts = saxHandler.GetParsedPosts(); 
           } 
           else { 
             ArrayList<ShackPost> newPosts = saxHandler.GetParsedPosts(); 
             newPosts.removeAll(posts); 
             posts.addAll(posts.size(), newPosts); 

           } 

           storyID = saxHandler.getStoryID(); 

           storyPages = saxHandler.getStoryPageCount(); 

           if (storyPages == 0) // XML returns a 0 for stories with only 
                       // one page 
             storyPages = 1; 

         } 
         catch (Exception ex) { 
           // TODO: implement error handling 

         } 

         return null; 
       } 

       @Override 
       protected void onPreExecute() { 
         super.onPreExecute(); 

         if (currentPage == 1) 
           dialog = ProgressDialog.show(getActivity(), null, "Loading Chatty", true, true); 
         else 
           SetLoaderVisibility(View.VISIBLE); 
       } 

       @Override 
       protected void onPostExecute(Void result) { 
         super.onPostExecute(result); 

         ShowData(); 

         SetLoaderVisibility(View.GONE); 

         try { 
           dialog.dismiss(); 
         } 
         catch (Exception e) { 
         } 

       } 

     } 



    private void ShowData() { 

       if (posts != null) { 
         Hashtable<String, String> tempHash = null; 

         final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
         final String login = prefs.getString("shackLogin", ""); 
         final int fontSize = Integer.parseInt(prefs.getString("fontSize", "12")); 

         try { 
           postCounts = GetPostCache(); 
         } 
         catch (Exception ex) { 

         } 
         if (postCounts != null) 
           tempHash = new Hashtable<String, String>(postCounts); 

         if (tva == null) { 
           tva = new AdapterLimerifficTopic(getActivity(), R.layout.lime_topic_row, posts, login, fontSize, tempHash); 
           setListAdapter(tva); 
         } 
         else { 
           tva.SetPosts(posts); 
           tva.notifyDataSetChanged(); 
         } 

         final ListView lv = getListView(); 
         lv.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { 
           @Override 
           public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
             menu.setHeaderTitle("Options"); 
             menu.add(0, 1, 0, "Copy Post Url to Clipboard"); 
             menu.add(0, 2, 0, "Watch Thread"); 
             menu.add(0, 3, 0, "Thread Expires In?"); 
             menu.add(0, 4, 0, "Shacker's Chatty Profile"); 
           } 
         }); 

         // update the reply counts for the listing of topics 
         try { 
           UpdatePostCache(); 

         } 
         catch (Exception e) { 

         } 

       } 
       else { 
         if (errorText.length() > 0) { 

           try { 
             new AlertDialog.Builder(getActivity()).setTitle("Error").setPositiveButton("OK", null).setMessage(errorText).show(); 
           } 
           catch (Exception ex) { 
             // could not create a alert for the error for one reason 
             // or another 
             Log.e("ShackDroid", "Unable to create error alert ActivityTopicView:468"); 
           } 
         } 
       } 
       threadLoaded = true; 
     } 

} 

这里是我的FragmentActivity:

public class FragmentActivityTopic extends FragmentActivity { 
     @Override 
     protected void onCreate(Bundle arg) { 
       // TODO Auto-generated method stub 
       super.onCreate(arg); 

       setContentView(R.layout.mixed); 
     } 
} 

这是我使用的适配器,上面getView提到不会被调用:

public class AdapterLimerifficTopic extends BaseAdapter { 

     // private Context context; 
     private List<ShackPost> topicList; 
     private final int rowResouceID; 
     private final String shackLogin; 
     private final Typeface face; 
     private final int fontSize; 
     private final Hashtable<String, String> postCache; 
     private final String showAuthor; 
     private final Resources r; 
     private int totalNewPosts = 0; 

     LayoutInflater inflate;// = LayoutInflater.from(context); 

     public AdapterLimerifficTopic(Context context, int rowResouceID, List<ShackPost> topicList, String shackLogin, int fontSize, Hashtable<String, String> postCache) { 
       this.topicList = topicList; 
       this.rowResouceID = rowResouceID; 
       this.shackLogin = shackLogin; 
       this.fontSize = fontSize; 
       this.postCache = postCache; 
       this.r = context.getResources(); 

       face = Typeface.createFromAsset(context.getAssets(), "fonts/arial.ttf"); 

       final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
       showAuthor = prefs.getString("showAuthor", "count"); 

       inflate = LayoutInflater.from(context); 
     } 
     public void SetPosts(List<ShackPost> posts) 
     { 
       topicList = posts; 
     } 
     @Override 
     public int getCount() { 
       return topicList.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
       return topicList.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
       // return position; 
       final ShackPost post = topicList.get(position); 
       return Long.parseLong(post.getPostID()); 
     } 

     static class ViewHolder { 
       TextView posterName; 
       TextView datePosted; 
       TextView replyCount; 
       TextView newPosts; 
       TextView postText; 
       TextView viewCat; 
       RelativeLayout topicRow; 
       ImageView postTimer; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

       // TextView tmp; 
       // final View v; 
       ViewHolder holder; 
       final ShackPost post = topicList.get(position); 

       if (convertView == null) { 
         convertView = inflate.inflate(rowResouceID, parent, false); 
         holder = new ViewHolder(); 
         holder.posterName = (TextView) convertView.findViewById(R.id.TextViewLimeAuthor); 
         holder.datePosted = (TextView) convertView.findViewById(R.id.TextViewLimePostDate); 
         holder.replyCount = (TextView) convertView.findViewById(R.id.TextViewLimePosts); 
         holder.newPosts = (TextView) convertView.findViewById(R.id.TextViewLimeNewPosts); 
         holder.postText = (TextView) convertView.findViewById(R.id.TextViewLimePostText); 
         holder.viewCat = (TextView) convertView.findViewById(R.id.TextViewLimeModTag); 
//      holder.topicRow = (RelativeLayout) convertView.findViewById(R.id.TopicRow); 
//      holder.postTimer = (ImageView) convertView.findViewById(R.id.ImageViewTopicTimer); 

//      holder.posterName.setTypeface(face); 
//      holder.datePosted.setTypeface(face); 
//      holder.replyCount.setTypeface(face); 
//      holder.newPosts.setTypeface(face); 
         holder.postText.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize); 
//      holder.postText.setTypeface(face); 

         convertView.setTag(holder); 
       } 
       else { 
         holder = (ViewHolder) convertView.getTag(); 
       } 

//    holder.postTimer.setImageResource(Helper.GetTimeLeftDrawable(post.getPostDate())); 
// 
       holder.posterName.setText(post.getPosterName()); 
// 
//    if (shackLogin.equalsIgnoreCase(post.getPosterName())) 
//      holder.posterName.setTextColor(Color.parseColor("#00BFF3")); 
//    else 
//      holder.posterName.setTextColor(Color.parseColor("#ffba00")); 
// 
       holder.datePosted.setText(Helper.FormatShackDateToTimePassed(post.getPostDate())); 

       holder.replyCount.setText(post.getReplyCount()); 
// 
//    if (showAuthor.equalsIgnoreCase("count") && post.getIsAuthorInThread()) 
//      holder.replyCount.setTextColor(Color.parseColor("#0099CC")); 
//    else 
//      holder.replyCount.setTextColor(Color.parseColor("#FFFFFF")); 
// clipped code 
       holder.postText.setText(preview); 


//    if (showAuthor.equalsIgnoreCase("topic") && post.getIsAuthorInThread()) { 
//      final Drawable d = r.getDrawable(R.drawable.background_gradient_blue); 
//      holder.topicRow.setBackgroundDrawable(d); 
//    } 
//    else 
//      holder.topicRow.setBackgroundDrawable(null); 


       // TODO: clean this up a little/also replicated in ShackDroidThread ick 
       final String postCat = post.getPostCategory(); 
       holder.viewCat.setVisibility(View.VISIBLE); 

       if (postCat.equals("offtopic")) { 
         holder.viewCat.setText("offtopic"); 
         holder.viewCat.setBackgroundColor(Color.parseColor("#444444")); 
       } 
       else if (postCat.equals("nws")) { 
         holder.viewCat.setText("nws"); 
         holder.viewCat.setBackgroundColor(Color.parseColor("#CC0000")); 
       } 
       else if (postCat.equals("political")) { 
         holder.viewCat.setText("political"); 
         holder.viewCat.setBackgroundColor(Color.parseColor("#FF8800")); 
       } 
       else if (postCat.equals("stupid")) { 
         holder.viewCat.setText("stupid"); 
         holder.viewCat.setBackgroundColor(Color.parseColor("#669900")); 
       } 
       else if (postCat.equals("informative")) { 
         holder.viewCat.setText("interesting"); 
         holder.viewCat.setBackgroundColor(Color.parseColor("#0099CC")); 
       } 
       else 
         holder.viewCat.setVisibility(View.GONE);     


       return convertView; 
     } 

     public int getTotalNewPosts() { 
       return totalNewPosts; 
     } 

} 

及相关XML:

mixed.xml(这是片段的布局中,只有一个用于现在)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:id="@+id/LinearLayoutMixed"> 

    <fragment 
     android:id="@+id/MixedThreads" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     class="com.stonedonkey.shackdroid.FragmentTopicView" 
     > 
    </fragment> 

</LinearLayout> 

Topics.xml(这包含的ListView以及一个滑动盘和一些其他的东西。

<?xml version="1.0" encoding="utf-8"?> 
     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" > 

      <ListView 
       android:id="@android:id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_above="@+id/TopicLoader" 
       android:divider="#333333" 
       android:dividerHeight="1dip" 
       android:textColor="#FFFFFF" 

       /> 

      <RelativeLayout 
       android:id="@+id/TopicLoader" 
       android:layout_width="fill_parent" 
       android:layout_height="35dip" 
       android:layout_alignParentBottom="true" 
       android:gravity="center_horizontal" 
       android:visibility="gone" 
       android:layout_marginTop="5dip" > 

       <TextView 
        android:id="@+id/TextViewTopicLoaderText" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:focusable="false" 
        android:focusableInTouchMode="false" 
        android:text="Loading" 

        > 
       </TextView> 

       <ImageView 
        android:id="@+id/ImageViewTopicLoader" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_toRightOf="@+id/TextViewTopicLoaderText" 
        android:src="@drawable/ic_action_refresh" 
        android:layout_alignBottom="@+id/TextViewTopicLoaderText" 
        /> 
      </RelativeLayout> 

      <SlidingDrawer 
       android:id="@+id/SlidingDrawer01" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_below="@+id/TopicLoader" 
       android:animateOnClick="true" 
       android:content="@+id/bookMarkParent" 
       android:handle="@+id/TextViewTrayHandle" 
       android:orientation="vertical" 
       android:paddingTop="200dip" 
       android:visibility="gone" > 

       <TextView 
        android:id="@+id/TextViewTrayHandle" 
        android:layout_width="fill_parent" 
        android:layout_height="35dip" 
        android:background="@drawable/darkgrey_gradient" 
        android:focusable="false" 
        android:focusableInTouchMode="false" 
        android:gravity="center_vertical" > 
       </TextView> 

       <RelativeLayout 
        android:id="@id/bookMarkParent" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" > 

        <ListView 
         android:id="@+id/ListViewWatchedThreads" 
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent" 
         android:divider="#333333" 
         android:dividerHeight="1dip" 
         android:textColor="#FFFFFF" > 
        </ListView> 
       </RelativeLayout> 
      </SlidingDrawer> 

     </RelativeLayout> 

最后lime_topic_row这对于上述布局ListView中我的自定义行布局:

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:background="#FF0000" > 

     <TextView 
      android:id="@+id/TextViewLimeModTag" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="#FF0000" 
      android:layout_alignParentLeft="true" 
      android:layout_marginLeft="10dip" 
      android:textColor="#000000" 
      android:padding="2dip" 
      android:textSize="10dip" 
      />  
     <TextView 
      android:id="@+id/TextViewLimePostText" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:minHeight="20dip" 
      android:padding="10dip" 
      android:layout_below="@+id/TextViewLimeModTag" 
      android:textColor="#FFFFFF" /> 

     <TextView 
      android:id="@+id/TextViewLimeAuthor" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/TextViewLimePostText" 
      android:paddingBottom="10dip" 
      android:paddingLeft="10dip" 
      android:textColor="#0099CC" /> 

     <TextView 
      android:id="@+id/TextViewPosted" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/TextViewLimePostText" 
      android:layout_toRightOf="@+id/TextViewLimeAuthor" 
      android:paddingBottom="10dip" 
      android:text=" posted " /> 

     <TextView 
      android:id="@+id/TextViewLimePostDate" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/TextViewLimePostText" 
      android:layout_toRightOf="@+id/TextViewPosted" 
      android:paddingBottom="10dip" 
      android:paddingRight="10dip" 
      android:textColor="#FF8800" /> 



     <TextView 
      android:id="@+id/TextViewLimePosts" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBaseline="@+id/TextViewLimePostDate" 
      android:layout_marginRight="3dip" 
      android:layout_below="@+id/TextViewLimePostText" 
      android:layout_marginBottom="15dip" 
      android:layout_toLeftOf="@+id/TextViewLimeNewPosts" 
      android:background="#BBBBBB" 
      android:padding="3dip" 
      android:minWidth="25dip" 
      android:gravity="center" 
      android:textColor="#000000" /> 

     <TextView 
      android:id="@+id/TextViewLimeNewPosts" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBaseline="@+id/TextViewLimePostDate" 
      android:layout_below="@+id/TextViewLimePostText" 
      android:layout_marginBottom="15dip" 
      android:layout_marginRight="10dip" 
      android:background="#669900" 
      android:padding="3dip" 
      android:minWidth="25dip" 
      android:gravity="center" 
      android:layout_alignParentRight="true" 
      android:textColor="#000000" /> 

    </RelativeLayout> 
+0

你在哪里设置适配器到列表视图? – 2012-07-20 03:16:09

+0

它在ShowData()方法中的ListFragment中设置,它在完成后在AsyncTask中调用。 – stonedonkey 2012-07-20 03:18:39

+0

你可以把项目的文件归档到某个地方吗?我想查看代码,但我不工作或有颠覆,我不想从存储库中复制文件。 – Luksprog 2012-07-20 06:46:53

回答

1

我想我找到了问题。这个问题似乎是因为ShackGestureListener你设置在onActivityCreated方法在FragmentTopicView开始的:

final ShackGestureListener listener = Helper.setGestureEnabledContentView(R.layout.topics, getActivity()); 
if (listener != null) { 
    listener.addListener(this); 
} 

setGestureEnabledContentView()方法你检查,看看用户是否启用了手势的喜好或者如果Android版本是大于3.无论哪种方式,truefalse您设置FragmentActivityTopic再次(具有FragmentTopicView的布局)的内容视图。遗憾的是,再次设置内容视图将覆盖当前布局,该布局将ListView与数据(没有问题的ListView)保持在一起。当您运行这些AsyncTasks以获取数据时,最后您将数据设置在正确的ListView(由getListView返回)上,因为getListView将保留对在onCreateView方法中设置的旧正确ListView的引用,没有看到任何东西,因为在setGestureEnabledContentView中你覆盖了这个ListView

如果您简单地注释掉(或删除)为HelperHelperAPI4类中的活动设置内容视图的行,此行为很容易看出。另一种方式来看到你的ListView覆盖,例如设置为使用getListViewListViewTVA)适配器和使用getActivity().findViewById(android.R.id.list)(我做这个关于选择菜单中的项目之一,所以我可以控制我更换适配器):

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    Intent intent; 
    switch (item.getItemId()) 
    { 
    case R.id.topic_menu_newpost: // Launch post form 
//this doesn't work as the getListView will return a reference to the old ListView 
ListView lv = getListView(); 
lv.setAdapter(tva); 
// this will work as you get a reference to the new ListView on top 
ListView lv = (ListView) getActivity().findViewById(android.R.id.list); 
lv.setAdapter(tva); 

我不知道该怎么建议的解决方案,我不太明白你在做什么,但我怀疑它需要来设置内容视图活动再次(你应该从这工作)。