Доступ к параметру ViewHolder в onActivityResult - PullRequest
0 голосов
/ 22 января 2019

У меня есть Recylerview с Button и TextView в качестве параметров. Я открываю файл выбора при нажатии кнопки.

@Override
public void onBindViewHolder(final FileChooserAdapter.MyViewHolder holder, final int position) {
    PojoClass pojoClass = pojoClassList_.get(position);
    holder.listViewName.setText(pojoClass.getListName());
    holder.fileBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent filePickIntent = new Intent(Intent.ACTION_GET_CONTENT);
            filePickIntent.setType("*/*");
            startActivityForResult(filePickIntent, 1);
        }
    });

}

Теперь, после выбора файла, я получаю имя файла в переменной OnActivityResult displayName . Я хочу установить holder.textview.setText(displayName); в onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 1:
        // Get the Uri of the selected file
        Uri uri = data.getData();
        String uriString = uri.toString();
        File myFile = new File(uriString);
        String path = myFile.getAbsolutePath();


        if (uriString.startsWith("content://")) {
            Cursor cursor = null;
            try {
                cursor = getContentResolver().query(uri, null, null, null, null);
                if (cursor != null && cursor.moveToFirst()) {
                    displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                }
            } finally {
                cursor.close();
            }
        } else if (uriString.startsWith("file://")) {
            displayName = myFile.getName();
        }
        // I want to place the holder.textview.setText(displayName) here
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Помогите мне, как разместить параметры ViewHolder снаружи Adapter.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вы не должны обрабатывать события щелчка в самом адаптере.Вместо этого перенаправьте их обратно к деятельности / фрагменту, используя интерфейсы .

Так что, когда вы нажимаете на кнопку, метод интерфейса вызывается в активности / фрагменте, и из их можно легко обнаружитьметод onActivityResult().

Поэтому, когда вы получите имя, обновите это значение в наборе данных вашего адаптера и уведомите адаптер об этих изменениях.

Простой интерфейс, подобный этому (Код на Kotlin)

interface OnClickListener {
    fun onClick(position:Int)
}

И заставь свою деятельность это осуществить.Теперь в вашем конструкторе класса адаптера передайте интерфейс в качестве параметра.

AdapterClass(private val listener: OnClickListener)
0 голосов
/ 22 января 2019

Несколько нот

Параметр ViewHolder holder должен обрабатываться только самим классом Adapter.

Что вы можете сделать

  • Содержит ссылку на текущий выбранный файл / файлы, полученные от onActivityResult, либо с использованием локального хранилища, например (List, SharedPreferences, Realm и т. Д.)

  • Заполните адаптер выбора файлов снова с самыми последними элементами файла из списка

  • Invoke notifyDataSetChanged()

public void notifyDataSetChanged ()

Уведомляет прикрепленных наблюдателей о том, что базовые данные были изменены, и любое представление, отражающее набор данных, должно само обновиться.

Подробнее о

0 голосов
/ 22 января 2019

Вам нужно будет указать имя файла в вашем DataSet.И позвоните notifyDataSetChange() по результатам деятельности.

...