2017-01-06 1 views
0

Я добавил много изображений в папку с ресурсами и хочу получить эти изображения оттуда и добавить их в ListView. Когда я выполняю приложение, все идеально, но контейнер изображений в списке выглядит пустым (прозрачным). OutputДобавление Drawables из активов в ListView

Java-файл:

package com.basil.victor; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

import java.io.IOException; 
import java.io.InputStream; 

public class Events extends Fragment { 

private ListView listEvent; 

String eventname[]={ 
     "Name", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

String eventlogoname[]={ 
     "Logo", 
     "name", 
     "of", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

Drawable[] arr=new Drawable[7]; 

String eventsubtitle []={ 
     "Subtitles", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_events, null); 



    for(int i=0;i<7;i++) { 
     try { 
      InputStream stream = getContext().getAssets().open(eventlogoname[i] + ".jpg"); 
      Drawable el = Drawable.createFromStream(stream, null); 
      arr[i] = el; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    EventList adapter = new 
      EventList(getActivity(), eventname, arr, eventsubtitle); 
    //ListView lv = (ListView)rootView. 
    listEvent=(ListView)view.findViewById(R.id.listEvent); 
    listEvent.setAdapter(adapter); 


    return view; 
} 
} 

ListView адаптер:

package com.basil.victor; 
import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class EventList extends ArrayAdapter<String>{ 

private final Activity context; 
private final String[] title; 
private final Drawable[] banner; 
private final String[] subtitle; 
public EventList(Activity context, 
        String[] title, Drawable[] banner, String[] subtitle) { 
    super(context, R.layout.list_single, title); 
    this.context = context; 
    this.title = title; 
    this.banner = banner; 
    this.subtitle = subtitle; 

} 
@Override 
public View getView(int position, View view, ViewGroup parent) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView= inflater.inflate(R.layout.event_row, null, true); 

    TextView txtTitle = (TextView) rowView.findViewById(R.id.event_title); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.event_banner); 
    TextView subTitle = (TextView) rowView.findViewById(R.id.event_subtitle); 


    txtTitle.setText(title[position]); 
    imageView.setImageDrawable(banner[position]); 
    subTitle.setText(subtitle[position]); 


    return rowView; 
} 
} 
+0

Скорее всего, вы не прочитали их правильно, в результате чего вы пройдете массив нулей. Прошли ли вы в отладчике, ищем, где все происходит? –

+0

Отладчик говорит: java.io.FileNotFoundException: Logo.jpg –

+0

Но он присутствует в папке с ресурсами –

ответ

1

Если вы получаете FileNotFound Exception,

  1. Проверьте, если изображение находится внутри вложенных активов и добавить соответствующий путь

  2. Проверьте случай расширения (Я долгое время сталкивался с этой проблемой, прежде чем понял, что у моего изображения есть расширение .JPG (Uppercase).

  3. Окончательная строка, которая выполняется поиск, проверьте для случайных непечатаемого

+0

Да, это внутри баннеров подпапки. Итак, какой будет путь @Haran, вы можете рассказать –

+0

Спасибо. Изображения находились внутри подпапки, поэтому я сменил одну из строк на: InputStream stream = getContext(). GetAssets(). Open ("banners /" + eventlogoname [i] + ".jpg"); –

+0

Извините, просто увидел это. Рад, что это сработало! –

0

Почему использует папку активов для изображений? если не нужно, то вы можете использовать вытяжку для таких же поместить все изображения в вытяжке папки и

package com.basil.victor; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

import java.io.IOException; 
import java.io.InputStream; 

public class Events extends Fragment { 

private ListView listEvent; 

String eventname[]={ 
     "Name", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 



int[] arr=new int[7]; 

String eventsubtitle []={ 
     "Subtitles", 
     "of", 
     "the", 
     "events", 
     "are", 
     "present", 
     "here" 
}; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_events, null); 

arr[]={ 
      R.drawable.Logo, 
      R.drawable.name, 
      R.drawable.of, 
      R.drawable.events, 
      R.drawable.are, 
      R.drawable.present, 
      R.drawable.here 
    }; 



    EventList adapter = new 
      EventList(getActivity(), eventname, arr, eventsubtitle); 
    //ListView lv = (ListView)rootView. 
    listEvent=(ListView)view.findViewById(R.id.listEvent); 
    listEvent.setAdapter(adapter); 


    return view; 
} 
} 

адаптер:

package com.basil.victor; 
import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class EventList extends ArrayAdapter<String>{ 

private final Activity context; 
private final String[] title; 
private final int[] banner; 
private final String[] subtitle; 
public EventList(Activity context, 
        String[] title, int[] banner, String[] subtitle) { 
    super(context, R.layout.list_single, title); 
    this.context = context; 
    this.title = title; 
    this.banner = banner; 
    this.subtitle = subtitle; 

} 
@Override 
public View getView(int position, View view, ViewGroup parent) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView= inflater.inflate(R.layout.event_row, null, true); 

    TextView txtTitle = (TextView) rowView.findViewById(R.id.event_title); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.event_banner); 
    TextView subTitle = (TextView) rowView.findViewById(R.id.event_subtitle); 


