我的Android应用中有多个列表,包含这些(回收)列表视图的活动也包含其他内容。将listview放在内容下方可以正常工作而无需任何自定义建模。但是,当在列表中滚动时,它只滚动列表,因此显示大约1或2个项目,而我们想要滚动整个活动,以便内容向上移动并显示完整列表。
为了使活动可滚动,我们需要一个ScrollView,这有点违背设计指南,我知道,但我需要它。
为了完成这项工作,我使用了这个解决方案: https://stackoverflow.com/a/13796159/2901207
只要列表视图的高度设置为列表视图中项目所需的高度,它就可以完美地工作。所以出现了我的问题,如何计算这个高度。
现在我有点幸运,列表中的项目具有相同的高度,所以通过一些试验和错误,我可以实现这一点:
recyclerView.setMinimumHeight(posts.size() * 190);
然而,这并不是真的有效,因为我们有不同的分辨率和屏幕尺寸。在xhdpi上这可以工作,但在xxhdpi上我还需要4个空间的空间。
int totalHeight = 0;
for (int i = 0; i < mAdapter.getCount(); i++) {
View mView = mAdapter.getView(i, null, listView);
mView.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
totalHeight += mView.getMeasuredHeight();
Log.w("HEIGHT" + i, String.valueOf(totalHeight));
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (mAdapter.getCount() - 1));
listView.setLayoutParams(params);
listView.requestLayout();
但是,这不适用于RecyclerView.Adapter<myAdpater.MyViewHolder>
,因为它不包含getView()
方法。 (而不是getDividerHeight()
方法)。
这是我的一个适配器的样子:
public class ResponsesAdpater extends RecyclerView.Adapter<ResponsesAdpater.MyViewHolder> {
private LayoutInflater inflrater;
List<Post> posts = Collections.emptyList();
Context context;
private ClickListenerResponseList listener;
public ResponsesAdpater(Context context, List<Post> posts) {
this.context = context;
inflrater = LayoutInflater.from(context);
this.posts = posts;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflrater.inflate(R.layout.responses_row, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Post post = posts.get(position);
holder.lblMainText.setText(post.text);
}
public void setClickListener(ClickListenerResponseList listener)
{
this.listener = listener;
}
@Override
public int getItemCount() {
return posts.size();
}
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView lblMainText;
ImageView imgIcon;
public MyViewHolder(View itemView) {
super(itemView);
lblMainText = (TextView) itemView.findViewById(R.id.lblPostMainText);
imgIcon = (ImageView) itemView.findViewById(R.id.imgIcon);
}
@Override
public void onClick(View v) {
if(listener != null)
{
listener.ResponseClicked(v, getAdapterPosition());
}
}
}
public interface ClickListenerResponseList{
void ResponseClicked(View view, int position);
}
}
另一个解决方案是something like this,但是当从RecyclerView扩展时,我们没有一个onDraw方法来覆盖。
非常感谢帮助!