図1に示すように、2つのリストビューのlist_Aとlist_Bを同じ数のリストアイテムで使用しています。ここで、list_Bは各アイテムをリスト(文字列)として持つカスタム配列アダプターで、必要な幅のボタンを動的に作成します。
public class LarrayAdapter extends ArrayAdapter<List<String>> {
private final Context context;
private List<List<String>> list;
public LarrayAdapter(Context context, List<List<String>> list) {
super(context, R.layout.hrowlayout, list);
this.context = context;
this.list = list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
HorizontalScrollView sv = (HorizontalScrollView) inflater.inflate(
R.layout.hrowlayout, parent, false);
LinearLayout rl1 = (LinearLayout) sv.findViewById(R.id.ll);
List<String> name2 = list.get(position);
final Button[] b = new Button[name2.size()];
float x;
for (int i = 0; i < name2.size(); i++) {
b[i] = new Button(rl1.getContext());
b[i].setGravity(Gravity.CENTER);
b[i].setBackgroundResource(R.drawable.bakground_list);
b[i].setSingleLine(true);
String einfo = name2.get(i);
String[] einfosplit = einfo.split("-",2);
x = calwidth(Integer.parseInt(einfosplit[1]));
LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams((int) x, 80);
params2.topMargin = 15;
b[i].setTextSize(18);
b[i].setTextColor(Color.WHITE);
b[i].setText(einfosplit[0]);
b[i].setLayoutParams(params2);
final int z = i;
b[i].setOnFocusChangeListener(new View.OnFocusChangeListener(){
@Override
public void onFocusChange(View v, boolean hasFocus){
if(hasFocus){
b[z].setTextColor(0xff7BCFFC);
}
else
b[z].setTextColor(Color.WHITE);
}
} );
rl1.addView(b[i],params2);
}
sv.scrollTo(0, 0);
return sv;
}
public int calwidth(int dur){
return (253/3)*dur;
}
}
直面している問題: list_A から list_B に移動するとき、list_B のフォーカスを list_A アイテムの同じ位置に設定したいので、これを行うために使用しています
list_B.setSelection(list_A_cur);//list_A_cur gives position of list_A focused item
list_B.setFocusable(true);
list_B.requestFocus();
list_B アイテムは図 1 に示すように正しくフォーカスを取得しますが、アイテムはしばらくするとフォーカスを失い、図 2 に示すように毎回最初のアイテムに戻ります。
図1
図2