いくつかのチュートリアルに基づいて、文字列を含むリストを表示する単純な Android アプリを作成しようとしました。問題は、リスト項目に新しいレイアウトを導入しようとしたときでした。
したがって、次のようになります。
listItem1 -> レイアウト1
listItem2 -> レイアウト2
listItem3 -> レイアウト1
等
新しいレイアウトを追加しようとすると、スクロール時にアイテムが「スクランブル」になりました。たとえば、 item1、item2、item3、item4... が表示され、下にスクロールして戻ってくると、私のリストは item40、item3、item20、item1 などになります。
私が持っているコードは次のとおりです。
(activity_main.xml ファイルには LinearLayout > ListView があります)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
items = new ArrayList<String>();
for (int i = 0; i < 50; i++){
items.add(i%2==0 ? "true" : "false");
}
ListView listView = (ListView) findViewById(R.id.ListViewId);
listView.setAdapter(new ListItemAdapter(this, android.R.layout.simple_list_item_1, items));
}
(list_item_1 と list_item_2 はテキストビュー付きのレイアウトです)
public class ListItemAdapter extends ArrayAdapter<String> {
private ArrayList<String> items;
private LayoutInflater mInflater;
public ListItemAdapter(Context context, int textViewResourceId,
ArrayList<String> items) {
super(context, textViewResourceId, items);
this.items = items;
mInflater = (LayoutInflater)this.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = items.get(position).equals("true") ? 0 : 1;
if (convertView == null) {
switch(type){
case 1:
convertView = mInflater.inflate(R.layout.list_item_1, null);
break;
case 0:
convertView = mInflater.inflate(R.layout.list_item_2, null);
break;
}
}
String item = items.get(position);
if (item != null) {
switch(type){
case 1:
TextView text = (TextView) convertView.findViewById(R.id.day);
if (text != null) {
text.setText(item);
}
break;
case 0:
TextView day = (TextView) convertView.findViewById(R.id.text);
if (day != null) {
day.setText(item);
}
break;
}
}
return convertView;
}
}
ご覧のとおり、アイテム (true または false) に応じて、レイアウトを変更します。
ご意見をお寄せください。
ところで、これは私がやろうとしていることの単純化された例です...