Когда речь идет о ListView, чтобы сделать его более эффективным, мы используем шаблон ViewHolder. Способ использования шаблона ViewHolder и R.layout.row_null из следующего xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</LinearLayout>
должен использоваться с getViewTypeCount () и getItemViewType (int position) следующим образом.
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return (hideStatusCheck(position)) ? 1 : 0;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
View rowView = convertView;
if (hideStatusCheck(pos)) {
if (rowView == null || rowView.getTag() != null) {
LayoutInflater inflater = mActivity.getLayoutInflater();
rowView = inflater.inflate(R.layout.row_null, parent, false);
}
} else {
if (rowView == null) {
rowView = inflateNormalView(parent);
} else if (rowView.getTag() == null) {
rowView = inflateNormalView(parent);
} else {
ViewHolder holderToCheck = (ViewHolder) rowView.getTag();
Integer storedPos = (Integer) holderToCheck.getTag(POSITION);
if (storedPos == null || storedPos != pos)
rowView = inflateNormalView(parent);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
holder.setTag(POSITION,pos);
/*
Populate data
*/
return rowView;
}
private View inflateNormalView(ViewGroup parent) {
View rowView;
LayoutInflater inflater = mActivity.getLayoutInflater();
rowView = inflater.inflate(R.layout.normal_item, parent, false);
ViewHolder viewHolder = new ViewHolder();
assert rowView != null;
/* Initiate normal findViewById thing*/
rowView.setTag(viewHolder);
return rowView;
}
Мы выполняем проверку типа View элемента, и если он соответствует проверке скрытия, он возвращает 1, в противном случае 0. ListView знает, что будет два типа View из getViewTypeCount. Теперь getView будет возвращать approriate View в зависимости от hideStatusCheck. Чтобы создать надежный ListView, мы хотим использовать шаблон ViewHolder. Нам не нужно использовать ViewHolder, когда он скрыт. Мы просто раздуваем R.layout.row_null и возвращаем его. Мы будем использовать ViewHolder для R.layout.normal_item. Вот сложная часть, предполагающая, что скрывающая проверка не является статичной. Первая проверка rowView==null
является стандартной. Вторая проверка rowView.getTag()==null
состоит в том, чтобы увидеть, возвращается ли вид в нормальное состояние
от сокрытия. Третья проверка в последнем предложении else
заключается в проверке того, является ли ViewHolder, сохраненный в теге, правильным ViewHolder. Если эти условия выполняются, мы всегда раздуваем взгляд снова. Да, это правда, что шаблон ViewHolder не используется повсеместно, но он используется для определенных расширений. Это лучше, чем ничего.