android - 在活动中是正确的,从自定义侦听器获取位置
android - in actvity is correct get position from custom listener
在我的应用程序中,我有一个带有自定义侦听器的列表视图。
我想在 activity 中使用 onSaveInstanceState 和 onRestoreInstanceState,但我需要的唯一信息是 class CustomListener 中的方法 OnItemClick。
我需要参数 "position" 的值,它是 4 个 onItemClick 参数之一,因为只有这样才能知道在列表的哪个位置单击了项目。在 onSaveInstanceState 和 onRestoreInstanceState 这两个方法中,我需要知道如何正确恢复 activity 的状态。
我的问题有两个:
1 - 是正确的(最佳实践)在 CustomListener 中创建方法 get 和 set 并在 Activity 中使用它们,onSaveInstanceState 和 onRestoreInstanceState 这两个方法在哪里(我认为这不是正确的方法,但我不没有其他想法)
2 - 一旦我有了参数位置,我就无法在 CustomListener 的方法 OnItemClick 中设置此参数,因为如果我处于纵向模式并且我传递到横向模式,系统不会调用 OnItemClick 等方法中的参数不会修改,横向布局也不会修改。
这个方法在 MainActivity:
private void populate(ListView lv){
ImageAdapter arrayAdapter;
//set list view
arrayAdapter = new ImageAdapter(this, R.layout.list_view_layout, arrayFromNumberToId, hmFromIdToName);
lv.setAdapter(arrayAdapter);
//set list listener
listener=new CustomListener(hm, hmFromIdToName, arrayFromNumberToId);
lv.setOnItemClickListener(listener);
}
此方法在class CustomListener:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int imageID;
String description;
String name;
imageID = arrayFromNumberToId[position];
description = hm.get(imageID);
name = hmIdToName.get(arrayFromNumberToId[position]);
extras = new Bundle();
extras.putInt("imageID", imageID);
extras.putCharSequence("description", description);
extras.putCharSequence("name", name);
if(parent.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Intent intent = new Intent(parent.getContext(), DescriptionActivity.class);
intent.putExtras(extras);
parent.getContext().startActivity(intent);
}
else{
ImageView imageViewLayout;
TextView textView;
textView = (TextView) parent.getRootView().findViewById(R.id.textDescription);
textView.setText(description);
imageViewLayout = (ImageView) parent.getRootView().findViewById(R.id.imageBig);
imageViewLayout.setImageResource(imageID);
textView = (TextView) parent.getRootView().findViewById(R.id.textName);
textView.setText(name);
textView.setTypeface(null, Typeface.BOLD);
}
}
感谢您的回答!!!
为了回答你的第一个问题,我的建议是将位置存储为 activity 的成员变量并将其添加到已保存的实例状态中,如下所示:
class MyActivity extends Activity {
private int mSelectedItemPosition;
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(POSITION, mSelectedItemposition);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.getInt(POSITION);
}
...
}
然后,只要您的 CustomListener class 嵌套在您的 activity class 中,只需在 onItemClick 方法中设置 mSelectedItemPosition 变量即可:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSelectedItemPosition = position;
...
}
我可能误解了你的第二个问题,但是没有必要在 onItemClick 方法中设置位置值,因为点击的项目的位置作为该方法的参数传递给你。
非常感谢@Jason 的回答!!!
在你的建议之前,我并没有考虑内部 class,但这是一个很好的解决方案。
2°的问题,我已经解决了,但如果其他人有同样的问题,我会尽量解释得更好。
第二个问题是你回答后的部分:
如果我的代码中的布局仅在 onItemClick 内部发生变化,我如何在 onRestoreInstanceState 中恢复 mSelectedItemPosition,我不调用该方法,但仅由系统调用?
像 inner class 一样使用 CustomListener 之后,我在 MyActivity checkOrientation 中创建了一个方法,我将它用于代码的两个点,onItemClick 内部和 onRestoreInstanceState 内部。
这两个方法在MyActivity中:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("POSITION", myPosition);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
myPosition = savedInstanceState.getInt("POSITION");
checkOrientation(myPosition, null);
}
这个方法也在 MyActivity 中,当 parent 为 null 时,onRestoreInstanceState 在 activity 中调用,所以我更改了我的代码,因为在一种情况下我有来自 onItemClick 的父级,在其他情况下我是在 activity 里面,所以我有我需要的所有方法:
private void checkOrientation(Integer position, AdapterView<?> parent){
int imageID;
String description;
String name;
Bundle extras;
imageID = arrayFromNumberToId[position];
description = hm.get(imageID);
namePokemon = hmFromIdToName.get(arrayFromNumberToId[position]);
extras = new Bundle();
extras.putInt("imageID", imageID);
extras.putCharSequence("description", description);
extras.putCharSequence("name", name);
if(parent != null) {
if (parent.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Intent intent = new Intent(parent.getContext(), DescriptionActivity.class);
intent.putExtras(extras);
parent.getContext().startActivity(intent);
} else {
ImageView imageViewLayout;
TextView textView;
textView = (TextView) parent.getRootView().findViewById(R.id.textDescription);
textView.setText(description);
imageViewLayout = (ImageView) parent.getRootView().findViewById(R.id.imageBig);
imageViewLayout.setImageResource(imageID);
textView = (TextView) parent.getRootView().findViewById(R.id.textName);
textView.setText(name);
textView.setTypeface(null, Typeface.BOLD);
}
}
else{
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Intent intent = new Intent(this, DescriptionActivity.class);
intent.putExtras(extras);
this.startActivity(intent);
} else {
ImageView imageViewLayout;
TextView textView;
textView = (TextView) findViewById(R.id.textDescription);
textView.setText(description);
imageViewLayout = (ImageView) findViewById(R.id.imageBig);
imageViewLayout.setImageResource(imageID);
textView = (TextView) findViewById(R.id.textName);
textView.setText(name);
textView.setTypeface(null, Typeface.BOLD);
}
}
}
此方法在 CustomListener 中:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
myPosition = position;
checkOrientation(position, parent);
}
在我的应用程序中,我有一个带有自定义侦听器的列表视图。
我想在 activity 中使用 onSaveInstanceState 和 onRestoreInstanceState,但我需要的唯一信息是 class CustomListener 中的方法 OnItemClick。
我需要参数 "position" 的值,它是 4 个 onItemClick 参数之一,因为只有这样才能知道在列表的哪个位置单击了项目。在 onSaveInstanceState 和 onRestoreInstanceState 这两个方法中,我需要知道如何正确恢复 activity 的状态。
我的问题有两个: 1 - 是正确的(最佳实践)在 CustomListener 中创建方法 get 和 set 并在 Activity 中使用它们,onSaveInstanceState 和 onRestoreInstanceState 这两个方法在哪里(我认为这不是正确的方法,但我不没有其他想法) 2 - 一旦我有了参数位置,我就无法在 CustomListener 的方法 OnItemClick 中设置此参数,因为如果我处于纵向模式并且我传递到横向模式,系统不会调用 OnItemClick 等方法中的参数不会修改,横向布局也不会修改。
这个方法在 MainActivity:
private void populate(ListView lv){
ImageAdapter arrayAdapter;
//set list view
arrayAdapter = new ImageAdapter(this, R.layout.list_view_layout, arrayFromNumberToId, hmFromIdToName);
lv.setAdapter(arrayAdapter);
//set list listener
listener=new CustomListener(hm, hmFromIdToName, arrayFromNumberToId);
lv.setOnItemClickListener(listener);
}
此方法在class CustomListener:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int imageID;
String description;
String name;
imageID = arrayFromNumberToId[position];
description = hm.get(imageID);
name = hmIdToName.get(arrayFromNumberToId[position]);
extras = new Bundle();
extras.putInt("imageID", imageID);
extras.putCharSequence("description", description);
extras.putCharSequence("name", name);
if(parent.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Intent intent = new Intent(parent.getContext(), DescriptionActivity.class);
intent.putExtras(extras);
parent.getContext().startActivity(intent);
}
else{
ImageView imageViewLayout;
TextView textView;
textView = (TextView) parent.getRootView().findViewById(R.id.textDescription);
textView.setText(description);
imageViewLayout = (ImageView) parent.getRootView().findViewById(R.id.imageBig);
imageViewLayout.setImageResource(imageID);
textView = (TextView) parent.getRootView().findViewById(R.id.textName);
textView.setText(name);
textView.setTypeface(null, Typeface.BOLD);
}
}
感谢您的回答!!!
为了回答你的第一个问题,我的建议是将位置存储为 activity 的成员变量并将其添加到已保存的实例状态中,如下所示:
class MyActivity extends Activity {
private int mSelectedItemPosition;
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(POSITION, mSelectedItemposition);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.getInt(POSITION);
}
...
}
然后,只要您的 CustomListener class 嵌套在您的 activity class 中,只需在 onItemClick 方法中设置 mSelectedItemPosition 变量即可:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSelectedItemPosition = position;
...
}
我可能误解了你的第二个问题,但是没有必要在 onItemClick 方法中设置位置值,因为点击的项目的位置作为该方法的参数传递给你。
非常感谢@Jason 的回答!!!
在你的建议之前,我并没有考虑内部 class,但这是一个很好的解决方案。
2°的问题,我已经解决了,但如果其他人有同样的问题,我会尽量解释得更好。
第二个问题是你回答后的部分: 如果我的代码中的布局仅在 onItemClick 内部发生变化,我如何在 onRestoreInstanceState 中恢复 mSelectedItemPosition,我不调用该方法,但仅由系统调用?
像 inner class 一样使用 CustomListener 之后,我在 MyActivity checkOrientation 中创建了一个方法,我将它用于代码的两个点,onItemClick 内部和 onRestoreInstanceState 内部。
这两个方法在MyActivity中:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("POSITION", myPosition);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
myPosition = savedInstanceState.getInt("POSITION");
checkOrientation(myPosition, null);
}
这个方法也在 MyActivity 中,当 parent 为 null 时,onRestoreInstanceState 在 activity 中调用,所以我更改了我的代码,因为在一种情况下我有来自 onItemClick 的父级,在其他情况下我是在 activity 里面,所以我有我需要的所有方法:
private void checkOrientation(Integer position, AdapterView<?> parent){
int imageID;
String description;
String name;
Bundle extras;
imageID = arrayFromNumberToId[position];
description = hm.get(imageID);
namePokemon = hmFromIdToName.get(arrayFromNumberToId[position]);
extras = new Bundle();
extras.putInt("imageID", imageID);
extras.putCharSequence("description", description);
extras.putCharSequence("name", name);
if(parent != null) {
if (parent.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Intent intent = new Intent(parent.getContext(), DescriptionActivity.class);
intent.putExtras(extras);
parent.getContext().startActivity(intent);
} else {
ImageView imageViewLayout;
TextView textView;
textView = (TextView) parent.getRootView().findViewById(R.id.textDescription);
textView.setText(description);
imageViewLayout = (ImageView) parent.getRootView().findViewById(R.id.imageBig);
imageViewLayout.setImageResource(imageID);
textView = (TextView) parent.getRootView().findViewById(R.id.textName);
textView.setText(name);
textView.setTypeface(null, Typeface.BOLD);
}
}
else{
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Intent intent = new Intent(this, DescriptionActivity.class);
intent.putExtras(extras);
this.startActivity(intent);
} else {
ImageView imageViewLayout;
TextView textView;
textView = (TextView) findViewById(R.id.textDescription);
textView.setText(description);
imageViewLayout = (ImageView) findViewById(R.id.imageBig);
imageViewLayout.setImageResource(imageID);
textView = (TextView) findViewById(R.id.textName);
textView.setText(name);
textView.setTypeface(null, Typeface.BOLD);
}
}
}
此方法在 CustomListener 中:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
myPosition = position;
checkOrientation(position, parent);
}