2016-09-10 6 views
0

여러 피드 항목으로 Newsfeed 유형 레이아웃을 구현하려고합니다. 뉴스 피드 항목은 접힐 때 특정 레이아웃을 가지며이 레이아웃은 항목을 클릭 할 때 '폭발'버전으로 대체됩니다.android - 프로그래밍 방식으로 레이아웃을 바꾸고 ViewStub를 사용합니다.

사용자 지정 항목의 ListView를 사용하여이 작업을 수행했습니다. 사용자 정의 항목 XML 레이아웃 파일에는 레이아웃을 앞뒤로 변경하는 데 사용한 ViewStub가 있습니다. 이제 레이아웃을 RecyclerView로 '이전'하고 ViewHolder 디자인 패턴을 따르기를 원했습니다. 후자는 내가 먼저 시도한 것이며 모든 종류의 문제를 겪고 있습니다.

다음과 같이 내 접근 방식이있다 : 축소 된 레이아웃 (events_list_item_content) 확장 된 레이아웃 (events_list_item_selected_content)에

  1. 가져 오기 참조;

  2. ViewStub 레이아웃 (view_stub_layout)으로 설정할 간단한 레이아웃 리소스 파일에 대한 참조를 가져옵니다.

  3. ViewStub 참조를 가져 와서 레이아웃 (view_stub_layout) inflate를 설정하고 접힌 레이아웃보기를이 레이아웃에 추가합니다. 처음 피드를 만들 때 모든 항목이 축소됩니다.

  4. (항목을 클릭 한 후 초기화) ViewStubLayout에서 이전 뷰 (레이아웃)를 제거하고 다른 유형의 레이아웃을 추가하십시오. 테스트 할 때

    public class FeedRecyclerAdapter extends BaseAdapter { 
    
    
    public class ViewHolder { 
        View inflatedViewStub1; 
        ViewStub viewStub; 
        LinearLayout viewStubLayout; 
        LinearLayout listItemContent, listItemContentSelected; 
    } 
    
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        if (inflater == null) 
         inflater = (LayoutInflater) activity 
           .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    
        final FeedItem item = feedItems.get(position); 
        final ViewHolder viewHolder; 
        if (convertView == null) { 
         viewHolder = new ViewHolder(); 
         convertView = inflater.inflate(R.layout.events_list_item_content_new_container, parent, false); 
         View view = null; 
    
         view = inflater.inflate(R.layout.events_list_item_content, null); 
         viewHolder.listItemContent = (LinearLayout) view.findViewById(R.id.events_list_item_content); 
    
         view = inflater.inflate(R.layout.events_list_item_selected_content, null); 
         viewHolder.listItemContentSelected = (LinearLayout) view.findViewById(R.id.events_list_item_content_selected); 
    
         view = inflater.inflate(R.layout.view_stub_layout, null); 
         viewHolder.viewStubLayout = (LinearLayout) view.findViewById(R.id.view_stub_layout); 
    
         viewHolder.viewStub = (ViewStub) convertView.findViewById(R.id.list_item_feed);   
    
    (viewHolder.viewStubLayout).addView(viewHolder.listItemContent); 
         viewHolder.viewStub.setLayoutResource(R.layout.view_stub_layout); 
         viewHolder.inflatedViewStub1 = viewHolder.viewStub.inflate(); 
         convertView.setTag(viewHolder); 
    
        } else viewHolder = (ViewHolder) convertView.getTag(); 
        if (item.getExploded()) { 
         viewHolder.viewStubLayout.removeAllViews(); 
         viewHolder.viewStubLayout.addView(viewHolder.listItemContentSelected); 
        } else { 
         viewHolder.viewStubLayout.removeAllViews(); 
         viewHolder.viewStubLayout.addView(viewHolder.listItemContent); 
        } 
        return convertView; 
        } 
    

    그러나, 뉴스 피드를 표시하도록되어 페이지가 비어 있습니다 :

여기 내 사용자 정의 어댑터 클래스입니다.

나는이 대답에 이미 해당 게시물을 ... 본 적이

답변

0
ViewStub stub = (ViewStub) findViewById(R.id.layout_stub); 
LinearLayout ll = (LinearLayout) findViewById(R.id.ll); 
stub.setLayoutResource(layoutId); 
stub.inflate(); // inflate 1st layout 

ll.removeAllViews(); // remove previous view, add 2nd layout 
ll.addView(LayoutInflater.from(context).inflate(secondLayoutId, ll, false)); 

Android ViewStub change layouts programatically

+0

, 때 이제까지 ViewStub의 레이아웃 리소스로 설정로드 할 레이아웃은 무엇입니까? LinearLayout은 ViewStub의 레이아웃 리소스로 설정됩니까? layoutId 및 secondLayoutId 란 무엇입니까? – Lostinjava