2016-12-24 1 views
1

작은 문제가 있습니다. RecyclerView에 여러 레이아웃을 표시하려고합니다. 나는 이것을 두 가지 다른 방식으로 관리했다. 하지만 내 코드와 논리가 훨씬 좋아 보일 수 있다고 생각합니다.어댑터에 여러 레이아웃이 있습니다.

내 프로젝트 자체가 MVVM 디자인 패턴을 따르고 있습니다. 그래서 네이티브 데이터 바인딩을 사용하고 있습니다. 이것이 나의 논리가 문제가되는 이유입니다. 그것은

에게 내가이 일을하려고 첫 번째 방법을하는

첫 번째 방법은 단지 하나의 큰 레이아웃 파일에 모든 것을 쥐하는 것입니다. 그런 다음 어떤 유형의 게시물인지에 따라 숨기고 표시하십시오.

private void onBindImagePost(CommentFeedViewHolder holder, CommentFeedItem item) { 
    holder.mBinding.adapterCommentFeedDraweeView.setVisibility(View.VISIBLE); 
    holder.mBinding.adapterCommentFeedTopic.setVisibility(View.VISIBLE); 
    holder.mBinding.adapterCommentFeedYoutubeContainer.setVisibility(View.GONE); 
    holder.mBinding.adapterCommentFeedVideoContainer.setVisibility(View.GONE); 
    holder.mBinding.adapterCommentFeedPieChartContainer.setVisibility(View.GONE); 
    holder.mBinding.adapterCommentFeedDraweeView.setImageURI(item.getUri()); 
    } 

그래서 먼저 난 그냥 보여 사용하고 있지 않은 전망을 숨 깁니다. 나는 또한 몇몇 견해에 여분의 논리를 덧붙였다.

이 솔루션은 많은 하드 코딩이 포함되어 있고 비즈니스 로직이 조각에 추가되어 매우 안 좋았습니다. 그 일의

두 번째 방법은

나는 각 게시물에 대한 새로운 레이아웃 파일을 추가했습니다. 그들은 모두 자신의 구속력이 있습니다. 코드를 최소화했습니다.

if (item.getType() == POST_TEXT) { 
     AdapterFeedType1Binding binding = DataBindingUtil.inflate(inflater,R.layout.adapter_feed_type_1,holder.binding.mainFrame,true); 
     binding.setGameFeedItem(item); 
    } 

그러나 더 나은 방법은 무엇입니까? 그래서 모든 게시물 유형에 대해 새로운 바인딩 클래스를 만들어야하지 않습니까?

답변

2

두 번째 옵션이 더 좋습니다. 이 시스템

private static final int[] LAYOUT_IDS = { 
    R.layout.adapter_feed_type_1, 
    R.layout.adapter_feed_type_2, 
    ...}; 


public MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { 
    int layoutId = LAYOUT_IDS[viewType]; 
    ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId, 
     parent, false); 
    MyViewHolder viewHolder = new MyViewHolder(binding); 
    return viewHolder; 
} 

public void onBindViewHolder (MyViewHolder holder, int position) { 
    Item item = getItemAtPosition(position); // your method 
    holder.binding.setVariable(BR.gameFeedItem, item); 
    holder.binding.executePendingBindings(); 
} 

을만큼 모든 변수 (이 경우 gameFeedItem) 같은 이름대로 :이 여전히 다수의 생성 바인딩 클래스 될 것입니다,하지만 당신은 이런 식으로 할 경우 단일 인터페이스를 통해 액세스 할 수 있습니다 작동합니다. 나는 MyViewHolder이라는 이름의 ViewHolder을 Binding as a public final 필드로 가정했습니다.

+1

ViewDataBinding은 찾고자하지만 찾지 못한 곳입니다. 고마워. 덕분에 깨끗한 솔루션을 만들 수있었습니다. –

관련 문제