1

Я попытался открыть галерею из моего адаптера.onActivityResult в RecyclerView.Adapter <MyAdapter.MyViewHolder>

emp_photo_edit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       ((EmployeeActivity)context).startActivityForResult(i, 2017); 
      } 
     }); 

Тогда я хочу, чтобы показать, что Выбирается изображение в мой imageview в моем recycycleview, как сделать это? Потому что я не могу добавить onActivityResult на свой adapter. Заранее спасибо

Edit

Мой Полный код

public static class MyViewHolder extends RecyclerView.ViewHolder { 
    .... 

    public MyViewHolder(View v) { 
     super(v); 
     .... 

    } 
    public void bind(final Employee item, final OnItemClickListener listener, final Context context) { 
     .... 
     generateDialog(item,dialog_employee); 
     .... 

    } 

    ... 
    ... 
    void generateDialog(Employee item, View v){ 
     //Dialog child 
     //Photo 
     emp_photo_edit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       ((EmployeeActivity)context).startActivityForResult(i, 2017); 
      } 
     }); 
     .... 
    } 
} 
+0

ok Затем создайте прослушиватель событий с помощью интерфейса и реализуйте его в RecycycleView, чтобы получить выбранное изображение. –

+0

на самом деле я использую 'ViewHolder', и это затрудняет получение данных из внешнего класса. мог бы привести пример? – Huzain

+1

См. [Создание пользовательских прослушивателей] (https://guides.codepath.com/android/Creating-Custom-Listeners) –

ответ

0

Самый простой способ для того чтобы достигнуть этой цели является создание интерфейса OnActivityResult и сделать RecyclerView адаптер для реализации этого интерфейса. Затем по активности реализуем метод onActivityResult и пересылаем метод onActivityResult из адаптера recyclerView, который реализует интерфейс OnActivityResult.

public interface OnActivityResult{ 
    void onActivityResult(int requestCode, int resultCode, Intent data); 
} 

Внесите свой адаптер recycliewiew для реализации этого интерфейса;

class MyRecyclerViewAdapter implements onActivityResult{ 

    void onActivityResult(int requestCode, int resultCode, Intent data){ 
    //logic to load bitmap to imageview; 
    } 
} 

В recyclerview контейнерной деятельности вперед метод onActivtyResult к адаптеру:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(adapter != null && adapter implements OnActivityResult){ 
      adapter.onActivityResult(requestCode,resultCode,data); 
    } 
} 

Edit: В вашем конкретном случае, вы можете вы можете использовать следующее: в методе onActivityResult от адаптера реализации это: @Override public void onActivityResult (int requestCode, int resultCode, Intent data) {

if(requestCode == 0 && resultCode == Activity.RESULT_OK && requestedPosition != -1) { 
     imageDataSource.putPath(context, requestedPosition, data.getData()); 
     notifyItemChanged(requestCode); 
     requestedPosition = -1; 
    } 
} 

В реализации метода связывания добавить эту строку:

imageLoader.loadImage(imageDataSource,emp_photo_edit); 

imageLoader может быть любое изображение погрузчика в состоянии загрузить изображение из памяти, используя путь. Также в emp_photo_edit клик слушателя добавить эту строку:

requestedPosition = getAdapterPosition(); 

Основная идея заключается в том, чтобы сохранить путь изображения к внешнему источнику данных и, когда адаптер получить в onActivityResult уведомления только получить путь изображения из этого внешнего источник изображения. Возможная реализация для этого источника данных изображения может быть таким:

public class ImageDataSource { 

private SparseArrayCompat<String> paths; 

private ImageDataSource(){ 
    paths = new SparseArrayCompat<>(); 
} 

public String getPathFor(int position){ 
    String path = paths.get(position); 
    if(path == null){ 
     return null;// or return path to a default image; 
    }else{ 
     return path; 
    } 
} 

public void putPath(Context context, int position, Uri uri){ 
    String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = context.getContentResolver().query(uri,filePathColumn, null, null, null); 
    cursor.moveToFirst(); 
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    String picturePath = cursor.getString(columnIndex); 
    putPath(context,position,picturePath); 
} 

public void putPath(Context context, int position, String path){ 
    paths.put(position,path); 
} 
} 
+0

уточните мое обновление – Huzain

0

Ваш результат будет прибывать в EmployeeActivity в onActivityResult. Поскольку вы выбираете изображение, результатом будет Uri, который вам нужно будет сначала получить, а затем привязать к соответствующему элементу. Я предлагаю следующую последовательность действий:

  1. Создайте новый код запроса, который сохраняет позицию позиции и идентифицирует запрос. Если других запросов нет, вы можете просто сделать свой идентификатор строки своим кодом запроса.
  2. Получите Uri с помощью data.getData() и сохраните полученный код запроса. Убедитесь, что код результата - Activity.RESULT_OK.
  3. Введите код Uri и код запроса (который содержит идентификатор элемента) в Loader или что-то похожее на получение изображения.
  4. Сохраните полученное изображение где-нибудь доступным для вашего MyViewHolder для идентификатора элемента. Например, вы можете создать внутри него Map, в котором будут храниться загруженные изображения.
  5. Найдите позицию для идентификатора элемента в адаптере и позвоните по номеру notifyItemChanged на адаптер для принятого положения. Вы можете позвонить либо notifyItemChanged(int position), чтобы выполнить полную перегруппировку, либо notifyItemChanged(int position, Object payload), где payload будет вашим растровым изображением.
+0

как отправить Uri на myviewholder? – Huzain

+0

@Huzain У меня, вероятно, был бы такой метод, как 'void putLoadedBitmap (int itemId, @NonNull Bitmap bitmap)' на 'MyViewHolder', и он сохранил бы растровое изображение внутри карты. – Malcolm

+0

Да, тогда как назвать этот метод? myviewholder находится внутри myadapter. Я попытался вызвать любой метод, но я не знаю, как вызвать этот метод в myviewholder, который был внутри myadapter. – Huzain

 Смежные вопросы

  • Нет связанных вопросов^_^