2015-02-06 76 views
0

我有一个片段内的listView(ListFragment不适用,因为有视图中的其他控件)。 它运行正常,但列表未填充。 日志和调试显示,适配器的getView被调用,一切都很好。只是没有显示。在片段中的listView不工作(不显示)

这里是片段

public class FoundFragment extends BaseFragment { 

private ArrayList<Record> recordsList; 
private ListView recordsListView; 
private final String LOG_TAG = "FoundFragment"; 
private RecordsListAdapter recordsListAdapter; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
}//end onCreate 
//----------------------------------------------------------------------------------// 
@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 
    // The last two arguments ensure LayoutParams are inflated properly. 
    View rootView = inflater.inflate(
      R.layout.frag_found, container, false); 
    return rootView; 
}//end onCreateView 
//------------------------------------------------------------------------------------// 
@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    recordsListView = (ListView) getView().findViewById(R.id.foundRecordsListView); 

} 
//------------------------------------------------------------------------------------// 
@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    new RecordsLoaderTask().execute(false); 
} 
//------------------------------------------------------------------------------------// 
@Override 
public void onResume() { 
    super.onResume(); 
    if(recordsListAdapter != null){ 
    recordsListAdapter.notifyDataSetChanged(); 
    } 
} 
/********************************************************************/ 
@SuppressWarnings("unchecked") 
@Override 
public void onDataRetrievalSucceeded(Object dataRetrieved) { 
    Log.d("FoundFragment", "arrayRetrived with length of " 
          + ((ArrayList<Record>) dataRetrieved).size()); 
    recordsList = (ArrayList<Record>) dataRetrieved; 
    recordsListAdapter = new RecordsListAdapter(getActivity(), recordsList); 
    recordsListView.setAdapter(recordsListAdapter); 
    Log.e(LOG_TAG, "adapterOfList is " + recordsListView.getAdapter() + "\n" + 
    "length is " + recordsListView.getAdapter().getCount()); 
    //TODO check here 
    if(recordsListAdapter != null){ 
     recordsListAdapter.notifyDataSetChanged(); 
     } 
}//end onDataRetrievalSucceeded 
}//end fragment 

适配器:

private class RecordsListAdapter extends BaseAdapter{ 

    private LayoutInflater mInflater; 
    private ArrayList<Record> recsList; 
    //--------------------------------------------------------------------//   
    public RecordsListAdapter(Context context, ArrayList<Record> records) { 
     // Cache the LayoutInflate to avoid asking for a new one each time. 
     System.out.println("in constructor of adaapter"); 
     mInflater = LayoutInflater.from(context); 
     recsList = records; 
    } 
    //--------------------------------------------------------------------// 
    @Override 
    public int getCount() { 
     Log.d(LOG_TAG, "categories adapter get size = " + recsList.size()); 
     return recsList.size(); 
    } 
    //--------------------------------------------------------------------// 
    @Override 
    public Object getItem(int position) { 
     return recsList.get(position); 
    } 
    //--------------------------------------------------------------------// 
    @Override 
    public long getItemId(int position) { 
     return position; 
    } 
    //--------------------------------------------------------------------// 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null){ 
      convertView = mInflater.inflate(R.layout.records_list_item, parent, false); 
      holder = new ViewHolder(); 
      holder.name = (TextView) convertView.findViewById(R.id.recordItemNameTxtView); 
      holder.age = (TextView) convertView.findViewById(R.id.recordItemAgeTxtView); 
      holder.img = (CircularImageView) convertView.findViewById(R.id.recordItemImgView); 

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

     Record curRecord = recsList.get(position); 
     /*setting data from the item into the fields*/; 
     holder.name.setText(curRecord.getName()); 
     holder.age.setText(curRecord.getAge()); 
     Log.d(LOG_TAG, "curRecord image link is " + curRecord.getThumbURL()); 
     //TODO image download 
     /*if(curRecord.getThumbURL() != null && !curRecord.getThumbURL().equals("") 
       && !curRecord.getThumbURL().equals("null")){ 
      Log.d(LOG_TAG, "in if b4 download image"); 
      holder.img.setImageBitmap(
        ImageDownloader.DownloadImage(curRecord.getThumbURL())); 

      progressDialog.cancel(); 
      System.out.println("after image download"); 
     }//end if --> imag link is available 
     else{ 
      System.out.println("image link is not available"); 
     }*/ 
     Log.w(LOG_TAG, "convertView " + 
     convertView + ", " + ((ViewHolder)convertView.getTag()).name.getText().toString()); 
     return convertView; 
    }//end method getView 
    //////////////////////////////////////////////////////////////////////////////////// 
    class ViewHolder{ 
     TextView name; 
     TextView age; 
     CircularImageView img; 
    } 


}//end class RecordsListAdapter 

XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:background="#0000ff" > 
    <ListView 
    android:id="@+id/foundRecordsListView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:cacheColorHint="@android:color/transparent" 
    > 
</ListView> 
</LinearLayout> 

回答

0

列表项高度是问题。 调整列表项目布局并设置最小高度解决了它。 感谢Omnia Sayed

-1

变化充气线

convertView = inflater.inflate(R.layout.records_list_item, null); 
+0

同样的事情。尝试之前并没有工作 – Rowan 2015-02-10 12:31:22

0

最有可能发生的事情是您的Adapter(首先)在onActivityCreated()中被创建(onViewCreated())。我建议让一个点创建您的Adapter,如onCreateView(),这样它就可以立即设置为您的ListView的适配器。然后启动您的数据下载任务。完成后,它会创建一个新的List数据并通过自定义RecordsListAdapter.replaceData()方法将其提交给适配器。在该方法的内部,您的适配器应该交换其支持数据并调用它自己的notifyDataSetChanged(),以便ListView会要求它重新填充视图。

+0

onViewCreated()中的适配器创建被注释。我认为创作是问题。但它不是.. – Rowan 2015-02-10 12:28:28

+1

我仍然建议重构和清理这个,因为它很难遵循和开始''onActivityCreated()''中的数据加载可能导致数据完成回调调用之前,你的onCreateView( )'被调用,导致一个NPE,因为'ListView'还没有被创建。 – 2015-02-10 12:40:46

+0

这是一个很好的提示。谢谢 – Rowan 2015-03-13 16:30:32