尝试使用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;
}
答案 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>;