2017-01-18 10 views
0


私はRecyclerViewを複数のビュータイプで作成しています。
RecyclerViewデータセット(mResults)には、TYPE_WEBという複数の項目があります。
このタイプの各アイテムは特定のビューheightを持っています。
私の問題は次のとおりです。私は膨らませると私が膨張ビューにLayoutParamsを適用することができる場所、私が膨張itemViewHolderの位置を取得するように見えることはできませんviewHolderどのような種類のアダプタを伝える方法OnCreateViewHolder()、で
。データセット内の指定されたインデックスにあるオブジェクトから関連する高さを取得するには、アイテムの位置が必要です。
私が説明したことがはっきりしない場合、私は簡単な例を挙げます:
私のデータセットにはTYPE_WEBという3つの項目がインデックス2,4,7にあります。
それぞれに固有の高さがあります。
アイテムがTYPE_WEBの場合、関連するインデックスのオブジェクトをデータセットから取得し、その高さを取得してLayoutParamsに適用することをアダプタに伝える必要があります。RecyclerViewアイテムの位置を取得してLayoutParamsを動的に設定する

マイコード:

int position = holder.getAdapterPosition(); /** on app startup when the recyclerview is being created for the first time, this method always returns NO_POSITION (-1). */ 

int position = holder.getLayoutPosition(); /** same result as getAdapterPosition*/ 

ありがとうございました。私は動作しませんでした試みた

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

public static final int TYPE_ARTICLE = 1; 
public static final int TYPE_WEB = 2; 

private Context mContext; 
private MyFragmentManager mListener; 
private ArrayList<ItemObjectResult> mResults; 
private GeneralUtils mGeneralUtils; 

//------------------------------------ Constructor --------------------------------------------- 

public RecyclerViewAdapter(Context mContext, ArrayList<ItemObjectResult> mArticles) { 
    this.mContext = mContext; 
    this.mResults = mArticles; 
    this.mListener = (MyFragmentManager) mContext; 
    this.mGeneralUtils = new GeneralUtils(mContext); 
} 

//------------------------------------ Listeners methods --------------------------------------- 

@Override //RecyclerView.Adapter<RecyclerView.ViewHolder> 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View convertView; 

    switch (viewType) { 

     case TYPE_ARTICLE: 
      convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_feed_article, parent, false); 
      RecyclerView.LayoutParams articleLp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mGeneralUtils.dpToPx(280)); 
      convertView.setLayoutParams(articleLp); 
      return new ArticleViewHolder(convertView); 


     case TYPE_WEB: 
      convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_feed_web, parent, false); 

      /** Get the height of this TYPE_WEB item , int viewHeight = mResults.get(itemPosition).getHeight(); 
       Create new LayoutParams with the height we got from the item 
       Apply the height of this specific web item to it's view */ 

      RecyclerView.LayoutParams webLp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
      convertView.setLayoutParams(webLp); 
      return new WebViewHolder(convertView); 

    } 
    return null; 
} 

@Override //RecyclerView.Adapter<RecyclerView.ViewHolder> 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

    switch (holder.getItemViewType()) { 
     case TYPE_ARTICLE: 
      ArticleViewHolder articleViewHolder = (ArticleViewHolder) holder; 
      configureArticleVH(articleViewHolder, position); 
      break; 

     case TYPE_WEB: 
      final WebViewHolder webViewHolder = (WebViewHolder) holder; 
      configureWebVH(webViewHolder, position); 
      break; 
    } 

} 

@Override //RecyclerView.Adapter<RecyclerView.ViewHolder> 
public int getItemViewType(int position) { 

    ItemObjectResult article = mResults.get(position); 

    if (article.getItemType().equals("ARTICLE")) 
     return TYPE_ARTICLE; 
    else if (article.getItemType().equals("web")) 
     return TYPE_WEB; 

    return -1; 
} 

@Override //RecyclerView.Adapter<RecyclerView.ViewHolder> 
public int getItemCount() { 
    return (null != mResults ? mResults.size() : 0); 
} 

//------------------------------------ Helper methods ------------------------------------------ 

private void configureArticleVH(ArticleViewHolder holder, int position){ 
    ItemObjectResult item = mResults.get(position); 

    holder.url.setText(item.getWapLink()); 
    Picasso.with(mContext).load(item.getImage()).into(holder.mainImage); 
    holder.title.setText(item.getTitle()); 
    holder.subtitle.setText(item.getSubtitle()); 
    holder.time.setText(item.getPubDate()); 

} 

