

こんにちは。現在アンドロイドの画像スライドショーのアプリケーションを作っております。概要を説明すると、実機上に保存された画像をcursorで取得し、画面上の再生・進む・戻るボタンで画像を切り替えていくもので、現在各ボタンごとにメソッドを用意して各種操作を行おうとしております。現在つまずいているところは、進む・戻るボタンを押しても画像が切り替わらないというところです。なお、エラーはおこっておりません。  
以下がコードです。

[code]

    package jp.oooooo.hojun.bun.autoslideshowapp;
    
    import android.Manifest;
    import android.content.ContentResolver;
    import android.content.ContentUris;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Build;
    import android.provider.MediaStore;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends AppCompatActivity {
    
    Button mStartPauseButton;
    Button mForwardButton;
    Button mBackButton;
    Cursor cursor;
    
    private static final int PERMISSIONS_REQUEST_CODE = 100;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mStartPauseButton = findViewById(R.id.button1);
        mForwardButton = findViewById(R.id.button2);
        mBackButton = findViewById(R.id.button3);
    
        mForwardButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 getNextInfo();
            }
        });
    
        mBackButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 getPreviousInfo();
            }
        });
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                getContentsInfo();
            } else {
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_CODE);
            }
        } else {
            getContentsInfo();
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSIONS_REQUEST_CODE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    getContentsInfo();
                }
                break;
            default:
                break;
        }
    }
    
    private void getContentsInfo() {
        ContentResolver resolver = getContentResolver();
        cursor = resolver.query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                null,
                null,
                null,
                null
        );
    
         cursor.moveToFirst();
            int fieldIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
            Long id = cursor.getLong(fieldIndex);
            Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
    
            ImageView imageVIew = findViewById(R.id.imageView);
            imageVIew.setImageURI(imageUri);
    }
    private void getNextInfo() {
        ContentResolver resolver = getContentResolver();
        cursor = resolver.query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                null,
                null,
                null,
                null
        );
    
        cursor.moveToFirst();
        int fieldIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
        Long id = cursor.getLong(fieldIndex);
        Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
    
        ImageView imageVIew = findViewById(R.id.imageView);
        imageVIew.setImageURI(imageUri);
    }
    
    private void getPreviousInfo() {
        ContentResolver resolver = getContentResolver();
        cursor = resolver.query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                null,
                null,
                null,
                null
        );
    
        cursor.moveToFirst();
        int fieldIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
        Long id = cursor.getLong(fieldIndex);
        Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
    
        ImageView imageVIew = findViewById(R.id.imageView);
        imageVIew.setImageURI(imageUri);
    }
    
    
    @Override
    protected void onStop() {
        super.onStop();
        cursor.close();
    }
    }
    
[/code]

どのようにすれば次または前の画像を取得できるでしょうか。


CC BY-SA 3.0
2018-03-18T14:56:19.893
42475
2018-03-19T02:48:22.787
27793
question
android java
Androidアプリ。複数のメソッドでcursorを利用する方法。


まず理解すべきポイントが大きく２つありそうです。

  1. 変数のスコープと変数への代入の意味
  2. AndroidのCursorの機能

* * *

1.についてはプログラミング言語において基本的な内容なので詳細な説明は割愛します。  
`cursor`はインスタンス変数として宣言されているので、質問文のコードであればどのメソッドからでも参照可能です。  
但し`getNextInfo()`/`getPreviousInfo`で再代入しているので異なるインスタンスを参照しています。

* * *

2.については`Cursor`をデータリストへの矢印とイメージすると理解しやすいかもしれません。

[code]

    +-----+
    |data1|  : moveToFirst()
    +-----+
    |data2|  : moveToPrevious()
    +-----+
    |data3| ← Cursor(カーソル)のposition(位置)
    +-----+
    |data4|  : moveToNext()
    +-----+
    |data5|  : moveToLast()
    +-----+
    
[/code]

`Cursor`が現在指しているのが`data3`の場合、`Next`/`Previous`はそれぞれ次と前を指すように矢印が移動します。  
`First`と`Last`はそれぞれデータリストの先頭と末尾を指すように矢印が移動します。

* * *

質問文のコードでは、毎回`Cursor`のインスタンスを再取得し、`moveToFirst`で先頭を指すようにしているため、同じデータしか取得されません。  
エラー処理を無視して単にコードを記載するなら以下のようになります。  
(表示画像は最初と最後でループするようにしています。)

[code]

    private void getNextInfo() {
        if (!cursor.moveToNext()) {
            cursor.moveToFirst();
        }
    
        int fieldIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
        Long id = cursor.getLong(fieldIndex);
        Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
    
        ImageView imageVIew = findViewById(R.id.imageView);
        imageVIew.setImageURI(imageUri);
    }
    
    private void getPreviousInfo() {
        if (!cursor.moveToPrevious()) {
            cursor.moveToLast();
        }
    
        int fieldIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID);
        Long id = cursor.getLong(fieldIndex);
        Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
    
        ImageView imageVIew = findViewById(R.id.imageView);
        imageVIew.setImageURI(imageUri);
    }
    
[/code]


CC BY-SA 3.0
2018-03-19T02:48:22.787
42480
2018-03-19T02:48:22.787
20272
42475
answer