В одном фрагменте моего текущего приложения есть три списка в виде списка, и каждый список отображает GridView, с примерно восемью-пятнадцатью изображениями в качестве элементов в GridView. Поэтому я делаю адаптер A и адаптер B. Адаптер A действует как мост между ListView и строкой, представляющей заголовок ListView и каждого GridView. Адаптер B соединяет GridView с его ImageView (8 ~ 15). Итак, в метод getView адаптера A я вставил код, который создал адаптер B, и подключился к соответствующему gridView. Причина вызова адаптера изнутри адаптера (и, конечно, мое личное предположение) состоит в том, что данные и изображения хорошо связаны с gridView, и, хотя он хорошо связан с ListView, скорость прокрутки GridView низкая как будто прокрутка остановилась.
Мой вопрос
1] Я хочу знать, почему скорость прокрутки gridView медленная, так как она остановлена.
- Лично я не думаю, что это из-за размера изображения. (Это связано с тем, что скорость прокрутки GridView была точно такой же, как и до ввода изображения в представление изображений.)
2] Какое решение?
- Я попытался загрузить изображение с помощью AsyncTask. Но мои изображения находятся в папке для рисования (переменная int), и я не знаю, как их загрузить (например, int mimageResource = R.drawable.image). При попытке этого изображения все равно будут иметь пустые элементы изображения. Когда открыт GridView, в то время скорость GridView была одинаковой, поэтому мне интересно, является ли AsyncTask решением.
Буду очень признателен за ваш совет.
--------------------------- это мой код ---------------- -----------------
1] SiteAdapter.java (ссылка на сетку и элемент)
public class SiteAdapter extends ArrayAdapter<Site> {
private Site currentSite;
private final int REQUEST_WIDTH = 256;
private final int REQUEST_HEIGHT = 256;
public Context context;
public SiteAdapter(Context context, ArrayList<Site> sites) {
super(context, 0, sites);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View listItemView = convertView;
SiteViewHolder viewHolder;
if(listItemView == null){
listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent,false);
viewHolder = new SiteViewHolder();
viewHolder.icon = (ImageView) listItemView.findViewById(R.id.image);
viewHolder.icon_name = (TextView) listItemView.findViewById(R.id.name);
listItemView.setTag(viewHolder);
}
else
viewHolder = (SiteViewHolder) listItemView.getTag();
currentSite = getItem(position);
viewHolder.position = position;
//new ThumbnailTask(position, viewHolder).execute((currentSite.getMsite_imagesource()));
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getContext().getResources(),currentSite.getMsite_imagesource(),options);
options.inSampleSize = setSimpleSize(options, REQUEST_WIDTH, REQUEST_HEIGHT);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),currentSite.getMsite_imagesource(),options);
viewHolder.icon.setBackground(new ShapeDrawable(new OvalShape()));
viewHolder.icon.setClipToOutline(true);
viewHolder.icon.setImageBitmap(bitmap);
viewHolder.icon_name.setText(currentSite.getMsite_name());
return listItemView;
}
private int setSimpleSize(BitmapFactory.Options options, int requestWidth, int requestHeight){
int originalWidth = options.outWidth;
int originalHeight = options.outHeight;
int size = 1;
while(requestWidth < originalWidth || requestHeight < originalHeight){
originalWidth = originalWidth / 2;
originalHeight = originalHeight / 2;
size = size * 2;
}
return size;
}
2] ListAdapter (ссылка list_title (String), GridView на ListView)
public class ListAdapter extends BaseAdapter {
public Context mcontext;
public Hashtable<String, ArrayList<Site>> mdata;
public Map.Entry<String,ArrayList<Site>> copyData;
public ArrayList<String> keySet = new ArrayList<String>();
private String key;
private int num=0;
public String currentName;
private ArrayList<Site> currentSite;
private int [] count = {0,0,0};
public ListAdapter(Context context,Hashtable<String, ArrayList<Site>> data){
mcontext = context;
mdata = data;
Iterator it = data.entrySet().iterator();
while(it.hasNext()) {
copyData = (Map.Entry<String, ArrayList<Site>>) it.next();
keySet.add(copyData.getKey());
}
}
public String getKey(int position){
//Iterator it = mdata.entrySet().iterator();
//copyData = (Map.Entry<String, ArrayList<Site>>) it.next();
return keySet.get(position);
}
@Override
public int getCount() {
/*Iterator it = mdata.entrySet().iterator();
while(it.hasNext())
{
num++;
}
return num;*/
return keySet.size();
}
@Override
public ArrayList<Site> getItem(int position) {
return mdata.get(keySet.get(position));
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
View view = convertView;
final ArrayList<Site> currentSite;
ListViewHolder holder;
if(view == null) {
view = LayoutInflater.from(mcontext).inflate(R.layout.site_list, parent, false);
holder = new ListViewHolder();
holder.list_title = (TextView) view.findViewById(R.id.title_site_list);
holder.lists = (GridView) view.findViewById(R.id.gridView);
view.setTag(holder);
}
else
holder = (ListViewHolder) view.getTag();
currentName = keySet.get(position);
holder.list_title.setText(currentName);
currentSite = getItem(position);
final SiteAdapter siteAdapter = new SiteAdapter(mcontext,currentSite);
holder.lists.setAdapter(siteAdapter);
final ViewSwitcher viewSwitcher = (ViewSwitcher) view.findViewById(R.id.visibility);
holder.list_title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(count[position]%2==0){
viewSwitcher.setVisibility(View.VISIBLE);
viewSwitcher.showNext();
count[position]++;
}
else if(count[position]%2==1){
viewSwitcher.setVisibility(View.GONE);
viewSwitcher.showNext();
count[position]++;
}
}
});
holder.lists.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
final Site site = currentSite.get(position);
if (site.getMsite_name() == "Gist home") {
PopupMenu popupIFWB = new PopupMenu(mcontext.getApplicationContext(), view);
popupIFWB.getMenuInflater().inflate(R.menu.insta_facebook_web_blog_popup_menu, popupIFWB.getMenu());
popupIFWB.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.webIFWB:
openWebPage(site.getMsite_urlW());
break;
case R.id.blogIFWB:
openWebPage(site.getMsite_urlB());
break;
case R.id.facebookIFWB:
openWebPage(site.getMsite_urlF());
break;
case R.id.instaIFWB:
openWebPage(site.getMsite_urlI());
break;
}
return false;
}
});
popupIFWB.show();
} else
openWebPage(site.getMsite_url());
}
});
return view;
}
private static class ListViewHolder{
public TextView list_title;
public GridView lists;
}
public void openWebPage(String url){
Uri webpage = Uri.parse(url);
Intent siteMove = new Intent(Intent.ACTION_VIEW, webpage);
if(siteMove.resolveActivity(mcontext.getPackageManager()) != null)
mcontext.startActivity(siteMove);
}
}
3] OfficialFragment.java (так же, как дома)
public class OfficialFragment extends Fragment {
private int count = 0;
private ArrayList<String> arrayGroup = new ArrayList<String>();
private Hashtable<String, ArrayList<Site>> arrayChild = new Hashtable<String, ArrayList<Site>>();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View viewMain = inflater.inflate(R.layout.listview, null);
super.onCreate(savedInstanceState);
ListView listView = (ListView) viewMain.findViewById(R.id.listView);
//GridView gridView = (GridView) viewMain.findViewById(R.id.gridView);
setArrayData();
ListAdapter listAdapter = new ListAdapter(getActivity(),arrayChild);
listView.setAdapter(listAdapter);
return viewMain;
}
public void openWebPage(String url){
Uri webpage = Uri.parse(url);
Intent siteMove = new Intent(Intent.ACTION_VIEW, webpage);
if(siteMove.resolveActivity(getActivity().getPackageManager()) != null)
startActivity(siteMove);
}
public void setArrayData(){
arrayGroup.add("공식 사이트 모음");
arrayGroup.add("조직 사이트 모음");
arrayGroup.add("동아리 사이트 모음");
ArrayList<Site> arrayOfficial = new ArrayList<Site>();
arrayOfficial.add(new Site("Gist home", "https://www.gist.ac.kr/kr/","https://blog.naver.com/gist1993","https://www.facebook.com/GIST.ac.kr/","https://www.instagram.com/gist1993/", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("Zeus system", "https://zeus.gist.ac.kr", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("Portal system", "https://portal.gist.ac.kr/intro.jsp", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("Email system", "https://mail.gist.ac.kr/loginl?locale=ko_KR", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("Gist college", "https://college.gist.ac.kr/", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("Gist library", "https://library.gist.ac.kr/", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("학내공지", "https://college.gist.ac.kr/main/Sub040203", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("GIST 창업진흥센터", "https://www.facebook.com/gistbi/?ref=py_c", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("전기전자컴퓨터공학부", "http://eecs.gist.ac.kr/", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("신소재공학부", "http://mse.gist.ac.kr", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("기계공학부", "http://me.gist.ac.kr", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("지구·환경공학부", "http://env1.gist.ac.kr", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("생명과학부", "http://life1.gist.ac.kr", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("물리·광과학과", "http://phys.gist.ac.kr/", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("화학과", "http://chem.gist.ac.kr", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("융합기술원", "http://iit.gist.ac.kr", R.drawable.ic_dashboard_black_24dp));
arrayOfficial.add(new Site("나노바이오재료전자공학과", "http://wcu.gist.ac.kr/", R.drawable.ic_dashboard_black_24dp));
ArrayList<Site> arrayOrganization = new ArrayList<Site>();
arrayOrganization.add(new Site("Gist 총학생회", "https://www.facebook.com/gistunion/", R.drawable.gistunion));
arrayOrganization.add(new Site("Gist 동아리연합회", "https://www.facebook.com/gistclubunite/", R.drawable.clubnight));
arrayOrganization.add(new Site("Gist 하우스", "https://www.facebook.com/GISTcollegeHOUSE/", R.drawable.gisthouse));
arrayOrganization.add(new Site("Gist 문화행사위원회", "https://www.facebook.com/Moonhangwe/", R.drawable.moonhangwe));
arrayOrganization.add(new Site("Gist 신문","http://gistnews.co.kr/", "https://www.facebook.com/pg/GistSinmoon/posts/", R.drawable.gistnews));
arrayOrganization.add(new Site("Gist 홍보대사", "http://blog.naver.com/PostList.nhn?blogId=gist1993&from=postList&categoryNo=28", R.drawable.gionnare));
ArrayList<Site> arrayCircle = new ArrayList<Site>();
arrayCircle.add(new Site("영화 동아리 Cinergy", "https://www.facebook.com/gistcinergy/", R.drawable.cinergy));
arrayCircle.add(new Site("영상편집 동아리 The Gist", "https://www.facebook.com/Gentletist/","https://www.youtube.com/channel/UCMUDHS0SZvQilFe5h6eI9rA/videos", R.drawable.thegist));
arrayCircle.add(new Site("문예창작 동아리 사각사각", "https://www.facebook.com/GIST-%EC%82%AC%EA%B0%81%EC%82%AC%EA%B0%81-238788459851229/", R.drawable.sagaksagak));
arrayCircle.add(new Site("gist 고양이 지냥이", "https://www.facebook.com/giscats/", R.drawable.giscat));
arrayCircle.add(new Site("요리동아리 이쑤시개", "https://www.facebook.com/%EC%9D%B4%EC%91%A4%EC%8B%9C%EA%B0%9C-%EC%9A%94%EB%A6%AC%ED%95%98%EB%8A%94-GIST%EC%83%9D-272551203239747/?ref=py_c", R.drawable.essosigae));
arrayCircle.add(new Site("칵테일 동아리 MixoloGIST", "https://www.facebook.com/Mixologist-1584231725157207", R.drawable.mixologist));
arrayCircle.add(new Site("보드게임 동아리 BGM", "https://www.facebook.com/GISTBGM", R.drawable.bgm));
arrayCircle.add(new Site("성소수자 모임 speQtrum", "https://www.facebook.com/gistspeqtrum/", R.drawable.speqtrum));
arrayCircle.add(new Site("만화 동아리 erutlucbus", "https://www.facebook.com/Erutlucbus/", R.drawable.eru));
arrayCircle.add(new Site("천체관측 동아리 SpaceBar", "https://www.facebook.com/GISTspacebar/", R.drawable.spacebar));
arrayCircle.add(new Site("전산 동아리 WING", "https://www.facebook.com/GISTWING/", R.drawable.wing));
arrayCircle.add(new Site("환경 동아리 온새미로", "https://www.facebook.com/onsaemiro123/", R.drawable.onsaemiro));
arrayCircle.add(new Site("축구 동아리 Kickass", "https://www.facebook.com/gistkickass/?ref=br_rs", R.drawable.kickass));
arrayChild.put(arrayGroup.get(0),arrayOfficial);
arrayChild.put(arrayGroup.get(1),arrayOrganization);
arrayChild.put(arrayGroup.get(2),arrayCircle);
}
}
4] SiteHolder.java (ViewHolder содержит элемент GridView)
public class SiteViewHolder {
public ImageView icon;
public TextView icon_name;
public int position;
}