super.onActivityResult 内部适配器 class? Android
super.onActivityResult inside adapter class? Android
我的 RecyclerView 包含非常复杂的项目,多个 buttons/images/texts。
为了访问每个 button/image,我在适配器 class.
中设置了点击监听器
但是现在我正在尝试添加设置联系人铃声的功能,但我遇到了问题。
我这样调用 onActivityResult 方法:
Intent contactIntent = new Intent(Intent.ACTION_PICK);
contactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);
contactIntent.putExtra("ITEM_POSITION", position);
((Activity) context).startActivityForResult(contactIntent, CONTACT_CHOOSER_ACTIVITY_CODE );
而且效果很好。
但问题是:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
....
...
...
}
}
我收到此错误:Cannot resolve method 'onActivityResult(int, int, android.content.Intent)'
有什么办法可以避免这种情况吗?或者是否可以在适配器 class 中使用此方法?如果不是我该怎么办?
您不能在任何适配器 class 中使用此方法,这只是 Activity
中的一个方法,每个 class extends Activity
都可以覆盖此方法,但是当然不是适配器。
请参阅java
中的Overrides
关于 onActivityResult
,请参阅 Activity#onActivityResult(int, int, Intent)
对于 RecyclerView.Adapter
之类的东西,您需要在适配器中定义一个接口并在 Activity 中实现该接口。
例如,这里是一个应用程序的代码,它将所点击项目的字符串及其位置发送到显示它的新 Activity:
主要Activity:
public class MainActivity extends AppCompatActivity implements MyAdapter.CallbackInterface {
private static final int MY_REQUEST = 1001;
private static final String [] ITEMS = {"Item 1", "Item 2", "Item 3" ,"Item 4", "Item 5", "Item 6"};
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ... Adapter setup, simple LinearLayoutManager and String [] used
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rec_view);
myAdapter = new MyAdapter(this, ITEMS);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(myAdapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode){
case RESULT_OK:
// ... Check for some data from the intent
if(requestCode == MY_REQUEST){
// .. lets toast again
int position = -1;
if(data != null){
position = data.getIntExtra("Position", 0);
}
if(position != -1) {
Toast.makeText(this, "Handled the result successfully at position " + position, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "Failed to get data from intent" , Toast.LENGTH_SHORT).show();
}
}
break;
case RESULT_CANCELED:
// ... Handle this situation
break;
}
}
/**
* Interface Method which communicates to the Acitivty here from the {@link MyAdapter}
* @param position - the position
* @param text - the text to pass back
*/
@Override
public void onHandleSelection(int position, String text) {
Toast.makeText(this, "Selected item in list "+ position + " with text "+ text, Toast.LENGTH_SHORT).show();
// ... Start a new Activity here and pass the values
Intent secondActivity = new Intent(MainActivity.this, DetailActivity.class);
secondActivity.putExtra("Text",text);
secondActivity.putExtra("Position", position);
startActivityForResult(secondActivity, MY_REQUEST);
}
}
xml 主Activity:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.divshark.recyclerviewsimpledemo.MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rec_view" />
</RelativeLayout>
我的适配器:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder>{
private CallbackInterface mCallback;
private String [] mMyItems;
private Context mContext;
public interface CallbackInterface{
/**
* Callback invoked when clicked
* @param position - the position
* @param text - the text to pass back
*/
void onHandleSelection(int position, String text);
}
public MyAdapter(Context context, String [] myItems){
mContext = context;
mMyItems = myItems;
// .. Attach the interface
try{
mCallback = (CallbackInterface) context;
}catch(ClassCastException ex){
//.. should log the error or throw and exception
Log.e("MyAdapter","Must implement the CallbackInterface in the Activity", ex);
}
}
@Override
public int getItemCount() {
return mMyItems.length;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void onBindViewHolder(MyHolder holder, final int position) {
// Set the text for the View
holder.mTextView.setText(mMyItems[position]);
// Use your listener to pass back the data
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mCallback != null){
mCallback.onHandleSelection(position, mMyItems[position]);
}
}
});
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
return new MyHolder(view);
}
static class MyHolder extends RecyclerView.ViewHolder{
TextView mTextView;
public MyHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.tv_list_item);
}
}
}
适配器布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="?listPreferredItemHeight">
<TextView
android:id="@+id/tv_list_item"
android:textColor="@android:color/black"
tools:text="Some Text Holder"
android:layout_marginLeft="16dp"
android:textSize="18sp"
android:layout_centerVertical="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
和细节Activity:
public class DetailActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.detail_activity);
TextView textView = (TextView) findViewById(R.id.tv_detail_text);
if(getIntent() != null && getIntent().getExtras() != null) {
Bundle extras = getIntent().getExtras();
String text = extras.getString("Text");
int position = extras.getInt("Position");
textView.setText(String.format("%s at position %d", text, position));
// .. For this purpose set result okay and use position as part of data when Activity finishes
// Which will in turn invoke the onActivityResult method in the calling activity
Intent resultIntent = new Intent();
resultIntent.putExtra("Position", position);
setResult(RESULT_OK, resultIntent);
}
}
}
细节布局activity:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:id="@+id/tv_detail_text"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
祝你好运,编码愉快!
另一种解决方案是在 activity class 中设置 onActivityResult 方法,您可以在其中启动 RecyclerView/ListView。这也有效,除了出于某种原因,当我尝试使用意图传递数据时出现 NPE 错误,因此解决方法是创建静态 String/Int 并更改它在点击和访问时的值。那很好用。
但是上面的答案也很好,而且在性能方面也一样好,甚至更好。
我不知道你为什么需要从适配器调用 onActivityResult() 方法 class。
无论如何,最好的解决方案是从 adpater class 启动 ActivityForResult() 并通过指定请求代码和结果代码
监听 onActivityResultFrom() activity class
我的 RecyclerView 包含非常复杂的项目,多个 buttons/images/texts。 为了访问每个 button/image,我在适配器 class.
中设置了点击监听器但是现在我正在尝试添加设置联系人铃声的功能,但我遇到了问题。
我这样调用 onActivityResult 方法:
Intent contactIntent = new Intent(Intent.ACTION_PICK);
contactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE);
contactIntent.putExtra("ITEM_POSITION", position);
((Activity) context).startActivityForResult(contactIntent, CONTACT_CHOOSER_ACTIVITY_CODE );
而且效果很好。 但问题是:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
....
...
...
}
}
我收到此错误:Cannot resolve method 'onActivityResult(int, int, android.content.Intent)'
有什么办法可以避免这种情况吗?或者是否可以在适配器 class 中使用此方法?如果不是我该怎么办?
您不能在任何适配器 class 中使用此方法,这只是 Activity
中的一个方法,每个 class extends Activity
都可以覆盖此方法,但是当然不是适配器。
请参阅java
中的Overrides关于 onActivityResult
,请参阅 Activity#onActivityResult(int, int, Intent)
对于 RecyclerView.Adapter
之类的东西,您需要在适配器中定义一个接口并在 Activity 中实现该接口。
例如,这里是一个应用程序的代码,它将所点击项目的字符串及其位置发送到显示它的新 Activity:
主要Activity:
public class MainActivity extends AppCompatActivity implements MyAdapter.CallbackInterface {
private static final int MY_REQUEST = 1001;
private static final String [] ITEMS = {"Item 1", "Item 2", "Item 3" ,"Item 4", "Item 5", "Item 6"};
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ... Adapter setup, simple LinearLayoutManager and String [] used
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rec_view);
myAdapter = new MyAdapter(this, ITEMS);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(myAdapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode){
case RESULT_OK:
// ... Check for some data from the intent
if(requestCode == MY_REQUEST){
// .. lets toast again
int position = -1;
if(data != null){
position = data.getIntExtra("Position", 0);
}
if(position != -1) {
Toast.makeText(this, "Handled the result successfully at position " + position, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "Failed to get data from intent" , Toast.LENGTH_SHORT).show();
}
}
break;
case RESULT_CANCELED:
// ... Handle this situation
break;
}
}
/**
* Interface Method which communicates to the Acitivty here from the {@link MyAdapter}
* @param position - the position
* @param text - the text to pass back
*/
@Override
public void onHandleSelection(int position, String text) {
Toast.makeText(this, "Selected item in list "+ position + " with text "+ text, Toast.LENGTH_SHORT).show();
// ... Start a new Activity here and pass the values
Intent secondActivity = new Intent(MainActivity.this, DetailActivity.class);
secondActivity.putExtra("Text",text);
secondActivity.putExtra("Position", position);
startActivityForResult(secondActivity, MY_REQUEST);
}
}
xml 主Activity:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.divshark.recyclerviewsimpledemo.MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rec_view" />
</RelativeLayout>
我的适配器:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder>{
private CallbackInterface mCallback;
private String [] mMyItems;
private Context mContext;
public interface CallbackInterface{
/**
* Callback invoked when clicked
* @param position - the position
* @param text - the text to pass back
*/
void onHandleSelection(int position, String text);
}
public MyAdapter(Context context, String [] myItems){
mContext = context;
mMyItems = myItems;
// .. Attach the interface
try{
mCallback = (CallbackInterface) context;
}catch(ClassCastException ex){
//.. should log the error or throw and exception
Log.e("MyAdapter","Must implement the CallbackInterface in the Activity", ex);
}
}
@Override
public int getItemCount() {
return mMyItems.length;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void onBindViewHolder(MyHolder holder, final int position) {
// Set the text for the View
holder.mTextView.setText(mMyItems[position]);
// Use your listener to pass back the data
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mCallback != null){
mCallback.onHandleSelection(position, mMyItems[position]);
}
}
});
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
return new MyHolder(view);
}
static class MyHolder extends RecyclerView.ViewHolder{
TextView mTextView;
public MyHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.tv_list_item);
}
}
}
适配器布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="?listPreferredItemHeight">
<TextView
android:id="@+id/tv_list_item"
android:textColor="@android:color/black"
tools:text="Some Text Holder"
android:layout_marginLeft="16dp"
android:textSize="18sp"
android:layout_centerVertical="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
和细节Activity:
public class DetailActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.detail_activity);
TextView textView = (TextView) findViewById(R.id.tv_detail_text);
if(getIntent() != null && getIntent().getExtras() != null) {
Bundle extras = getIntent().getExtras();
String text = extras.getString("Text");
int position = extras.getInt("Position");
textView.setText(String.format("%s at position %d", text, position));
// .. For this purpose set result okay and use position as part of data when Activity finishes
// Which will in turn invoke the onActivityResult method in the calling activity
Intent resultIntent = new Intent();
resultIntent.putExtra("Position", position);
setResult(RESULT_OK, resultIntent);
}
}
}
细节布局activity:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:id="@+id/tv_detail_text"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
祝你好运,编码愉快!
另一种解决方案是在 activity class 中设置 onActivityResult 方法,您可以在其中启动 RecyclerView/ListView。这也有效,除了出于某种原因,当我尝试使用意图传递数据时出现 NPE 错误,因此解决方法是创建静态 String/Int 并更改它在点击和访问时的值。那很好用。 但是上面的答案也很好,而且在性能方面也一样好,甚至更好。
我不知道你为什么需要从适配器调用 onActivityResult() 方法 class。
无论如何,最好的解决方案是从 adpater class 启动 ActivityForResult() 并通过指定请求代码和结果代码
监听 onActivityResultFrom() activity class