Android ListFragment和lazyloader适配器错误
我有一个列表片段,它由一个自定义适配器(延迟加载)填充,该适配器应该显示一些文本和图像。因此我构建了一个列表片段和一个自定义适配器来实现这一点。下面是代码,但它抛出了所示的错误(Log cat) ListFragment.javaAndroid ListFragment和lazyloader适配器错误,android,Android,我有一个列表片段,它由一个自定义适配器(延迟加载)填充,该适配器应该显示一些文本和图像。因此我构建了一个列表片段和一个自定义适配器来实现这一点。下面是代码,但它抛出了所示的错误(Log cat) ListFragment.java @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); new loadListV
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new loadListView().execute();
}
protected DashBoardActivity fragmentActivity;
public void onAttach (DashBoardActivity activity){
fragmentActivity = (DashBoardActivity) activity;
}
public class loadListView extends AsyncTask<Integer, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Integer... args) {
motellist = new ArrayList<HashMap<String, String>>();
JSONObject json = JSONfunctions.getJSONfromURL(URL);
try{
JSONArray mot = json.getJSONArray("MOTEL");
for(int i=0;i<mot.length();i++){
HashMap<String, String> map = new HashMap<String, String>();
JSONObject e = mot.getJSONObject(i);
map.put(KEY_ID, e.getString(KEY_ID));
map.put(KEY_NAME, e.getString(KEY_NAME));
map.put(KEY_PRICE, e.getString(KEY_PRICE));
map.put(KEY_ROOMS, e.getString(KEY_ROOMS));
map.put(KEY_REF, e.getString(KEY_REF));
map.put(KEY_PHONE, e.getString(KEY_PHONE));
map.put(KEY_IMAGE_URL, e.getString(KEY_IMAGE_URL));
motellist.add(map);
}
}catch(JSONException e) {
Log.e("log_tag", "Error kupitisha data "+e.toString());
}
return null;
}
@Override
protected void onPostExecute(String args) {
//list = getListView();
adapter=new LazyAdapter (fragmentActivity, motellist);
list.setAdapter(adapter);
/**ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);*/
}
}
使用
getActivity()
而不是fragmentActivity
(在onAttach
中活动可以是null
)。另外,请确保在某个时刻初始化list
。列表已经初始化…考虑到您提供的更改..listfragment只显示加载…实际上并不填充ListView基本上您应该做的是(1)初始化适配器并使用setListAdapter将其绑定到ListView
(adapter)
在onActivityCreated()
中。您还可以调用setlistshighed(false)
以指示数据尚未加载。(2)让您的AsyncTask
生成某种容器对象,该对象保存您的数据并可以绑定到适配器(即光标
)(3)将数据绑定到onPostExecute()
中的适配器(如果之前将其设置为false
,请调用setListShowed(true)
。@jaymo如果找到适合您的解决方案,您应该单击复选标记“接受答案”。)您也应该对旧问题执行此操作。还有,只是提醒一下。。。如果你不经常接受答案,人们将来可能不太愿意回答你的问题!
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return data.get(position);//nilifix hapa ju am using a custom
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.list_row, null);
TextView NAME = (TextView)vi.findViewById(R.id.name);
TextView PRICE = (TextView)vi.findViewById(R.id.board);
TextView REF= (TextView)vi.findViewById(R.id.ref);
TextView ROOMS = (TextView)vi.findViewById(R.id.units);
ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image);
HashMap<String, String> hash = new HashMap<String, String>();
hash = data.get(position);
// Setting all values in listview
NAME.setText(hash.get(ListFragment.KEY_NAME));
PRICE.setText("PRICE: "+hash.get(ListFragment.KEY_PRICE));
REF.setText("REF:"+hash.get(ListFragment.KEY_REF));
ROOMS.setText("ROOMS: "+hash.get(ListFragment.KEY_ROOMS));
imageLoader.DisplayImage(hash.get(ListFragment.KEY_IMAGE_URL), thumb_image);
return vi;
}
0-10 17:42:30.765: E/AndroidRuntime(17557): FATAL EXCEPTION: main
10-10 17:42:30.765: E/AndroidRuntime(17557): java.lang.NullPointerException
10-10 17:42:30.765: E/AndroidRuntime(17557): at com.symetry.myitprovider.fragment.ListFragment$loadListView.onPostExecute(ListFragment.java:92)
10-10 17:42:30.765: E/AndroidRuntime(17557): at com.symetry.myitprovider.fragment.ListFragment$loadListView.onPostExecute(ListFragment.java:1)
10-10 17:42:30.765: E/AndroidRuntime(17557): at android.os.AsyncTask.finish(AsyncTask.java:590)
10-10 17:42:30.765: E/AndroidRuntime(17557): at android.os.AsyncTask.access$600(AsyncTask.java:149)
10-10 17:42:30.765: E/AndroidRuntime(17557): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:603)
10-10 17:42:30.765: E/AndroidRuntime(17557): at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 17:42:30.765: E/AndroidRuntime(17557): at android.os.Looper.loop(Looper.java:132)
10-10 17:42:30.765: E/AndroidRuntime(17557): at android.app.ActivityThread.main(ActivityThread.java:4123)
10-10 17:42:30.765: E/AndroidRuntime(17557): at java.lang.reflect.Method.invokeNative(Native Method)
10-10 17:42:30.765: E/AndroidRuntime(17557): at java.lang.reflect.Method.invoke(Method.java:491)
10-10 17:42:30.765: E/AndroidRuntime(17557): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
10-10 17:42:30.765: E/AndroidRuntime(17557): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
10-10 17:42:30.765: E/AndroidRuntime(17557): at dalvik.system.NativeStart.main(Native Method)