我正在创建一个布局,其中包含大量要显示的项目,每个项目都包含一个包含ImageView
,EditText
和TextView
的布局。理想情况下,这是ListView的完美候选者,但是,因为我有EditText
,所以当用户尝试输入内容时,我无法专注于它。在SO上阅读关于这个的很多帖子,似乎没有用ListView实现这个的干净解决方案。
但是,我可能要显示100个项目,并且在ScrollView
上直接呈现所有这些项目似乎不是一个明智的想法。是否有任何设计模式来处理这种情况?
答案 0 :(得分:1)
您可以尝试使用RecycleView。它适用于大型数据集。 https://developer.android.com/training/material/lists-cards.html
“RecyclerView小部件是ListView的一个更高级和灵活的版本。这个小部件是一个容器,用于显示大型数据集,通过维护有限数量的视图可以非常有效地滚动。当您有数据收集时使用RecyclerView小部件其元素在运行时根据用户操作或网络事件而变化。“
答案 1 :(得分:1)
我认为您需要的是最近添加到支持库中的新RecyclerView。有一个简单的介绍here。
RecyclerView特别有用,因为它没有onItemClickListener
。人们倾向于问“但为什么没有呢?”
它实际上非常聪明,完全是因为你的用例:它不会把你的注意力集中在可点击的项目上(正如你所知,ListView就是这样),而是每个点击事件都被委托给孩子的{{ 1}} S上。
来自指定链接的示例(来源是 Antonio Leiva 的博客):
onClickListener
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {
private List<ViewModel> items;
private int itemLayout;
public MyRecyclerAdapter(List<ViewModel> items, int itemLayout) {
this.items = items;
this.itemLayout = itemLayout;
}
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
return new ViewHolder(v);
}
@Override public void onBindViewHolder(ViewHolder holder, int position) {
ViewModel item = items.get(position);
holder.text.setText(item.getText());
holder.image.setImageBitmap(null);
Picasso.with(holder.image.getContext()).cancelRequest(holder.image);
Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);
holder.itemView.setTag(item);
}
@Override public int getItemCount() {
return items.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public TextView text;
public ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.image);
text = (TextView) itemView.findViewById(R.id.text);
}
}
}
和add
上的位置:
remove
初始化:
public void add(ViewModel item, int position) {
items.add(position, item);
notifyItemInserted(position);
}
public void remove(ViewModel item) {
int position = items.indexOf(item);
items.remove(position);
notifyItemRemoved(position);
}
需要依赖:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
recyclerView.setHasFixedSize(true); // use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
recyclerView.setAdapter(new MyRecyclerAdapter(list, R.layout.item));
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());