    txtTitle.setText(title[position]); 
imageView.setImageResource((banner[position]); 
    subTitle.setText(subtitle[position]); 


    return rowView; 
} 
} 
+0

Нет. Я хочу использовать активы. Потому что я знаю, как сделать с возможностью рисования, чтобы попробовать с активами. –

0

Делает это, как этого

class MainActivity extends AppCompatActivity { 
private ListView listEvent; 


String arras[]={ 
    "Logo", 
    "name", 
    "of", 
    "events", 
    "are", 
    "present", 
    "here" 
}; 
Drawable[] arr=new Drawable[5]; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
      EventList adapter = new EventList(MainActivity.this, arras); 
      //ListView lv = (ListView)rootView. 
      listEvent=(ListView)findViewById(R.id.listEvent); 
      listEvent.setAdapter(adapter); 



     } 
    } 

И адаптер класс как это

public class EventList extends BaseAdapter { 
LayoutInflater inflater; 
private final Activity context; 
String arras[]; 
public EventList(Activity context,String[] arras) { 
    super(); 
    this.context = context; 
    this.arras = arras; 
    inflater = (LayoutInflater) this.context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

} 
@Override 
public int getCount() { 
    return arras.length; 
} 

@Override 
public Object getItem(int position) { 
    return arras.length; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 
@Override 
public View getView(int position, View myView, ViewGroup parent) { 
    if (myView == null) { 
     myView = inflater.inflate(R.layout.event_row, null, true); 

    } 

    ImageView imageView = (ImageView) myView.findViewById(R.id.event_banner); 
    try { 
     InputStream stream = context.getAssets().open(arras[position] + ".jpg"); 
     Drawable el = Drawable.createFromStream(stream, null); 
     imageView.setImageDrawable(el); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    return myView; 
} 

}

0

Используйте ViewHolder

ViewHolder делает вид списка для ускорения загрузки путем кэширования представлений. Если он каждый раз просматривает представление, вызывая findViewById(), он будет очень медленным.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ViewHolder holder; // to reference the child views for later actions 

     if (v == null) { 
      LayoutInflater vi = 
        (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.mainrow, null); 
      // cache view fields into the holder 
      holder = new ViewHolder(); 
      holder.ImageView = (ImageView) v.findViewById(R.id.event_banner); 
      // associate the holder with the view for later lookup 
      v.setTag(holder); 
     } else { 
      // view already exists, get the holder instance from the view 
      holder = (ViewHolder) v.getTag(); 
     } 
     // no local variables with findViewById here 

     // use holder.ImageView where you were 
     // using the local variable nameText before 
     try { 
      InputStream stream = context.getAssets().open(arras[position] + ".jpg"); 
      Drawable el = Drawable.createFromStream(stream, null); 
      holder.ImageView.setImageDrawable(el); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return v; 
    } 

// somewhere else in your class definition 
static class ViewHolder { 
    ImageView imageView; 
} 
Смежные вопросы