4

私が取り組んでいるアプリケーションによると、リスト ビューを作成し、ユーザーが各項目をクリックしたときにイベントを処理する必要があります。リスト ビューの最初の項目を除いて、すべて正常に動作します。リストビューが初めて読み込まれたときはクリックできません。リストビューを上下にスクロールすると、完全に機能します。もう 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)));
}
4

1 に答える 1

2

コードを移動してみてください

convertView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            listener.onDiseasItemClick(item);

        }
    });

中身

if (convertView == null){
.....
}

リスナーが一度設定されていることを確認します。

于 2012-08-23T12:26:53.377 に答える