ダミー オブジェクトのリストからフラグメントを生成するカスタム アダプターを作成しました (LevelAdapter
ゲームのレベルのリストを表示しているため) 。ListView
各ダミー オブジェクトにはブール値の「ロック解除」プロパティがあり、基になるダミー アイテムが「ロック解除」されているかどうかに応じて、リスト内の各アイテムのスタイル プロパティを条件付きで無効にして設定しようとしています。そのために、私も採用しましたViewHolder
。
以下のコードは、ユーザーが下にスクロールして上に戻るまで正常に機能します。その時点で、「ロック解除された」アイテムは無効になりませんが、適切なスタイルが失われます。
public class LevelAdapter extends ArrayAdapter<DummyContent.DummyItem> {
private List<DummyContent.DummyItem> objects;
private DummyContent.DummyItem item;
private Context context;
private int textViewResourceId;
private int resource;
public LevelAdapter(Context context, int resource, int textViewResourceId, List<DummyContent.DummyItem> objects) {
super(context, resource, textViewResourceId, objects);
this.objects = objects;
this.context = context;
this.resource = resource;
this.textViewResourceId = textViewResourceId;
}
static class ViewHolder {
TextView text;
int position;
boolean unlocked;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
// https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder
ViewHolder holder;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(resource, null);
holder = new ViewHolder();
holder.text = (TextView) v.findViewById(textViewResourceId);
holder.position = position;
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
item = objects.get(position);
holder.text.setText(item.title);
if (item.unlocked == false) {
holder.text.setTextColor(Color.LTGRAY);
Typeface type = Typeface.create("", Typeface.ITALIC);
holder.text.setTypeface(type);
}
return v;
}
@Override
public boolean areAllItemsEnabled() {
return true; // technically untrue, but a hack to show the line divider between items
}
@Override
public boolean isEnabled(int position) {
item = objects.get(position);
if (item.unlocked == true) {
return true;
} else {
return false;
}
}
}