質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

Android java gridImageAdapter

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 435

score 14

ただいま、InstagramCloneを作成しております。
https://www.youtube.com/watch?v=LiOC0nuL0gg&list=PLgCYzUzKIBE9XqkckEJJA0I1wVKbUAOdv&index=16

Youtubeを見ながら作成しています。
gridImageAdapter作成時に以下のエラーが発生しました。
ご教授よろしくお願いいたします。

Process: com.example.instgramclone, PID: 24943
java.lang.IllegalArgumentException: view must not be null
at com.nostra13.universalimageloader.core.imageaware.ViewAware.<init>(ViewAware.java:70)
at com.nostra13.universalimageloader.core.imageaware.ViewAware.<init>(ViewAware.java:50)
at com.nostra13.universalimageloader.core.imageaware.ImageViewAware.<init>(ImageViewAware.java:44)
at com.nostra13.universalimageloader.core.ImageLoader.displayImage(ImageLoader.java:365)
at com.example.instgramclone.Utils.GridImageAdapter.getView(GridImageAdapter.java:62)
at android.widget.AbsListView.obtainView(AbsListView.java:2405)
at android.widget.GridView.onMeasure(GridView.java:1085)
at android.view.View.measure(View.java:24530)

ProfileActivity

public class ProfileActivity extends AppCompatActivity {
    private static final String TAG = "ProfileActivity";
    private static final int ACTIVITY_NUM = 4;

    private Context mContext = ProfileActivity.this;

    private ProgressBar mProgressBar;
    private ImageView profilePhoto;



    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
        Log.d(TAG,"onCreate: started.");

        mProgressBar = findViewById(R.id.profileProgressBar);
        mProgressBar.setVisibility(View.GONE);


        setupBottomNavigationView();
        setupToolbar();
        setupActivityWidgets();
        setProfileImage();

        tempGridSetup();
    }

    private void tempGridSetup(){
        ArrayList<String> imgURLs = new ArrayList<>();
        imgURLs.add("https://news.mynavi.jp/article/20180417-617921/index_images/index.jpg");
        imgURLs.add("https://rr.img.naver.jp/mig?src=http%3A%2F%2Fimgcc.naver.jp%2Fkaze%2Fmission%2FUSER%2F20170120%2F54%2F5652024%2F25%2F721x721x3d94427ccbd535e0e48f2bc1.jpg&twidth=1200&theight=1200&qlt=80&res_format=jpg&op=r");
        imgURLs.add("https://pbs.twimg.com/media/DQVO_CYVAAA02ZA.jpg");
        imgURLs.add("https://img.cinematoday.jp/a/E0014733/_size_c200x200/_v_1550029749/main.jpg");
        imgURLs.add("https://stat.ameba.jp/user_images/20190902/13/ibgsugi/4c/d4/p/o0880058014569278596.png?caw=800");
        imgURLs.add("https://www.sankei.com/images/news/181128/prl1811280044-p1.jpg");
        imgURLs.add("https://eiga.k-img.com/images/movie/90864/photo/de2bab49be6913e7/640.jpg");
        imgURLs.add("https://kamizublog.com/wp-content/uploads/2019/08/%E7%94%9F%E7%90%86%E3%81%A1%E3%82%83%E3%82%93%E5%A3%B0.jpg");
        imgURLs.add("http://livedoor.blogimg.jp/lilicocoyuka/imgs/2/7/277ebde2.jpg");
        imgURLs.add("https://contents.newspicks.com/images/news/3158452?updatedAt=20180708233123");
        imgURLs.add("https://sukini164.com/wp-content/uploads/2018/06/douteikun.png");

        setupImageGrid(imgURLs);
    }

    private void setupImageGrid(ArrayList<String> imgURLs){
        GridView gridView = findViewById(R.id.gridView);

        GridImageAdapter adapter = new GridImageAdapter(mContext,R.layout.layout_grid_imageview,"",imgURLs);
        gridView.setAdapter(adapter);

    }

    private void setProfileImage(){
        Log.d(TAG, "setProfileImage: setting profile photo");
        String imgURL = "pbs.twimg.com/profile_images/1124847009632899072/L6TtEBAK_400x400.jpg";
        UniversalImageLoader.setDefaultImage(imgURL,profilePhoto,mProgressBar,"https://");
    }
    private void setupActivityWidgets(){
        mProgressBar = findViewById(R.id.profileProgressBar);
        mProgressBar.setVisibility(View.GONE);
        profilePhoto=findViewById(R.id.profile_photo);
    }

    private void setupToolbar() {
        Toolbar toolbar = findViewById(R.id.profileToolBar);
        setSupportActionBar(toolbar);

        ImageView profileMenu = findViewById(R.id.profileMenu);
        profileMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG,"OnClick: navigating to account settings");
                Intent intent = new Intent(mContext,AccountSettingsActivity.class);
                startActivity(intent);
            }
        });
    }
    //BottomNavigationView setup
    private void setupBottomNavigationView(){
        Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
        BottomNavigationViewEx bottomNavigationViewEx = findViewById(R.id.bottomNavViewBar);
        BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
        BottomNavigationViewHelper.enableNavigation(mContext,bottomNavigationViewEx);
        Menu menu =bottomNavigationViewEx.getMenu();
        MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
        menuItem.setChecked(true);


    }}


