Вы должны использовать парадигму ViewHolder, которая наиболее легко реализуется с помощью RecyclerView, когда задействованы адаптеры. Доступен онлайн-пример кода here и образец GitHub для клонирования через AndroidStudio напрямую или via Github.
Решение HashMap будет работать, но почему возникает проблема поиска HashMap, когда вы можете просто провести ссылку на объект? Кроме того, RecyclerView изначально обрабатывает различные виды TYPE, поэтому вам не нужно откатывать свое собственное решение, если у вас есть строки заголовков разделов, которые выглядят иначе, чем строки данных.
==================================================================================================================================== =
Более подробное объяснение RecyclerView
следует на основе фрагментов из образца, к которому я привязан.
Протяните CustomAdapter
RecyclerView
.
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
Создать пользовательский номер ViewHolder
. Он должен быть почти всегда статическим классом, если он встроен в ваш CustomAdapter
.
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public ViewHolder(View v) {
super(v);
// Define click listener for the ViewHolder's View.
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Element " + getPosition() + " clicked.");
}
});
textView = (TextView) v.findViewById(R.id.textView);
Обратите внимание, что ViewHolder
находит точку в конструкторе, так как экземпляр ViewHolder
привязан к View
инстанции. ViewHolder
должен иметь ссылки на любые элементы пользовательского интерфейса, которые вы планируете обновлять в обратном вызове onBind
. Объект ViewHolder
затем ассоциируется с View
на RecyclerView
, когда вы включаете следующий код в свой CustomAdapter
.
// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
// Create a new view.
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.text_row_item, viewGroup, false);
return new ViewHolder(v);
}
Обратите внимание, как onCreateViewHolder
обратного вызова задается параметр viewType
. Текущий код всегда возвращает тот же тип настраиваемого ViewHolder
, но он может предоставлять разные классы ViewHolder на основе типа (так вы поддерживаете строки, которые поддерживают разные виды). Следующий код - это то, как вы обновляете свой интерфейс, когда представление привязано к набору данных.
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
Log.d(TAG, "Element " + position + " set.");
// Get element from your dataset at this position and replace the contents of the view
// with that element
viewHolder.getTextView().setText(mDataSet[position]);
}
С помощью этих частей в месте RecyclerView
будет создавать и повторно использовать ваш Views
И ViewHolders
путем соответствующего типа снижения зрения иерархии внешний вид окна и потенциально делает приложение гораздо меньше «Janky».
Ум, если вы уже используете 'ViewHolder', и если' ViewHolder' написан правильно, вы уже свернули свои вызовы 'findViewById()'. – CommonsWare
опубликуйте некоторый код, чтобы мы могли видеть, что у вас уже есть – tyczj
Возможно, ваш ум может быть настроен на это, но вы подумали о том, чтобы отступить назад и фактически измерить, есть ли проблема с производительностью с помощью findViewById(), как вы сейчас? Вы можете потратить много времени на эту оптимизацию, и, в конце концов, вы можете получить почти буквально ничто, но вместо этого угадали свой код :) – dimsuz