Android 将ArrayList的内容放入ArrayAdapter
我有一个存储JSON内容的ArrayList和一个显示它的Android 将ArrayList的内容放入ArrayAdapter,android,android-listview,arraylist,android-arrayadapter,Android,Android Listview,Arraylist,Android Arrayadapter,我有一个存储JSON内容的ArrayList和一个显示它的ArrayAdapter。现在我正在尝试保存这个JSON内容,这样用户即使在脱机时也可以看到它 我按照这个问题这样做: 上面的问题允许我们将ArrayList保存在外部存储器上的文件中 现在,我想在用户离线时启动应用程序时,在我的arrayAdapter中显示存储的ArrayList(即actorList)的内容 这是迄今为止我的代码,当使用NullPointerException @Override public View on
ArrayAdapter
。现在我正在尝试保存这个JSON内容,这样用户即使在脱机时也可以看到它
我按照这个问题这样做:
上面的问题允许我们将ArrayList保存在外部存储器上的文件中
现在,我想在用户离线时启动应用程序时,在我的arrayAdapter中显示存储的ArrayList(即actorList)的内容
这是迄今为止我的代码,当使用NullPointerException
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_photos, container, false);
if (isNetworkAvailable()) {
actorsList = new ArrayList<Actors>();
new JSONAsyncTask().execute(baseURL);
listview = (ListView) rootView.findViewById(R.id.list);
adapter = new ActorAdapter(getActivity(), R.layout.row, actorsList);
listview.setAdapter(adapter);
}
else{
Toast.makeText(getActivity(), "Network Unavailable. Please Try Again Later ", Toast.LENGTH_LONG).show();
try {
Toast.makeText(getActivity(), "Reached TRY ", Toast.LENGTH_LONG).show();
actorsList = (ArrayList<Actors>)objectFromFile(dataPath);
// System.out.print(actorsList);
for(int i=0;i<actorsList.size();i++)
{
Toast.makeText(getActivity(), "Reached FOR ", Toast.LENGTH_LONG).show();
actor.setName(actorsList.get(i).getName());
actor.setDescription(actorsList.get(i).getDescription());
actor.setImage(actorsList.get(i).getImage());
}
listview = (ListView) rootView.findViewById(R.id.list);
adapter = new ActorAdapter(getActivity(), R.layout.row, actorsList);
listview.setAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
}
}
return rootView;
}
class JSONAsyncTask extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPreExecute() {
}
@Override
protected Boolean doInBackground(String... urls) {
try {
//------------------>>
HttpGet httppost = new HttpGet(urls[0]);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(httppost);
// StatusLine stat = response.getStatusLine();
int status = response.getStatusLine().getStatusCode();
if (status == 200) {
HttpEntity entity = response.getEntity();
String data = EntityUtils.toString(entity);
JSONObject jsono = new JSONObject(data);
jarray = jsono.getJSONArray("posts");
for (int i = 0; i < jarray.length(); i++) {
JSONObject object = jarray.getJSONObject(i);
Actors actor = new Actors();
actor.setName(object.getString("title"));
actor.setDescription(object.getString("url"));
actor.setImage(object.getString("thumbnail"));
actorsList.add(actor);
}
return true;
}
} catch (ParseException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean result) {
dialog.cancel();
adapter.notifyDataSetChanged();
if (result) {
try {
dataPath = objectToFile(actorsList);
} catch (IOException e) {
e.printStackTrace();
}
} else {
Toast.makeText(getActivity().getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();
}
}
}
这是转换ObjectToFile和ObjectFromFile的类
package info.androidhive.slidingmenu;
import android.os.Environment;
import java.io.*;
public class ObjectToFileUtil {
public static String objectToFile(Object object) throws IOException {
String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator;
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
path += "data";
File data = new File(path);
if (!data.createNewFile()) {
data.delete();
data.createNewFile();
}
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data));
objectOutputStream.writeObject(object);
objectOutputStream.close();
return path;
}
public static Object objectFromFile(String path) throws IOException, ClassNotFoundException {
Object object = null;
File data = new File(path);
if(data.exists()) {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data));
object = objectInputStream.readObject();
objectInputStream.close();
}
return object;
}
}
更新代码的更新答案
根据以下步骤更改ObjectToFileUtil类-
public class ObjectToFileUtil {
private static baseFilePath = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator+"data";
public static String objectToFile(Object object) throws IOException {
String path = baseFilePath;
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
File data = new File(path);
if (!data.createNewFile()) {
data.delete();
data.createNewFile();
}
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data));
objectOutputStream.writeObject(object);
objectOutputStream.close();
return path;
}
public static Object objectFromFile() throws IOException, ClassNotFoundException {
String path = baseFilePath;
Object object = null;
File data = new File(path);
if(data.exists()) {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data));
object = objectInputStream.readObject();
objectInputStream.close();
}
return object;
}
然后改变这一行-
actorsList = (ArrayList<Actors>)objectFromFile(dataPath);
actorsList=(ArrayList)objectFromFile(dataPath);
到-
actorsList=(ArrayList)objectFromFile();
你问题的原因
您在网络可用时保存了文件,并将文件路径存储在dataPath
member中。现在,当您在没有可用网络的情况下启动应用程序时,您正在尝试打开该文件,假设该文件已包含json。到目前为止,一切都很好。但这是一个逻辑错误。请参见当您重新启动应用程序时,dataPath
中没有值,尽管文件可能存在,因为只有在您刚刚写入文件时才会指定dataPath
。因此,您的路径是null
,并且文件对象不是在objectFromFile()中创建的。
还要确保您的
Actors
类正在实现Serializable
接口。使对象保存在文件中并正确检索,该对象需要可序列化您可以将对象的数组列表转换为字符串,并将其存储在共享引用中,如下所示:-
Gson gson = new Gson();
SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("list",gson.toJson(actorsList));
editor.commit();
SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(getActivity());
String string=sharedPreferences.sharedPreferences.getString("list",null);
List<Actors> list=new List<Actors>();
Type listType = new TypeToken<ArrayList<Actors>>() {
}.getType();
list= new Gson().fromJson(string, listType);
然后,当连接不可用的else块时,可以检索此列表,如下所示:-
Gson gson = new Gson();
SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("list",gson.toJson(actorsList));
editor.commit();
SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(getActivity());
String string=sharedPreferences.sharedPreferences.getString("list",null);
List<Actors> list=new List<Actors>();
Type listType = new TypeToken<ArrayList<Actors>>() {
}.getType();
list= new Gson().fromJson(string, listType);
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(getActivity());
String String=SharedReferences.SharedReferences.getString(“列表”,null);
列表=新列表();
类型listType=新类型令牌(){
}.getType();
list=new Gson().fromJson(字符串,listType);
我在这里使用gson对对象进行序列化和反序列化,不要忘记将gson包含在gradle文件中您需要internet连接才能第一次获取数据,然后您可以将其存储在SharedReferences或数据库中,当internet不可用时,您可以从那里获取数据并向用户显示请显示错误行。对于应用程序概念,您需要将
JSONObject
或arraylist存储到数据库或SharedReference
中。同时将适配器设置为onPostExecute()
方法,而不是onCreateView()
方法。@PramodYadav是的,我就是这么做的。首先,我在互联网上运行应用程序,所有数据都已正确加载。然后我关掉WiFi并启动(而不是运行)应用程序。但它崩溃了。问题当然是在ArrayAdapter中显示ArrayList时,您是否得到ActorList=(ArrayList)objectFromFile(dataPath);这句话正确吗?你是否得到了联系?试试吐司???你能分享一下你的日志吗?actorsList=(ArrayList)objectFromFile(数据路径);你在ActorList做什么?在做了更多的研究之后,我想我们首先需要将ArrayList
保存在SharedReferences中。我正在寻找如何做到这一点。。总之,在问题中添加了我的日志我已经更新了我的到达Try
代码,现在应用程序没有崩溃。但是除了土司外,什么也不显示。@swapnalekshmann,请参阅保存到SharedReferences只是一个可选选项。从日志猫可以清楚地看出,NPE发生在objectFromFile()中。您应该共享objectFromFile()和objectToFile()代码。因为问题就在那里。谢谢你,阿米特。。我有一个单独的Java类ObjectToFileUtil
,它实现了ObjectToFile
和ObjectFromFile
。更新了他们的问题首先没有冒犯,伙计。但我不明白你为什么要求她以共同的偏好储蓄(我明白这应该更容易些)。但是,她的业务逻辑是否也可能迫使她保存在文件中?在json中不能是大文本响应吗?我们不应该先解决OP的问题而不是提出不同的解决方案吗?我不是强迫她按照我建议的方式来做我认为这是一种合适的方式如果她想不想通过这种方式来做,完全取决于她,我不知道这个列表有多大。你永远不知道,如果它比从文件中读取的内容太大,也不是一个理想的解决方案,那么她必须将它存储在数据库中。我只是在从阅读她提出的问题中获得的一点知识后回答了这个问题posted@PramodYadav我是否应该将代码中的objectString
替换为字符串
?以及shd在适配器中的列表内容的排列位置?