GridImageAdapter

package com.example.instgramclone.Utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;


import com.example.instgramclone.R;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

import java.util.ArrayList;

public class GridImageAdapter extends ArrayAdapter<String> {

    public Context mContext;
    private LayoutInflater mInflater;
    private int layoutResource;
    private String mAppend;
    public ArrayList<String> imgURLs;

    public GridImageAdapter(Context context, int layoutResource, String append, ArrayList<String> imgURLs) {
        super(context,layoutResource,imgURLs);
        mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mContext = context;

        this.layoutResource = layoutResource;
        mAppend = append;
        this.imgURLs = imgURLs;
    }
    private static class ViewHolder{
        ImageView image;
        ProgressBar mProgressBar;
    }

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

        final ViewHolder holder;

        if(convertView == null){
            convertView = mInflater.inflate(layoutResource,parent,false);
            holder = new ViewHolder();
            holder.mProgressBar=convertView.findViewById(R.id.profileProgressBar);
            holder.image = convertView.findViewById(R.id.profile_photo);

            convertView.setTag(holder);
        }
        else{
            holder = (ViewHolder)convertView.getTag();
        }
        String imgURL = getItem(position);

        ImageLoader imageLoader = ImageLoader.getInstance();

        imageLoader.displayImage(mAppend + imgURL, holder.image,  new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String imageUri, View view) {
                if(holder.mProgressBar != null){
                    holder.mProgressBar.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                if(holder.mProgressBar != null) {
                    holder.mProgressBar.setVisibility(View.GONE);
                }

            }

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                if (holder.mProgressBar != null) {
                    holder.mProgressBar.setVisibility(View.GONE);
                }
            }
            @Override
            public void onLoadingCancelled(String imageUri, View view) {
                if (holder.mProgressBar != null) {
                    holder.mProgressBar.setVisibility(View.GONE);
                }
            }
        });

        return convertView;
    }
}


activity_profie

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

       <include layout="@layout/layout_center_profile"/>

        <include layout="@layout/layout_bottom_navigation_view"/>

        <androidx.core.widget.ContentLoadingProgressBar
            android:layout_width="150dp"
            android:layout_height="150dp"
            android:id="@+id/profileProgressBar"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="100dp"
            />
    </RelativeLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/10/26 11:52

    ``` の後ろには, ファイル名では無く言語名( java, xml 等)を記入してください.
    ファイル名は ``` の前の行等に記入してください.

    キャンセル

  • jimbe

    2019/10/26 13:13

    修正ありがとうございます.

    キャンセル

回答 1

checkベストアンサー

0

holder.image = convertView.findViewById(R.id.profile_photo);

が機能しておらず, holder.image が null なのではないでしょうか.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る