(#) View Holder Candidates
!!! WARNING: View Holder Candidates
This is a warning.
Id
: `ViewHolder`
Summary
: View Holder Candidates
Severity
: Warning
Category
: Performance
Platform
: Android
Vendor
: Android Open Source Project
Feedback
: https://issuetracker.google.com/issues/new?component=192708
Since
: Initial
Affects
: Kotlin and Java files
Editing
: This check runs on the fly in the IDE editor
See
: https://developer.android.com/guide/topics/ui/layout/recyclerview#ViewHolder
Implementation
: [Source Code](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/ViewHolderDetector.java)
Tests
: [Source Code](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-tests/src/test/java/com/android/tools/lint/checks/ViewHolderDetectorTest.kt)
Copyright Year
: 2014
When implementing a view Adapter, you should avoid unconditionally
inflating a new layout; if an available item is passed in for reuse, you
should try to use that one instead. This helps make for example
`ListView` scrolling much smoother.
(##) Example
Here is an example of lint warnings produced by this check:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~text
src/test/pkg/ViewHolderTest.java:42:Warning: Unconditional layout
inflation from view adapter: Should use View Holder pattern (use
recycled view passed into this method as the second parameter) for
smoother scrolling [ViewHolder]
convertView = mInflater.inflate(R.layout.your_layout, null);
---------------------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here is the source file referenced above:
`src/test/pkg/ViewHolderTest.java`:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~java linenumbers
package test.pkg;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
@SuppressWarnings({"ConstantConditions", "UnusedDeclaration"})
public abstract class ViewHolderTest extends BaseAdapter {
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
public static class Adapter1 extends ViewHolderTest {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
}
public static class Adapter2 extends ViewHolderTest {
LayoutInflater mInflater;
public View getView(int position, View convertView, ViewGroup parent) {
// Should use View Holder pattern here
convertView = mInflater.inflate(R.layout.your_layout, null);
TextView text = (TextView) convertView.findViewById(R.id.text);
text.setText("Position " + position);
return convertView;
}
}
public static class Adapter3 extends ViewHolderTest {
LayoutInflater mInflater;
public View getView(int position, View convertView, ViewGroup parent) {
// Already using View Holder pattern
if (convertView == null) {
convertView = mInflater.inflate(R.layout.your_layout, null);
}
TextView text = (TextView) convertView.findViewById(R.id.text);
text.setText("Position " + position);
return convertView;
}
}
public static class Adapter4 extends ViewHolderTest {
LayoutInflater mInflater;
public View getView(int position, View convertView, ViewGroup parent) {
// Already using View Holder pattern
//noinspection StatementWithEmptyBody
if (convertView != null) {
} else {
convertView = mInflater.inflate(R.layout.your_layout, null);
}
TextView text = (TextView) convertView.findViewById(R.id.text);
text.setText("Position " + position);
return convertView;
}
}
public static class Adapter5 extends ViewHolderTest {
LayoutInflater mInflater;
public View getView(int position, View convertView, ViewGroup parent) {
// Already using View Holder pattern
convertView = convertView == null ? mInflater.inflate(R.layout.your_layout, null) : convertView;
TextView text = (TextView) convertView.findViewById(R.id.text);
text.setText("Position " + position);
return convertView;
}
}
public static class Adapter6 extends ViewHolderTest {
private Context mContext;
private LayoutInflater mLayoutInflator;
private ArrayList