2013-12-11 2 views
0

"admin"에서 "guest"로 토글하는 TextView 단추 (btnChangeMode)가있는 활동이 있습니다. 선택한 모드에 따라 내 listview 행에서 버튼 (btnAddListItems)을 숨기거나 표시해야합니다. 내가 가진 코드는 현재 그것을 자르지 않는 것 같습니다.어댑터의 경우, 액티비티의 터치 리스너에서 listview의 행을 숨기는 방법

코드는 쉽게 말을, 그래서 여기 내 코드의 요점이다 :

내 활동 레이아웃 : 내 활동 공상

<FrameLayout> 
    <ListView> ... </ListView> <!-- which has its items populated from myCustomAdapter --> 
    <TextView> ... </TextView> <!-- this is my btnChangeMode --> 
<FrameLayout> 

아무것도 :

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_activity); 

    List listItems = ... // some method that gets objects from Database 
    ListView listView = (ListView) findViewById(R.id.list_view_id); 
    listView.setAdapter(new MyCustomAdapter(this, listItems)); 
} 

나는 사용자 정의 어댑터가 그 기본적으로 두 가지 유형의 행 헤더 & 항목이 있습니다. "헤더"행에는 목록보기에 항목을 추가 할 수있는 "btnAddListItems"버튼이 있습니다. 이 버튼을 관리자 모드에서만 볼 수 있습니다.

myCustomAdapter (getviewTypeCount, getItemViewType, getCount 및 getView)에서 필요한 메소드를 재정의했습니다.

@Override 
public View getView(int position, View row, ViewGroup parent) { 

    if (row == null) { 
     if (getItemViewType(position) == ITEM_VIEW_TYPE_HEADER) { 
      return getHeaderRow(); 
     } else { 
      return getItemRow(); 
     } 
    } 

    if (getItemViewType(position) == ITEM_VIEW_TYPE_ROW) { 
     MyHolder holder = (MyHolder) row.getTag(); 
     holder.populateNewContent(); 
    } 

    return row; 
} 

.... 

private View getHeaderRow() { 
    View lRow = LayoutInflater.from(getContext()).inflate(R.layout.my_header, null); 

    mViewMode = new DetailsViewMode((Activity) getContext(), getChangeViewModeListener(lRow)); 
    return lRow; 
} 

그래서 mViewMode 여기에 내가 그 btnChangeMode, 전류 모드 (isAdmin)와 발신자 활동을 나타내는 부울 변수를 포함 쓴 편의 POJO 클래스는 다음과 같습니다 여기의 getView 방법입니다. 나는 내 문제에 특정한 것이 있다고 생각하지 않는다. 그래서 나는 그 코드를 여기에 포함시키지 않을 것이다. 누군가가 도움이된다고 생각한다면 기꺼이 좋을 것입니다.

private ChangeViewModeFragment.ChangeViewModeListener getChangeViewModeListener(final View headerRow) { 
    return new ChangeViewModeFragment.ChangeViewModeListener() { 
     @Override 
     public void onViewModeChanged(boolean isViewModeAdmin) { 
      mViewMode.changeViewModeButtonText(isViewModeAdmin); 
      toggleAdminFeatures(isViewModeAdmin, headerRow); 
     } 
    }; 
} 

private void toggleAdminFeatures(boolean isViewModeAdmin, View headerRow) { 
    TextView btnAddListItems = (TextView) headerRow.findViewById(R.id.add_button_id); 

    if (isViewModeAdmin) { 
     btnAddListItems.setVisibility(View.VISIBLE); 
    } else { 
     btnAddListItems.setVisibility(View.GONE); 
    } 
} 

이것은 제대로 작동하지 않는 부분입니다. btnAddListItems는 항상 내 listview 내에서 볼 수 있습니다.

btnAddListItems은 내 어댑터 (ListView) 내에 있지만 btnChangeMode는 내 활동 범위 내에 있습니다. 하지만 내 요구 사항은 활동의 listner를 갖는이 동작을 필요로하고 내 listview의 행 상태를 변경합니다.

필자는 내 머리말 행의 버튼의 가시성을 바꿀 때 올바른 머리말 행 인스턴스를 갖고 있지 않다고 생각합니다. P.

NitroNbg가 제안한 비공개 버튼이 작동하지 않아 ListView에서 킥 스타트가 필요하다고 생각됩니다.

하지만 toggleAdminFeatures 메서드의 끝에서 notifyDataSetChanged()를 호출 해 보았지만 트릭을 수행하지 않는 것 같습니다.

당신은 notifyDataSetChanged() 할 필요가 없습니다
+0

내 POJO에서 부울 유형 메서드 isUserAdmin을 추가 할 것입니다.이 메서드는 true 또는 false를 button에 따라 activity.Then의 getView에서 확인할 것입니다. 사용자가 admin 인 경우 버튼 표시 여부를 보이지 않게 설정합니다. 내가 당신을 맞히는 경우 :/ – DroidDev

+0

기본적으로 ChangeListener에서 발생합니다. onViewModeChanged 메서드가 호출되면 (디버깅을 통해이를 확인했습니다.) POJO (mViewMode)가 확인한 다음 mode.It에 따라 텍스트를 설정 한 다음 toggleAdminFeatures 메서드를 호출합니다. 그것의 목적). 이 모든 getView 메서드에서 발생하는 내 headerView 반환 할 때 발생합니다. 제쳐두고, getView 가져 오지 않는 경우에만 스크롤/변경 또는 행을 재활용 얻을? 내 viewMode 버튼은 액티비티의 일부이므로 getView를 호출하지 않습니다. 희망을 나는 이해하고있다. –

+1

'mViewMode'가 선언 된 곳은 어디입니까? 어댑터가 "헤더보기"를 새로 고칠 때마다이 헤더를 덮어 쓰는 것이 좋습니다. Btw. ListView에는 addHeaderView 메서드가있어 더 쉬운 방법을 원한다. :) –

답변

0

는, 사촌 데이터 세트가 변경되지 , 나는 다음을 시도 것 INVISIBLE

+0

흠 나는 그것을 시도했지만 도움이되지 않습니다. 나는이 문제가 보이지 않는다고 생각하지 않는다. 어떤 이유로 든 리스너를 통해 호출되는 btnAddListItems가 원래 것과 같지 않다고 생각합니다. 그것이 의미가있는 경우 : S –

1

에 가시성을 설정하려고 - 어댑터 클래스 내에서 당신의 getView 내에서 개인 Button을 만드는() 메서드는 btnAddListItems에 대한 참조를 넣습니다. 당신의 ChangeViewModeListener() 단순히 어댑터 클래스의 방법을 참조 내부는 것은 어댑터 내에서 이후

private Button buttonToHide; 
//... 
public View getView(...) { 
    //... 
    buttonToHide = (Button) row.findViewById(R.id.add_button_id); 
    //... 
} 

다음, 바라건대 buttonToHide.setVisibility(View.INVISIBLE)

을 설정하는 (물론 당신은 그것을 작성해야) 얻기 쉬운.

편집 : 명백하지 않은 경우를 지적하십시오. - 은 헤더 행의 버튼만을 참조하십시오.

+0

아. 나는 그것을 시도했다. 그러나 그것은 효과가있는 것 같지 않습니다 : (즉, 올바른 버튼을 잡고 있지만, 어떤 이유로 뷰가 새로 고쳐지지 않습니다.) –

+0

원인이 뭔지 모르겠다. – NitroNbg

관련 문제