"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()
할 필요가 없습니다
내 POJO에서 부울 유형 메서드 isUserAdmin을 추가 할 것입니다.이 메서드는 true 또는 false를 button에 따라 activity.Then의 getView에서 확인할 것입니다. 사용자가 admin 인 경우 버튼 표시 여부를 보이지 않게 설정합니다. 내가 당신을 맞히는 경우 :/ – DroidDev
기본적으로 ChangeListener에서 발생합니다. onViewModeChanged 메서드가 호출되면 (디버깅을 통해이를 확인했습니다.) POJO (mViewMode)가 확인한 다음 mode.It에 따라 텍스트를 설정 한 다음 toggleAdminFeatures 메서드를 호출합니다. 그것의 목적). 이 모든 getView 메서드에서 발생하는 내 headerView 반환 할 때 발생합니다. 제쳐두고, getView 가져 오지 않는 경우에만 스크롤/변경 또는 행을 재활용 얻을? 내 viewMode 버튼은 액티비티의 일부이므로 getView를 호출하지 않습니다. 희망을 나는 이해하고있다. –
'mViewMode'가 선언 된 곳은 어디입니까? 어댑터가 "헤더보기"를 새로 고칠 때마다이 헤더를 덮어 쓰는 것이 좋습니다. Btw. ListView에는 addHeaderView 메서드가있어 더 쉬운 방법을 원한다. :) –