【发布时间】:2017-05-30 06:46:19
【问题描述】:
我有一个回收站视图,它应该显示如下数据(如果位置是偶数则为 1 项,如果位置为奇数则彼此相邻 2 项),老实说,我尝试了又尝试,但我没有这样做。
它应该是这样的
现在是这样的(忽略宽度和高度,看看视频 3 是如何膨胀两次的)
我正在使用 LinearLayoutManager,这是我的适配器:
public class MediaItemsAdapter extends RecyclerView.Adapter<MediaItemsAdapter.RecyclerViewHolder> {
private List<MediaItem> allMediaItems;
private Activity context;
private RecyclerViewOnItemClickListener itemClickListener;
public MediaItemsAdapter(Activity context, List<MediaItem> allMediaItems, RecyclerViewOnItemClickListener itemClickListener ) {
this.allMediaItems = allMediaItems;
this.context = context;
this.itemClickListener = itemClickListener;
}
@Override
public void onBindViewHolder(final RecyclerViewHolder holder, final int position) {
MediaItem mediaItem = allMediaItems.get(position);
if(position %2 == 0){ // even
holder.tvTitle.setText(mediaItem.getTitle());
holder.tvSummary.setText(mediaItem.getDate());
try {
Picasso.with(context)
.load(mediaItem.getImageUrl())
.into(holder.ivImage, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
holder.ivImage.setAlpha((float) 1);
}
@Override
public void onError() {
Log.wtf("error", "in loading");
}
});
} catch (Exception e) {
e.printStackTrace();
}
holder.ivPlay.setVisibility(mediaItem.isVideo() ? View.VISIBLE : View.GONE);
}else{ //odd
holder.tvTitle.setText(mediaItem.getTitle());
holder.tvSummary.setText(mediaItem.getDate());
try {
Picasso.with(context)
.load(mediaItem.getImageUrl())
.into(holder.ivImage, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
holder.ivImage.setAlpha((float) 1);
}
@Override
public void onError() {
Log.wtf("error", "in loading");
}
});
} catch (Exception e) {
e.printStackTrace();
}
holder.ivPlay.setVisibility(mediaItem.isVideo() ? View.VISIBLE : View.GONE);
try{
MediaItem secondMediaItem = allMediaItems.get(position + 1);
holder.tvSecondTitle.setText(secondMediaItem.getTitle());
holder.tvSecondSummary.setText(secondMediaItem.getDate());
try {
Picasso.with(context)
.load(secondMediaItem.getImageUrl())
.into(holder.ivSecondImage, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
holder.ivSecondImage.setAlpha((float) 1);
}
@Override
public void onError() {
Log.wtf("error", "in loading");
}
});
} catch (Exception e) {
e.printStackTrace();
}
holder.ivSecondPlay.setVisibility(secondMediaItem.isVideo() ? View.VISIBLE : View.GONE);
}catch (Exception e){
e.printStackTrace();
}
}
}
@Override
public int getItemViewType(int position) {
return position %2 == 0 ? 0 : 1;
}
@Override
public int getItemCount() {
return this.allMediaItems.size();
}
public interface RecyclerViewOnItemClickListener {
void onItemClicked(View v, int position);
}
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View layoutView;
if (viewType == 0 ){
layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.even_media_layout, parent, false);
RecyclerViewHolder rcv = new RecyclerViewHolder(layoutView);
return (rcv);
}else{
layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.odd_media_layout, parent, false);
RecyclerViewHolder rcv = new RecyclerViewHolder(layoutView);
return (rcv);
}
}
public class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView tvTitle, tvSecondTitle, tvSummary, tvSecondSummary;
private ImageView ivImage, ivSecondImage;
private ImageButton ivPlay, ivSecondPlay;
protected View itemView;
public RecyclerViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
this.itemView.setOnClickListener(this);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvSecondTitle = (TextView) itemView.findViewById(R.id.tvSecondTitle);
tvSummary = (TextView) itemView.findViewById(R.id.tvSummary);
tvSecondSummary = (TextView) itemView.findViewById(R.id.tvSecondSummary);
ivImage = (ImageView) itemView.findViewById(R.id.ivImage);
ivSecondImage = (ImageView) itemView.findViewById(R.id.ivSecondImage);
ivPlay = (ImageButton) itemView.findViewById(R.id.ivPlay);
ivSecondPlay = (ImageButton) itemView.findViewById(R.id.ivSecondPlay);
}
@Override
public void onClick(View view) {
itemClickListener.onItemClicked(view, getLayoutPosition());
}
}
}
如何防止数据复制,如何告诉数组列表对象3已经膨胀了?有没有比 LinearLayoutManager 更好的方法
问候。
【问题讨论】:
-
您好,欢迎来到 Stack Overflow。如果您提供minimal reproducible example,您的问题可能会引起更多兴趣。就目前而言,这个问题太复杂了,有太多不相关的部分。
标签: android android-recyclerview layout-manager