Как я могу динамически добавлять изображения в GridView?

#java #android #android-image #android-gridview

#java #Android #android-изображение #android-gridview

Вопрос:

У меня есть GridView , который создается на основе массива элементов. Мне нужно добавить больше изображений, поскольку сетка прокручивается до самого низа, но я не уверен, как это сделать.

Теперь я понимаю следующее:

  1. У меня есть адаптер, который анализирует массив и предоставляет ImageIds классу, который вернет ImageViews
  2. Каким-то образом я должен изменить этот массив и сообщить об этом адаптеру, поэтому мой вопрос в том, как мне получить ссылку на этот адаптер?

Это мой код:

 package com.wm.grid;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.Toast;

public class GridActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Integer[] mThumbIds12 = {
                R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7
    };
    final Integer[] mThumbIds1 = { 
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
    };
    final GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this,mThumbIds12));
    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Toast.makeText(GridActivity.this, ""   position, Toast.LENGTH_SHORT).show();

        }
    });
    gridview.setOnScrollListener(new OnScrollListener() {
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            switch (scrollState) {
            case OnScrollListener.SCROLL_STATE_IDLE:
                //List is idle
                break;
            case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                //Toast.makeText(GridActivity.this, "X", Toast.LENGTH_SHORT).show();
                break;
            case OnScrollListener.SCROLL_STATE_FLING:
                //Toast.makeText(GridActivity.this, "Z", Toast.LENGTH_SHORT).show();
                break;
            }   
        }

        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if(firstVisibleItem   visibleItemCount == totalItemCount){
                Toast.makeText(GridActivity.this, "BOTTOM", Toast.LENGTH_SHORT).show();

            }
            //Toast.makeText(GridActivity.this, "TOP", Toast.LENGTH_SHORT).show();  
        }
    });

}
}
  

Теперь есть некоторый избыточный код, но это мой тестовый проект. Все, что я знаю, это то, что обновление адаптера должно происходить, когда firstVisibleItem visibleItemCount == totalItemCount (т. е. когда GridView достигнет дна).

Это мое ImageAdapter (основано на сайте разработчиков Android)

 package com.wm.grid;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import com.wm.grid.R;

public class ImageAdapter extends BaseAdapter {
   private Context mContext;
   private Integer[] mThumbIds;
    public ImageAdapter(Context c,Integer[] m) {
        mContext = c;
        mThumbIds = m;
    }

    public int getCount() {
        return mThumbIds.length;
    }

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

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

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }
    public Integer[] AddItems(Integer[] a){
        final Integer[] aThumbIds;
        final int i;
        aThumbIds = a;
        Integer[] a2 = new Integer[mThumbIds.length   aThumbIds.length];
        System.arraycopy(mThumbIds, 0, a2, 0, mThumbIds.length);
        System.arraycopy(aThumbIds, 0, a2, mThumbIds.length, aThumbIds.length);
        return mThumbIds;
    }
}
  

image.xml

 <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@ id/grid_item_image"
      android:layout_width="50dp"
      android:layout_height="50dp"
      android:src="@drawable/s1"
      >
</ImageView>
  

main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@ id/layout1"
>
<LinearLayout
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_weight="1">

<TextView
android:id="@ id/tv1"
android:layout_width="fill_parent"
android:layout_height="40pt"
android:text="row three"
android:textSize="15pt" />

</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<GridView  
android:id="@ id/gridview"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:columnWidth="150dp"
android:numColumns="auto_fit"
android:verticalSpacing="2dp"
android:horizontalSpacing="2dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
</LinearLayout>
  

Как мне следует подойти к этому?

Ответ №1:

Вы можете получить ссылку на адаптер, поддерживающий GridView, с помощью .getAdapter(). Когда пользователь прокручивает страницу вниз, возьмите этот адаптер, добавьте новые изображения (я думаю, вам следует использовать ArrayList вместо простых массивов, чтобы вы могли легко добавлять дополнительные данные в класс ImageAdapter) и вызовите .notifyDataSetChanged() на теперь измененном адаптере, чтобы он загрузил новые данные.

Комментарии:

1. Всем привет, спасибо за ответ. Когда я пытаюсь использовать адаптер, я обнаруживаю другую проблему. Адаптер, который я получаю с помощью getAdapter, является ListAdapter … а для метода notifyDataSetChanged() требуется ArrayAdapter… Я действительно в замешательстве.

2. Поскольку вы знаете, что на самом деле это ImageAdapter, просто приведите его. ImageAdapter yourAdapter = (ImageAdapter)yourGrid.getAdapter().

3. Я сделал это:` Toast.makeText(GridActivity.this, «СНИЗУ», Toast. LENGTH_SHORT).show(); ImageAdapter ia = (ImageAdapter)gridview.getAdapter(); ia. AddItems(mThumbIds1); ia.notifyDataSetChanged(); gridview.invalidate();` и результатом является то, что приложение работает, однако изображения в gridview не добавляются. Есть только те, которые загружаются при загрузке приложения. Что не так?

4. Да, ты гениален. Я сделал это. На самом деле оказалось, что это была действительно моя глупая ошибка. Теперь, когда это отлажено, я создаю бесконечные просмотры сетки…. Спасибо.

5. @user1036005 :: Как вы этого добились? пожалуйста, не могли бы вы помочь мне в создании бесконечной сетки для изображений..

Ответ №2:

Вы должны иметь возможность вызывать getAdapter в gridview. Или — возможно, это не лучшая практика — но вы могли бы сделать адаптер статическим, что позволило бы вам получать доступ из вашей активности в Grid. Затем вы могли бы добавлять изображения в адаптеры «на лету» и сбрасывать свой макет.

Попробуйте. Это то, что я бы сделал. Если вы найдете лучший способ, дайте мне знать!

Комментарии:

1. Привет, приятель, я не могу использовать getAdapter, потому что он возвращает ListAdapter, и я понятия не имею, что с ним делать… (глупый я) Есть предложения?