2017-04-11 48 views
0

在我的應用程序中,我有一個自定義監聽器的列表視圖。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); 
    } 
} 

謝謝您的回答!

回答

0

要回答你的第一個問題,我的建議是將位置保存爲活動的成員變量並將其添加到已保存的實例的狀態,就像這樣:

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因爲被點擊的物品的位置作爲該方法的參數傳遞給您。

+0

非常感謝@Jason的回答! – soissy

0

非常感謝@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); 
    }