private void configureWebVH(final WebViewHolder holder, int position){ 

    final ItemObjectResult item = mResults.get(position); 

    holder.circularProgressBar.setIndeterminateDrawable(new CircularProgressDrawable 
      .Builder(mContext) 
      .sweepSpeed(1f) 
      .style(CircularProgressDrawable.STYLE_ROUNDED) 
      .build()); 

    WebSettings websettings = holder.webView.getSettings(); 
    websettings.setJavaScriptEnabled(true); 
    holder.webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(item.getWvUrl()); 
      return false; 
     } 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      holder.circularProgressBarContainer.setVisibility(View.GONE); 
     } 
    }); 
    holder.webView.loadUrl(item.getWvUrl()); 
} 

//------------------------------------ ViewHolder methods -------------------------------------- 

class ArticleViewHolder extends RecyclerView.ViewHolder { 
    private TextView title, subtitle, time, url ; 
    private ImageView mainImage; 

    public ArticleViewHolder(View convertView) { 
     super(convertView); 
     this.mainImage = (ImageView) convertView.findViewById(R.id.articleMainImage); 
     this.title = (TextView) convertView.findViewById(R.id.articleTitle); 
     this.subtitle = (TextView) convertView.findViewById(R.id.articleSubtitle); 
     this.time = (TextView) convertView.findViewById(R.id.articleTime); 
     this.url = (TextView) convertView.findViewById(R.id.articleUrl); 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mListener.changeFragment(MyWebViewFragment.newInstance(mContext, url.getText().toString())); 
      } 
     }); 
    } 

} 

class WebViewHolder extends RecyclerView.ViewHolder { 
    private WebView webView; 
    private CircularProgressBar circularProgressBar; 
    private RelativeLayout circularProgressBarContainer; 

    public WebViewHolder(View convertView) { 
     super(convertView); 
     this.webView = (WebView) convertView.findViewById(R.id.itemWebView); 
     circularProgressBar = (CircularProgressBar) convertView.findViewById(R.id.circularProgressBar); 
     circularProgressBarContainer = (RelativeLayout) convertView.findViewById(R.id.circularProgressBarContainer); 
    } 
} 

ソリューション。

答えて

0

あなたはこれがあなたがrecyclerview getAdapterPositionから項目を削除/追加している場合は、あなたのonCreateViewHolderはまた

@Override //RecyclerView.Adapter<RecyclerView.ViewHolder> 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View convertView; 

    switch (viewType) { 

     case TYPE_ARTICLE: 
      convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_feed_article, parent, false); 
      RecyclerView.LayoutParams articleLp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mGeneralUtils.dpToPx(280)); 
      convertView.setLayoutParams(articleLp); 
      return new ArticleViewHolder(convertView); 


     case TYPE_WEB: 
      convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main_feed_web, parent, false); 



      RecyclerView.LayoutParams webLp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

      WebViewHolder holder = new WebViewHolder(convertView); 
      int position = holder.getAdapterPosition(); 
      // Get height 
      int viewHeight = mResults.get(position).getHeight(); 

      return holder; 

    } 
    return null; 
} 

をどのように見えるかです。.. getAdapterPositionメソッドを使用することができますがRecyclerView.NO_POSITIONを返すことがありますので、それを処理する必要があるかもしれませんケース

EDIT

あなたはまた、それが意味するスパン数1でStaggeredGridLayoutManagerを使用することができますさまざまな高さのアイテムを扱うので、高さを明示的に管理する必要はありません。次のようにrecyclerviewに千鳥レイアウトマネージャを割り当てます)あなたのrow_item.xmlのルートレイアウトがlayout_height = wrap_content

2を持っていることを確認します)

1:あなたは、次の変更を実行する必要がありますしようとした

recyclerView.setLayoutManager(new StaggeredLayoutManager(1, StaggeredLayoutManager.VERTICAL))

+0

このメソッドは常にNO_POSITION(-1)を返します。 – henengel

+0

@henenge 'getLayoutPosition'が機能しているかどうかを確認してください。もし何かが起こっていることを説明して答えを更新します。 – akash93

+0

getAdapterPosition()= NO_POSITION(-1)と同じ結果です。 – henengel

関連する問題