使用ScrollView的大型列表

时间:2015-04-16 12:49:22

标签: android listview scrollview

我正在创建一个布局,其中包含大量要显示的项目,每个项目都包含一个包含ImageViewEditTextTextView的布局。理想情况下,这是ListView的完美候选者,但是,因为我有EditText,所以当用户尝试输入内容时,我无法专注于它。在SO上阅读关于这个的很多帖子,似乎没有用ListView实现这个的干净解决方案。

但是,我可能要显示100个项目,并且在ScrollView上直接呈现所有这些项目似乎不是一个明智的想法。是否有任何设计模式来处理这种情况?

2 个答案:

答案 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());