私は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);
}
}
ソリューション。
このメソッドは常にNO_POSITION(-1)を返します。 – henengel
@henenge 'getLayoutPosition'が機能しているかどうかを確認してください。もし何かが起こっていることを説明して答えを更新します。 – akash93
getAdapterPosition()= NO_POSITION(-1)と同じ結果です。 – henengel