私が取り組んでいるアプリケーションによると、リスト ビューを作成し、ユーザーが各項目をクリックしたときにイベントを処理する必要があります。リスト ビューの最初の項目を除いて、すべて正常に動作します。リストビューが初めて読み込まれたときはクリックできません。リストビューを上下にスクロールすると、完全に機能します。もう 1 つ、初めてリスト ビューが読み込まれます。最初の項目をクリックしてから 2 番目の項目をクリックすると、トースト メッセージに 2 番目の項目の名前が表示され、次に最初の項目の名前が表示されます。その結果、リスト ビューがスクロールまたはクリックされるまで、リスト ビューの最初の項目はアクティブになりません。これがこのフラグメントのコードです。それを処理する方法はありますか?
public EyeDiseasesFragment(File diseasesJsonFile) {
this.diseasesJsonFile = diseasesJsonFile;
mainUrl = Config.mainUrl;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
diseasesList = new ArrayList<Diseases>();
new LoadContent().execute();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (MainFragmentController) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnArticleSelectedListener");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.diseases, container, false);
mList = (ListView) view.findViewById(R.id.diseases);
return view;
}
class DiseasesAdapter extends BaseAdapter {
LayoutInflater inflater;
public DiseasesAdapter() {
inflater = (LayoutInflater) getActivity().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return diseasesList.size();
}
@Override
public Diseases getItem(int arg0) {
return diseasesList.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(final int position, View convertView, ViewGroup arg2) {
final Diseases item;
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.diseases_item, null);
holder.title = (TextView) convertView.findViewById(R.id.disease_item_header);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
item = getItem(position);
holder.title.setText(item.diseaseName);
convertView.setLayoutParams(new ListView.LayoutParams(
LayoutParams.MATCH_PARENT, HelperStaticMethods.getDIP(
getActivity(), 50)));
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
listener.onDiseasItemClick(item);
}
});
return convertView;
}
}
class ViewHolder {
TextView title;
}
class LoadContent extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
setDiseasesInformation(getActivity());
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
mList.setCacheColorHint(Color.TRANSPARENT);
mList.setDivider(null);
mList.setVerticalFadingEdgeEnabled(false);
DiseasesAdapter adapter = new DiseasesAdapter();
mList.setAdapter(adapter);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
}
編集
以下のコードを convertView が Null であるステートメントに移動すると、問題が解決しました。
if (convertView == null) {
// ... after inflating the view
convertView.setLayoutParams(new ListView.LayoutParams(
LayoutParams.MATCH_PARENT, HelperStaticMethods.getDIP(getActivity(), 50)));
}