在onActivityResult中访问ViewHolder参数

时间:2019-01-22 10:04:15

标签: android android-recyclerview recycler-adapter onactivityresult recyclerview-layout

我有一个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 变量中获得了文件名。我想在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 :(得分:2)

少量笔记

ViewHolder的{​​{1}}参数应该仅由holder类本身来管理。

您可以做什么

  • 使用{AdapteronActivityResultList等本地存储,为从SharedPreferences收到的当前选定文件保留引用。等)

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

  • 调用Realm

  

public void notifyDataSetChanged()

     

通知附加的观察者基础数据已更改,任何反映数据集的View均应刷新自身。

了解更多信息

答案 1 :(得分:1)

您将需要在数据集中设置文件名。 然后在“活动结果”中致电notifyDataSetChange()

答案 2 :(得分:0)

您不应在适配器本身中处理单击事件。而是使用界面将它们转发回活动/片段。

因此,当您单击该按钮时,将在活动/片段中调用该界面的方法,从中您可以轻松地检测到onActivityResult()方法。

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

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

interface OnClickListener {
    fun onClick(position:Int)
}

并让您的活动实现它。现在,在您的适配器类构造函数中,将接口作为参数传递。

AdapterClass(private val listener: OnClickListener)