Rss Reader getView()和getcount()的问题返回0

时间:2015-04-26 14:11:14

标签: android

尝试使用Volley使用NetworkImageView和Textview填充列表视图时遇到了问题。当我运行项目时,它不会显示任何错误,但在模拟器中不显示数据。解析xml没关系。我需要一些帮助。感谢

MainActivity.java

std::transform

}

CargaImagenesRemotas.java

公共类CargaImagenesRemotas {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the view from listview_main.xml
    setContentView(R.layout.activity_principal);


    tvRss = (TextView) findViewById(R.id.tvDireccionRss);
    btnObtenerCanal = (ImageButton) findViewById(R.id.ibtnObtenerCanal);
    btnObtenerNoticias = (ImageButton) findViewById(R.id.ibtnObtenerNoticias);


    btnObtenerCanal.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //Obtengo el feed Rss para consultar
            obtenerCanal();

        }
    });

    //Defino el Listener del Boton para obtener las Noticias
    btnObtenerNoticias.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(tvRss.getText() == ""){
                Toast.makeText(Principal.this, "Es necesario Obtener el canal primero", Toast.LENGTH_LONG).show();
            }else{
                //Realizo el trabajo para obtener las noticias
                obtenerNoticias();
            }

        }
    });
}

public void obtenerNoticias(){

    //Instancio el ListView
    lvNoticias = (ListView) findViewById(R.id.lvNoticias);

    //Creo y Seteo el Adaptador
    adaptador = new AdaptadorNoticias(Principal.this);


    lvNoticias.setAdapter(adaptador);

    //Toast.makeText(this,"CANTIDAD DE HIJOS: " + lvNoticias.getChildCount(), Toast.LENGTH_LONG).show();


}




public void obtenerCanal(){



    //Pedido de nueva cola de Peticion
    requestQueue = Volley.newRequestQueue(this);


    jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, urlBase + urlArchivo, (String)null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            //Proceso de requerimiento de archivo JSON
            valor = parsearJson(response);
            tvRss.setText(valor.toString());
            pd.dismiss();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //Error en el proceso de adquisicion de Archivo JSON
            Log.d("ERROR", "Error Respuesta en JSON: " + error.getMessage());
            pd.dismiss();
        }
    });


    requestQueue.add(jsonObjectRequest);

    //Instancio el dialogo de progreso
    pd = new ProgressDialog(this);
    pd.setMessage("Espere un Momento, obteniendo el Canal...");
    pd.show();


}



//Metodo que obtiene el contenido a partir de un objeto JSON
public String parsearJson (JSONObject jsonObject){

    List<String> clubes = new ArrayList<>();
    List<String> url = new ArrayList<>();
    JSONArray jsonArray = null;
    String rssResultante = "";
    String club,rss = "";


    try{

        //Obtengo el Array
        jsonArray = jsonObject.getJSONArray("canales");

        for(int i = 0 ; i < jsonArray.length() ; i ++){

            try{
                //Genero nuevos objetos JSON para guardar el contenido
                JSONObject objetoLista = jsonArray.getJSONObject(i);
                club = objetoLista.getString("club");
                rss = objetoLista.getString("rss");
                clubes.add(club);
                url.add(rss);

            }catch(JSONException e){
                e.getStackTrace();
            }
        }


        for(int j = 0 ; j < clubes.size() ; j++){


            if(clubes.get(j) == clubes.get(0)){

                rssResultante = url.get(0).toString();
            }

            //Toast.makeText(context, "Valor de url de RSS: " + rssResultante, Toast.LENGTH_LONG).show();
        }

    }catch(JSONException e){
        //Error de parseo de archivo JSON
        Log.e("Paseando JSON", "Error al obtener JSON: " + e.getMessage());
    }



    return rssResultante;

}

}

AdaptadorNoticias.java

公共类AdaptadorNoticias扩展了ArrayAdapter {

private static CargaImagenesRemotas instancia;
private static Context contexto;
private RequestQueue requerimientoQueue;
private ImageLoader cargadorImagen;


private CargaImagenesRemotas (Context context){



    contexto = context;
    requerimientoQueue = getRequerimientoQueue();

    cargadorImagen = new ImageLoader(requerimientoQueue, new ImageLoader.ImageCache() {
                private final LruCache<String, Bitmap>
                        cache = new LruCache<String, Bitmap>(20);

                @Override
                public Bitmap getBitmap(String url) {
                    return cache.get(url);
                }

                @Override
                public void putBitmap(String url, Bitmap bitmap) {
                    cache.put(url, bitmap);
                }
            });



}

public static synchronized CargaImagenesRemotas getInstancia(Context context){
    if(instancia == null){
        instancia = new CargaImagenesRemotas(context);
    }

    return instancia;
}

public RequestQueue getRequerimientoQueue(){

    if(requerimientoQueue == null){
        Cache cache = new DiskBasedCache(contexto.getCacheDir(), 10*1024*1024);
        Network network = new BasicNetwork(new HurlStack());
        requerimientoQueue = new RequestQueue(cache, network);

        requerimientoQueue.start();
    }

    return requerimientoQueue;

}


public ImageLoader getCargadorImagen(){
    return cargadorImagen;
}

}

