Бесконечная прокрутка Галерея Просмотр с текстовым описанием - PullRequest
5 голосов
/ 21 марта 2012

У меня есть бесконечная галерея, основанная на этом примере:

http://blog.blundell -apps.com / infinite-scrolling-gallery / ,

Теперь все работает отличноЯ хочу, чтобы Галерея все еще пролистывала изображения, и под каждым изображением должен быть текстовый заголовок .

Я искал в сети без результата, не могли бы вы помочь мне в кодировании этого,только начинающий в разработке.

=======================================================================================

НОВОЕ обновление :

загрузить фотографию и объяснить, что именно мне нужно, что я получаю с помощью обычной галереи (применяется текст к каждому изображению и возможность настроить текст так же, какпоказано вниз изображение, и каждое изображение имеет другой текст, чем другие, но все же не удается сделать это с бесконечной галереей:

enter image description here

ПОЖАЛУЙСТА, ПОМОГИТЕ И СОВЕТ..

СПАСИБО.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2012

Я прошел учебное пособие Бланделла, и благодаря ему я знаю, как создать бесконечно прокручивающуюся галерею:)

Чтобы ответить на вопрос, о как добавить текстовую подпись под каждым из изображений Я внес те же небольшие изменения в приятный рассказ Бланделла и использовал некоторые из его предложений в ответе выше, и я думаю, что у меня есть хороший способ выполнить задачу.

Код ниже не раздувает и не использует gallery_item.xmlвообще , так что это значительно повысит производительность по сравнению с тем способом, которым вы каждый раз раздуваете его.

Урезан код классов из учебника Бланделла (потому что в этом вопросе вы используете только ресурсы, а не sdcard).

public class InfiniteScrollingGalleryActivity extends Activity {

public class GalleryItem{
      int imageId;
      String caption;
       public int getImageId() {
        return imageId;     }

    public String getCaption() {
        return caption;
    }
        public GalleryItem(int i,String s) {
        imageId=i;
        caption=s;  }   
}

int[] resourceImages = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,
        R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
     GalleryItem[] item = new GalleryItem[6];
        //initialising all items, change member variables according to needs
    for(int i=0;i<6;i++){
        item[i] = new GalleryItem(resourceImages[i], "pic no" +(i+1));          }                
    setContentView(R.layout.activity_main);
     InfiniteGallery galleryOne = (InfiniteGallery) findViewById(R.id.galleryOne);
    galleryOne.setResourceGallery(item);
     }  }

Здесь я добавил массив класса GalleryItem и передал его.

Также добавил приведенный ниже код в классе InfiniteGalley.

public void setResourceGallery(GalleryItem[] item) {
        setAdapter(new InfiniteGalleryResourceAdapter(getContext(), item));
        setSelection((getCount() / 2));
    }

под кодом getView () являетсягде хорошие вещи происходят:

 public class InfiniteGalleryResourceAdapter extends BaseAdapter {

    /** The context your gallery is running in (usually the activity) */
    private Context mContext;   
 GalleryItem[] myItems; 

    public InfiniteGalleryResourceAdapter(Context context, GalleryItem[] item) {
        this.mContext = context;
            myItems=item;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // convertView is always null in android.widget.Gallery
        TextView t = new TextView(mContext);
        try {           
            int itemPos = (position % myItems.length);
            t.setText(myItems[itemPos].getCaption());
            Drawable d = mContext.getResources().getDrawable(myItems[itemPos].getImageId());
            ((BitmapDrawable) d).setAntiAlias(true); // Make sure we set anti-aliasing otherwise we get jaggies (non-smooth lines)

            //d.setBounds(0,0,60,60); //use this to change dimens of drawable,if needed
            t.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);

        } catch (OutOfMemoryError e) {
            // a 'just in case' scenario
            Log.e("InfiniteGalleryResourceAdapter", "Out of memory creating imageview. Using empty view.", e);
        }

        return t;
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }

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

    @Override
    public long getItemId(int position) {
        return position;
    }
    /** The width of each child image */
    private static final int G_ITEM_WIDTH = 120;
    /** The height of each child image */
    private static final int G_ITEM_HEIGHT = 80;
    private int imageWidth;
    private int imageHeight;
}

В getView() я просто создаю textView и назначаю рисованиеДля этого используйте удобный t.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null);.Таким образом, исключает необходимость раздувать макеты, что является тяжелой операцией.

Ниже приведено выходное изображение:

enter image description here

0 голосов
/ 21 марта 2012

В адаптере вы можете увидеть метод: getView, вы можете видеть, что этот метод возвращает ImageView, поэтому теперь вы хотите, чтобы метод getView возвращал imageview и textview ...

Вы можете сделать это несколькими способами, вот как вы можете сделать это с помощью LayoutInflater

View v = getLayoutInflater().inflate(R.layout.gallery_item, null);
((ImageView) v.findViewById(R.id.img)).setImageResource(imageIds[position]);
((TextView) v.findViewById(R.id.caption)).setText(captions[position]);

Таким образом, в вашей папке res / layout вы должны иметь макет 'gallery_item', который содержит ImageView (img) и TextView (заголовок)

т.е.

gallery_item.xml

 <LinearLayout>
      <ImageView ... />
      <TextView ... />
 </LinearLayout>

Надеюсь, это было полезно!

РЕДАКТИРОВАТЬ

так как в приведенном выше примере вам понадобятся два массива, один из imageIds и один из textCaptions. Чтобы ваш адаптер был красивым и чистым, вам нужно создать объект.

 public class GalleryItem {
       int imageId;
       String caption

       // Constructor

       // getters and setters

 }

Затем вы можете передать массив или список ваших GalleryItems в адаптер (заменив метод setAdapter). то есть:

 GalleryItem[] items = new GalleryItem[];

Тогда в вашем методе getView, как описано выше, вы извлечете каждый объект:

 GalleryItem item = items[position];
 View v = getLayoutInflater().inflate(R.layout.gallery_item, null);

((ImageView) v.findViewById(R.id.img)).setImageResource(item.getImageId());
((TextView) v.findViewById(R.id.caption)).setText(item.getCaption());

Надеюсь, это ясно

...