在 onActivityResult 中访问 ViewHolder 参数
Access ViewHolder parameter in onActivityResult
我有一个 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 变量中获取文件名。我想在 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)
几个笔记
ViewHolder
的 holder
参数应该仅由 Adapter
class 本身管理。
你能做什么
保存从 onActivityResult
接收到的当前选定 file/s 的引用,或者使用本地存储,例如 (List
、SharedPreferences
、 Realm
, 等等)
使用列表中的最新文件项再次填充文件选择器适配器
调用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.
阅读更多
我有一个 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 变量中获取文件名。我想在 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)
几个笔记
ViewHolder
的 holder
参数应该仅由 Adapter
class 本身管理。
你能做什么
保存从
onActivityResult
接收到的当前选定 file/s 的引用,或者使用本地存储,例如 (List
、SharedPreferences
、Realm
, 等等)使用列表中的最新文件项再次填充文件选择器适配器
调用
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.
阅读更多