日志

private RequestQueue requestQueue;
String tvUrlRss;
ProgressDialog pd;
StringRequest stringRequest;
List<Post> items;




public AdaptadorNoticias(Context context) {
    super(context,0);



    //Pedido de nueva cola de peticion
    requestQueue = Volley.newRequestQueue(context);

    //Defino la direccion url del feed
    tvUrlRss = Principal.tvRss.getText().toString();

    //Consulto el acceso a Internet del dispositivo
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);


    stringRequest = new StringRequest(Request.Method.GET, tvUrlRss, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            items = parsearXML(response);
            pd.dismiss();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("ERROR", "Error Respuesta en JSON: " + error.getMessage());
            pd.dismiss();
        }
    });


    //Añado a la cola de peticion
    requestQueue.add(stringRequest);


    //Instancio el dialogo de progreso
    pd = new ProgressDialog(context);
    pd.setMessage("Espere un Momento, obteniendo las Noticias...");
    pd.show();

}


@Override
public int getCount() {
    return items != null ? items.size() : 0;
}


@Override
public Object getItem(int position) {
    return items.get(position);
}



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

    LayoutInflater inflador = LayoutInflater.from(parent.getContext());

    //Referencia del View procesado
    View listViewItem;

    //Compruebo si ya existe el listview
    listViewItem = null == convertView ? inflador.inflate(R.layout.listado_modelo, parent, false) : convertView;



    //Defino un item
    final Post item = items.get(position);

    //Obtengo los Views correspondientes
    final TextView tvTitulo = (TextView) listViewItem.findViewById(R.id.tvTituloListView);
    final TextView tvFecha = (TextView) listViewItem.findViewById(R.id.tvFechaListView);
    final TextView tvDescripcion = (TextView) listViewItem.findViewById(R.id.tvDescripcionListView);
    final NetworkImageView ivImagen = (NetworkImageView) listViewItem.findViewById(R.id.nivListView);

    //Actualizo los Views
    tvTitulo.setText(item.getTitulo());
    tvFecha.setText(item.getFecha());
    tvDescripcion.setText(item.getDescripcion());



    final String url = item.getImagen();




    // Obtener el image loader
    Principal.il = CargaImagenesRemotas.getInstancia(getContext()).getCargadorImagen();
    // Petición
    Principal.il.get(url, ImageLoader.getImageListener(ivImagen, R.drawable.errorimagen, R.drawable.riverplateerror));
    ivImagen.setImageUrl(url, Principal.il);




    //Devuelvo el View
    return listViewItem;

}



public List<Post> parsearXML(String xml) {

    //Defino variables
    List<Post> listado = new ArrayList<>();
    DocumentBuilderFactory fabrica;
    DocumentBuilder parseador;
    Document documento;
    URL url;


    try{
        xml = tvUrlRss;
        url = new URL(xml);
        fabrica = DocumentBuilderFactory.newInstance();
        parseador = fabrica.newDocumentBuilder();
        documento = parseador.parse(new InputSource(url.openStream()));
        documento.getDocumentElement().normalize();

        //Obtengo el nodo primerio para la captura posterior de las demas etiquetas
        NodeList listaNodo = documento.getDocumentElement().getChildNodes().item(0).getChildNodes();



        if(listaNodo != null && listaNodo.getLength() > 0) {

            for (int i = 0; i < listaNodo.getLength(); i++) {

                Element elemento = (Element) listaNodo.item(i);


                if(elemento.getNodeName().contains("item")) {

                    try {

                        String stringTitulo = elemento.getChildNodes().item(0).getTextContent();
                        String stringFecha = elemento.getChildNodes().item(4).getTextContent();
                        String stringDescripcion = elemento.getChildNodes().item(2).getTextContent();

                        //Asigno el elemento imagen para obtener posteriormente la url de la imagen
                        String stringImagen = elemento.getChildNodes().item(3).getAttributes().item(0).getTextContent();
                        //Lleno los Post con los valores de los string para ser mostrados luego
                        Post post = new Post(stringTitulo, stringFecha, stringDescripcion, stringImagen);

                        //Agrego al array que retorna
                        listado.add(post);

                    }catch (Exception e){
                        e.getStackTrace();
                    }

                }


            }


        }
    }catch(MalformedURLException e){
        e.getStackTrace();
    }catch(Exception e){
        e.getStackTrace();
        Log.e("ERROR", "Error de Parseo de XML: " + e.getMessage());
    }


    return listado;
 }

1 个答案:

答案 0 :(得分:0)

  

Rss Reader getView()和getcount()的问题返回0

我认为这是因为你还没有发起items列表。

public class AdaptadorNoticias extends ArrayAdapter {   
private RequestQueue requestQueue;
String tvUrlRss;
ProgressDialog pd;
StringRequest stringRequest;
List<Post> items; <-- Here

启动ArrayList

List<Post> items = new ArrayList<Post>;