在 onActivityResult 中访问 ViewHolder 参数

Access ViewHolder parameter in onActivityResult

我有一个 Recylerview,其中 ButtonTextView 作为参数。我在单击按钮时打开 文件选择器

@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 变量中获取文件名。我想在 onActivityResult:

中设置 holder.textview.setText(displayName);
@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.

之外

您需要在数据集中设置文件名。 并在 Activity 结果上调用 notifyDataSetChange()

您不应在适配器本身中处理点击事件。而是使用 interfaces.

将它们转发回 activity/fragment

所以当你点击按钮时,接口的方法在activity/fragment中被调用,从他们你可以很容易地检测到onActivityResult()方法。

因此,当您获得名称时,更新适配器数据集中的该值并通知您的适配器进行更改。

像这样一个简单的界面(代码在 Kotlin 中)

interface OnClickListener {
    fun onClick(position:Int)
}

并让您的 activity 实施它。现在在您的适配器 class 构造函数中将接口作为参数传递。

AdapterClass(private val listener: OnClickListener)

几个笔记

ViewHolderholder 参数应该仅由 Adapter class 本身管理。

你能做什么

  • 保存从 onActivityResult 接收到的当前选定 file/s 的引用,或者使用本地存储,例如 (ListSharedPreferencesRealm, 等等)

  • 使用列表中的最新文件项再次填充文件选择器适配器

  • 调用notifyDataSetChanged()

public void notifyDataSetChanged ()

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

阅读更多