[英]Android ListView not Populating in fragment
我试图查询解析每个类中的每个条目并将其添加到数组列表以显示在ListView上。 我正在尝试在片段上执行此操作。 但我没有在列表中显示任何项目,在日志中,我可以看到已检索到4个正确的项目,但未显示。 我在使用以下代码的任何建议:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import java.util.ArrayList;
import java.util.List;
/**
* A simple {@link Fragment} subclass.
*/
public class InventoryDisplayFragment extends Fragment {
ArrayList<String> inventoryItems;
ArrayAdapter arrayAdapter;
public InventoryDisplayFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
inventoryItems = new ArrayList<String>();
arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, inventoryItems);
final View rootView = inflater.inflate(R.layout.fragment_inventory_display, container, false);
final ListView productsList = (ListView) rootView.findViewById(R.id.itemlistView);
ParseQuery<ParseObject> query = ParseQuery.getQuery("Inventory");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> stockItemList, ParseException e) {
if(e == null){
if(stockItemList.size() > 0){
for(ParseObject unit : stockItemList){
inventoryItems.add(unit.get("productName").toString());
Log.d("unit", "retrieved: " + stockItemList.size());
}
productsList.setAdapter(arrayAdapter);
}
} else {
Log.d("unit", "Error: " + e.getMessage());
}
}
});
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_inventory_display, container, false);
}
}
实际上,您需要返回rootView,您正在再次扩大视图并返回它,因此它不可见。
公共视图onCreateView(LayoutInflater充气器,ViewGroup容器,捆绑的saveInstanceState){
inventoryItems = new ArrayList<String>();
arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, inventoryItems);
final View rootView = inflater.inflate(R.layout.fragment_inventory_display, container, false);
final ListView productsList = (ListView) rootView.findViewById(R.id.itemlistView);
ParseQuery<ParseObject> query = ParseQuery.getQuery("Inventory");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> stockItemList, ParseException e) {
if(e == null){
if(stockItemList.size() > 0){
for(ParseObject unit : stockItemList){
inventoryItems.add(unit.get("productName").toString());
Log.d("unit", "retrieved: " + stockItemList.size());
}
productsList.setAdapter(arrayAdapter);
}
} else {
Log.d("unit", "Error: " + e.getMessage());
}
}
});
// Inflate the layout for this fragment
return rootview;
}
您正在尝试在ListView
显示可能尚未膨胀的内容。 如果对Parse
的调用快于通胀,则可能会看到NullPointerException
。 将Parse
代码移动到onViewCreated()
。
另外,您将空List
传递给ArrayAdapter
,然后将项目添加到List
。 您需要调用notifyDatasetChanged()
。
为什么要再次扩大视图范围,只需在oncreate方法中返回rootVIew即可。 你也可以实例化适配器
for(ParseObject unit : stockItemList){
inventoryItems.add(unit.get("productName").toString());
Log.d("unit", "retrieved: " + stockItemList.size());
}
arrayAdapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, inventoryItems);
handler.postAtFrontofQueue(new Runnable(){
productsList.setAdapter(arrayAdapter);
});
在您的oncreate方法中实例化处理程序的位置。
handler = new Handler()
尝试将适配器设置在主线程上。
getActivity().runOnUiThread (new Runnable .... etc )
做notifyDataSetChanged()也可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.