У меня есть несколько списков в моем приложении для Android, действия, которые содержат эти списки (recycle), также содержат другое содержимое. Помещение списка ниже содержания отлично работает без какого-либо пользовательского моделирования. Однако при прокрутке списка он прокручивает список, показывая около 1 или 2 элемента, в то время как мы хотим прокрутить всю активность, чтобы содержимое перемещалось вверх и показывался полный список.
Чтобы сделать операцию прокручиваемой, нам понадобится ScrollView, это немного противоречит руководящим принципам проектирования, я знаю, но мне это нужно.
Чтобы это сделать, я использовал это решение: qaru.site/info/19754/...
Он отлично работает, если высота списка отображается равной требуемой высоте для элементов в списке. Так возникает моя проблема, как я могу рассчитать эту высоту.
Теперь мне немного повезло, что элементы в списках имеют одинаковую высоту, поэтому с небольшим количеством проб и ошибок я мог бы добиться этого так:
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);
}
}
Другим решением будет что-то вроде этого, но при расширении с RecyclerView у нас нет метода onDraw для переопределения.
Помощь будет очень признательна!