2017-04-11 1 views
0

내 응용 프로그램에서 사용자 정의 수신기를 사용하여 listview가 있습니다.android - actvity가 올바른 사용자 위치 수신기에서 위치 얻으십시오

내 활동에서 onSaveInstanceState 및 onRestoreInstanceState를 사용하고 싶습니다. 그러나 필요한 정보는 내 클래스 CustomListener 내의 OnItemClick 메서드에만 있습니다.

클릭 한 항목의 위치가 어디인지를 알 수있는 유일한 방법이기 때문에 매개 변수 "position"(onItemClick 매개 변수 중 하나)이 필요합니다. 그리고 두 mthods onSaveInstanceState 및 onRestoreInstanceState에서 나는 활동의 상태를 올바르게 복원해야한다는 것을 알아야합니다. (I 옳은 방법이 아니다 생각하는 방법을 얻을 CustomListener에 설정하고 두 가지 방법이 onSaveInstanceState와 onRestoreInstanceState있는 활동에 사용할 생성 (가장 좋은 방법은) 올 - 1 :

내 질문이 있습니다 이,하지만 난 다른 아이디어가 없어) - 일단 내가 매개 변수 위치를 가지고, 나는 세로 모드에 있고 가로 모드, 시스템 전달하기 때문에 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 같이

답변

0

첫 번째 질문에 대답하려면, 내 추천이 같은 활동의 멤버 변수로 위치를 저장하고 저장된 인스턴스 상태에 추가하는 것입니다

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    mSelectedItemPosition = position; 
    ... 
} 

내가 두 번째 질문을 오해 할 수 있지만 onItemClick 방법 내부의 위치 값을 설정할 필요가 없다, B : 클래스가 활동 클래스에서 중첩되어, 단순히 onItemClick 방법 내부 mSelectedItemPosition 변수를 설정 클릭 한 항목의 위치가 해당 메소드의 인수로 전달됩니다.

+0

답변을 주셔서 대단히 @ 제이슨! – soissy

0

답변 해 주셔서 대단히 감사합니다. @ 제이슨!

조언을 받기 전에는 내부 클래스에 대해 생각하지 않았지만 좋은 해결책입니다.

2도 질문에 대해서는 해결했지만, 다른 문제가 있다면 더 잘 설명하려고합니다.

두 번째 질문은 대답 뒤에 나오는 부분입니다. 내 코드의 레이아웃이 onItemClick 내에서 변경되는 경우 어떻게해야합니까? mSelectedItemPosition은 호출하지 않고 시스템에 의해서만 호출됩니다.

내부 클래스와 같은 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); 
} 

부모가 활동 안에 onRestoreInstanceState에 의해 호출 null의 경우이 방법은, MyActivity도하고, 하나의 경우에 내가 부모가 있기 때문에 그래서 난 내 코드를 변경 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 내부 :

,297,