android-在活动中是正确的从自定义监听器获取位置
在我的应用程序中,我有一个自定义监听器的列表视图。android-在活动中是正确的从自定义监听器获取位置
我想在我的活动中使用onSaveInstanceState和onRestoreInstanceState,但我需要的唯一信息是在我的类CustomListener中的方法OnItemClick。
我需要4个onItemClick参数之一的参数“position”的值,因为是唯一能够知道列表中的哪个位置被点击的项目。在onSaveInstanceState和onRestoreInstanceState两个方法中,我需要知道正确恢复活动的状态。
我的问题有两个: 1 - 是正确的(是最佳实践)创建方法获取和在CustomListener设置和活动,其中有两种方法的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);
}
这种方法是在类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);
}
}
谢谢您的回答!
要回答你的第一个问题,我的建议是将位置保存为活动的成员变量并将其添加到已保存的实例的状态,就像这样:
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类嵌套在您的活动类,只需设置mSelectedItemPosition变量onItemClick方法中:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSelectedItemPosition = position;
...
}
我可能会误解你的第二个问题,但也没有必要设置onItemClick方法内的位置值,b因为被点击的物品的位置作为该方法的参数传递给您。
非常感谢@Jason的回答!
在你的建议之前,我没有考虑内部课堂,但是一个很好的解决方案。
对于2°的问题,我已经解决了,但我试图解释更好,如果其他会有同样的问题。
第二个问题是你的答案之后的部分: 如何在onRestoreInstanceState中恢复mSelectedItemPosition如果我的代码中的布局仅在onItemClick内部更改,我不调用但仅由系统调用的方法?
在使用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,当父母为null,则通过onRestoreInstanceState称为活动里面,所以我改变了我的代码,因为在一种情况下,我有父母从onItemClick,在其他情况下,我的活动里面,所以我有我需要的所有方法:
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);
}
非常感谢@Jason的回答! – soissy