【问题标题】:Remote images repeats in listview远程图像在列表视图中重复
【发布时间】:2011-10-31 10:44:49
【问题描述】:

我正在尝试解析列表视图中的远程图像和文本。代码如下:

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 类。在列表视图中有不同的图像需要解析。当我在列表视图中运行应用程序图像重复时,意味着第一个图像显示在列表视图的所有行中,而不是第二个出现在所有行中并消失,并且图像继续显示和消失,最后一个图像显示在列表视图的所有行中并且不会消失。 我认为我在 MyCustomadapter 类的 getView() 方法中做错了一些事情。我无法弄清楚应该如何解决这个问题?我想要第一行的第一张图像和第二行的第二张等。如何纠正它?有人可以帮忙吗? 提前致谢。

【问题讨论】:

    标签: android image parsing listview


    【解决方案1】:

    看起来您正在为 XML 中的每个“项目”创建一个新的 AsyncTask (BackgroundLostListView)。随着这些 AsyncTask 中的每一个完成,您将为每个设置一个新的 ListAdapter (MyCustomAdapter) 并让一个位图与该适配器相关联。您希望为具有完整数据集的整个 ListView 拥有一个适配器(对于所有行,包括位图本身或可能在后台下载它们的 URL)。

    另请注意,您的 AsyncTask 似乎只使用了三个参数之一,但您已将它们全部设置为字符串。对于您不使用的任何参数,您应该使用“Void”。

    【讨论】:

    • 谢谢克利夫顿。我已将其他两个参数更改为 Void。我应该如何为整个列表创建一个适配器,你能给我一些代码或任何指南吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多