2015-04-16 4 views
2

Я создаю макет, где у меня есть большое количество элементов для отображения, и каждый элемент содержит макет с ImageView, EditText и TextView. В идеале, это идеальный кандидат для ListView, однако, поскольку у меня есть EditText, я не могу сосредоточиться на нем, когда пользователь пытается что-то напечатать. Читая много сообщений об этом на SO, кажется, что нет чистого решения для реализации этого с помощью ListView.Большой список с помощью ScrollView

Тем не менее, у меня может быть 100 предметов для отображения, и это не кажется мудрой идеей, чтобы прямо вынести все это на ScrollView. Существуют ли какие-либо шаблоны проектирования для обработки этой ситуации?

+2

новый 'RecyclerView' в библиотеке поддержки звучит как-то, что это именно то, что вам нужно: http://antonioleiva.com/recyclerview/ – EpicPandaForce

+0

как об удалении редактирования из списка? сделать его текстовым полем и либо добавить кнопку редактирования, либо щелкнуть всплывающее диалоговое окно для редактирования. –

+1

@EpicPandaForce: только что реализованный с использованием RecycleView, и он работает потрясающе! Благодаря! Не уверен, как дать вам кредит на ответ, так как он в комментарии. – wislo

ответ

1

Я думаю, что вам нужен новый RecyclerView, который был недавно добавлен в библиотеку поддержки. Доступно простое введение here.

RecyclerView особенно полезен, поскольку он не имеет onItemClickListener. Люди склонны спрашивать: «Но почему у него нет?»

На самом деле это действительно разумно, именно из-за вашего прецедента: он не украл ваш фокус на кликабельные элементы (как вы знаете, ListView делает это), и вместо этого каждое событие click делегируется дочерним пользователям onClickListener s.

Пример из указанной ссылке (источник блог Антонио Лейва):

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

Req Uires зависимость:

dependencies { 
    ... 
    compile 'com.android.support:recyclerview-v7:21.0.+' 
} 
1

Вы можете попробовать использовать RecycleView. Он работает лучше с большими наборами данных. https://developer.android.com/training/material/lists-cards.html

«Виджет RecyclerView является более продвинутым и гибким вариантом ListView. Этот виджет является контейнером для отображения больших наборов данных, которые могут быть прокручивать очень эффективно поддерживать ограниченное количество просмотров. Используйте RecyclerView виджет, когда вы имеют коллекции данных, чьи элементы меняются во время выполнения на основе действий пользователя или сетевых событий ».

Смежные вопросы