Удаленные изображения повторяются в listview

#android #image #parsing #listview

#Android #изображение #синтаксический анализ #listview

Вопрос:

Я пытаюсь проанализировать удаленные изображения и текст в listview. код приведен ниже:

 public class ParseImagesActivity extends ListActivity {
String myURL;
String xml; 
 Document doc; 
 NodeList nodes; 
 int equal=1;


 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        xml = XmlParser.getXML("http://www.myurl.com");
         doc = XmlParser.XMLfromString(xml);
        nodes = doc.getElementsByTagName("item");
        for ( int i = 0; i < nodes.getLength(); i  ) {

             Element e = (Element)nodes.item(i);
             myURL = XmlParser.getValue(e, "thumb");
             startParsing(myURL);
         }
    }

 private void startParsing(String url) {  
     new backgroundLoadListView().execute(url);

 }

public class backgroundLoadListView extends
        AsyncTask<String, String, String> {

    @Override
    protected void onPostExecute(String unused) {
        // TODO Auto-generated method stub
        setListAdapter(new MyCustomAdapter(ParseImagesActivity.this,  
                                                                R.layout.row, month));

    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
         String url = params[0];
        preLoadSrcBitmap(url);
        return null;
    }

}

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;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row = convertView;

        if(row==null){
            LayoutInflater inflater=getLayoutInflater();
            row=inflater.inflate(R.layout.row, parent, false);
                              } 

        TextView label=(TextView)row.findViewById(R.id.weekofday);
        label.setText(month[position]);
        ImageView icon=(ImageView)row.findViewById(R.id.icon);

        icon.setImageBitmap(bm);



        return row; 
        }   
    }

  Bitmap srcBitmap;
  private void preLoadSrcBitmap(String url){
    BitmapFactory.Options bmOptions;
    bmOptions = new BitmapFactory.Options();
    bmOptions.inSampleSize = 1;

    srcBitmap = LoadImage(url, bmOptions);

}

String[] month = {
        "January", "February", "March", "April",
        "May", "June", "July", "August",
        "September", "October", "November", "December"
        };

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    //super.onListItemClick(l, v, position, 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; 
}
 

У меня также есть класс xmlparser. Существуют различные изображения, подлежащие анализу в listview. Когда я запускаю приложение, изображения повторяются в listview, что означает, что 1-е изображение отображается во всех строках listview, чем исчезает, чем 2-е появляется во всех строках и исчезает, и изображения постоянно отображаются и исчезают, а последнее изображение отображается во всех строках listview и не исчезает.
Я думаю, что я делаю что-то неправильно в методе getView() в классе MyCustomadapter. Я не могу понять, как следует решить эту проблему? Я хочу 1-е изображение в 1-м ряду и 2-е во 2-м ряду и т.д. Как это исправить? Кто-нибудь может помочь?
Заранее благодарю.

Ответ №1:

Похоже, что вы создаете новую AsyncTask (BackgroundLostListView) для каждого «элемента» в XML. По завершении каждой из этих асинхронных задач вы устанавливаете новый ListAdapter (MyCustomAdapter) для каждой из них и имеете одно растровое изображение, связанное с этим адаптером. Вы хотите иметь один адаптер для всего ListView, который имеет полный набор данных (для всех строк, включая либо сами растровые изображения, либо, возможно, URL-адреса для их загрузки в фоновом режиме).

Также обратите внимание, что ваша AsyncTask, похоже, использует только один из трех параметров, но вы установили для них все значения Strings . Для любого параметра, который вы не используете, вы должны использовать вместо него «Void».

Комментарии:

1. Спасибо, Клифтон. Я изменил два других параметра на Void. Как мне создать один адаптер для всего списка, можете ли вы предоставить мне какой-нибудь код или какое-либо руководство по этому поводу?