Я на начальном уровне, я заполняю список просмотра различными удаленными изображениями и текстом в приложении для Android.Я использую адаптер для заполнения списка и AsynTask для загрузки изображений.Но я сталкиваюсь с двумя проблемами и пробовал большинство из них в течение многих дней, но, к сожалению, не смог добиться успеха.Первая проблема заключается в том, что первое изображение и текст появляются в первой строке списка и исчезают, а вторая строка заполняется вторым изображением и текстом, а также исчезает, и аналогично каждая строка появляется с изображениями и текстом и исчезает.Вторая проблема заключается в том, что когда появляется последняя строка, приложение перестает работать и перестает работать, выдавая исключение ниже:
11-01 20:03:56.449: ERROR/AndroidRuntime(29665): FATAL EXCEPTION: main
11-01 20:03:56.449: ERROR/AndroidRuntime(29665): java.lang.NullPointerException
Это мой основной класс:
public class ParseImagesActivity extends ListActivity {
String myURL;
String xml;
Document doc;
NodeList nodes;
//int i=5;
int j=0;
int equal;
int h;
String[] length = {"1","2","3","4","5","6","7","8","9",null};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
xml = XmlParser.getXML("http://url.com");
doc = XmlParser.XMLfromString(xml);
nodes = doc.getElementsByTagName("item");
Element g = (Element)nodes.item(j);
startParsing(XmlParser.getValue(g,"thumb"));
}
В основном классе я вызываю метод startParsingпередав ему URL-адрес 1 для доступа к первому изображению с помощью функции XmlParser.getValue (g, «thumb»), которая возвращает URL-адрес из класса XmlParser.Метод startParsing:
private void startParsing(String url) {
new backgroundLoadListView().execute(url);
}
public class backgroundLoadListView extends
AsyncTask<String, Void, String> {
@Override
protected void onPostExecute(String unused) {
// TODO Auto-generated method stub
if(j<nodes.getLength()){
setListAdapter(new MyCustomAdapter(ParseImagesActivity.this, R.layout.row, length));
Log.e("post Execute","post execute="+j);
equal=j;
j++;
Element h = (Element)nodes.item(j);
startParsing(XmlParser.getValue(h,"thumb"));
}
}
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
//Log.e("do in back","do in back="+j);
String url = params[0];
preLoadSrcBitmap(url);
return null;
}
}
Здесь я вызываю конструктор MyCustomerAdapter, а в методе postExecute вызываю метод startParsing, передавая url2,3,4, ... и т. д., чтобы получить доступ к другим изображениям.Класс MyCustomAdapter и метод preloadSrcBitmap:
public class MyCustomAdapter extends ArrayAdapter<String> {
Bitmap bm;
public MyCustomAdapter(Context context, int textViewResourceId,
String[] objects) {
//
super(context, textViewResourceId, objects);
// TODO Auto-generated constructor stub
bm = srcBitmap;
Log.e("my customer adapter","my adapter"+j);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//return super.getView(position, convertView, parent);
View row = convertView;
if(row==null){
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.row, parent, false);
}
Log.e("getview",j+"calls");
TextView label=(TextView)row.findViewById(R.id.weekofday);
ImageView icon=(ImageView)row.findViewById(R.id.icon);
if(j<nodes.getLength())
{
if(equal==position)
{
Log.e("text view calls",""+equal);
Element f = (Element)nodes.item(equal);
label.setText(XmlParser.getValue(f, "title"));
icon.setImageBitmap(bm);
}
}
return row;
}
}
Bitmap srcBitmap;
private void preLoadSrcBitmap(String url){
//Log.e("preloadsrcbitmap","preloadsrcbitmap="+j);
BitmapFactory.Options bmOptions;
bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
srcBitmap = LoadImage(url, bmOptions);
}
/** Called when the activity is first created. */
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
String selection = l.getItemAtPosition(position).toString();
Toast.makeText(this, selection, Toast.LENGTH_LONG).show();
}
private Bitmap LoadImage(String URL, BitmapFactory.Options options)
{
Bitmap bitmap = null;
InputStream in = null;
try {
in = OpenHttpConnection(URL);
bitmap = BitmapFactory.decodeStream(in, null, options);
in.close();
} catch (IOException e1) {
}
return bitmap;
}
private InputStream OpenHttpConnection(String strURL) throws IOException{
InputStream inputStream = null;
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
try{
HttpURLConnection httpConn = (HttpURLConnection)conn;
httpConn.setRequestMethod("GET");
httpConn.connect();
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
inputStream = httpConn.getInputStream();
}
}
catch (Exception ex){
}
return inputStream;
}
И большое спасибо людям, которые помогают мне с упомянутыми проблемами.Я не могу понять их.