2013-08-21 2 views
1

Я хочу добавить дополнительный элемент в свой список. Например, у меня есть бесконечный список с изображениями, после каждых 20 изображений я хочу добавить веб-просмотр со ссылкой на исходную страницу.Как добавить элемент между элементами списка?

Согласно sugested Unfortunatly Получать NPE на WebView sourse = (WebView) vi.findViewById(R.id.webViewSourse);

public class MediaItemAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, String>> data; 
    private static LayoutInflater inflater = null; 
    public ImageLoader imageLoader; 

    public MediaItemAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
     activity = a; 
     data = d; 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader = new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; // any number what you need. 
    } 

    @Override 
    public int getItemViewType(int position) { 
     // view type is managed as zero-based index. 
     if (position % 11 != 0) 
      return 0; 
     else 
      return 1; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 

     if (convertView == null) { 
      // View Recycling is managed separately based on its view type, 
      // so you don't need to worry about view corruptions. 

      int type = getItemViewType(position); 
      switch (type) { 
      case 0: 
       // inflate imageview here. 
       convertView = inflater.inflate(R.layout.item_composer, null); 
      case 1: 
       // inflate webview here. 
       convertView = inflater.inflate(R.layout.banner_row, null); 
      } 
     } 
     int type = getItemViewType(position); 
     switch (type) { 
     case 0: 
      // inflate imageview here. 

      ImageView thumb_image = (ImageView) vi.findViewById(R.id.imagePrev); // thumb 


      String value = add.get("first_photo_url"); 
      if (value == null || value.trim().length() <= 0 
        || value.equalsIgnoreCase("null") 
        || value.trim().equalsIgnoreCase("")) { 
       thumb_image.setImageResource(R.drawable.stub); 
      } else { 
       imageLoader.DisplayImage(add.get("first_photo_url"), 
         thumb_image); 
       // // do nothing 
      } 
     case 1: 
      // inflate webview here. 
      WebView sourse = (WebView) vi.findViewById(R.id.webViewSourse); 

      WebSettings webSettings = sourse.getSettings(); 
      webSettings.setJavaScriptEnabled(true); 
      // banner.loadUrl("http://www.google.com"); 
      sourse.loadUrl(url); 
     } 

     return vi; 
    } 

} 
+0

может быть, это поможет http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/ –

ответ

2

ListView поддержки более одного ViewType. Вы можете переопределить методы getViewTypeCount & getItemViewType внутри ListAdapter. В вашем случае вы можете подготовить два вида вида один для изображения, а другой для webvie и использовать его отдельно в зависимости от позиции элемента. Например ...

private class MyCustomAdapter extends ArrayAdapter<Object> { 

    public MyCustomAdapter(Context context) { 
     super(context, 0); 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; //any number what you need. 
    } 

    @Override 
    public int getItemViewType(int position) { 
     //view type is managed as zero-based index. 
     if(position % 20 != 0) 
      return 0; 
     else 
      return 1; 
    } 

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

     if(convertView == null){ 
      // View Recycling is managed separately based on its view type, 
      // so you don't need to worry about view corruptions. 

      LayoutInflater inflater = getLayoutInflater(); 
      int type = getItemViewType(position); 
      switch (type){ 
       case 0: 
        //inflate imageview here. 
        convertView = inflater.inflate(R.layout.my_imageivew); 
       break; 
       case 1: 
        //inflate webview here. 
        convertView = inflater.inflate(R.layout.my_webview); 
      } 
      //do some data binding job here... 
     } 
     return convertView; 
    } 
}//end of inner class 

И я нашел один полезный пост в блоге об этом - «handling-listviews-with-multiple-row-types»

+0

Между тем, я читаю предлагаемый блог, вы можете понять, почему я получаю NPE при инициализации веб-просмотра? – Yarh

+1

Да .. Я просто забыл набрать «break;» между двумя случаями, и кажется, что вы просто следовали за моей большой ошибкой. знак равно – Chansuk

0

В списке адаптера в методе GetView вы можете проверить следующее условие:

if(position%20==0){ 
    //return your webview here instead of imageView or list row etc. 
} 
Смежные вопросы