0

すべての行にimageviewsのリストがあります。一部の行ではそれらの画像を表示したいのですが、一部の行ではそれらを表示したくないので、カスタムListAdapterを使用します。

リスト行XMLには次のものがあります。

<ImageView
 android:id="@+id/image1"
 android:layout_height="fill_parent"
 android:src="@drawable/button1"
 android:visibility="invisible"/>

ご覧のとおり、デフォルトではすべての画像が非表示になっています。

カスタムSimpleAdapterで、状態を確認し、それに応じてこの行の画像を表示に設定します。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);

if(condition == true){

   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
}

return view;

}

だから私はすべての行に2つのImageViewsと3つのTextViewsを使ってこのようにやっています。ImageViewはデフォルトでは非表示であり、上記の条件に基づいて表示されます。TextVoewsは黒で、別の条件に基づいて別のテキストの色を取得します。

私の問題は、これは1〜5アイテム程度の小さなリストでは正常に機能しますが、リストが長くなると期待どおりに機能しないことです。結果が間違っている場合があり、同じデータに基づいてリストビューをリロードすると、毎回異なる結果が表示される場合があります。画像の設定が間違っているか、テキストの色が間違っています。

2番目の問題は、アダプターにフィルターを適用すると、これが完全かつ確実に失敗することです。EditTextフィールドがあり、このEditTextが変更されるたびにフィルターを適用したいので、そのEditTextにTextChangedListenerがあります。

edittext1.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void afterTextChanged(Editable s) {

            adapter.getFilter().filter(s);
        }
    });

このEditTextにフォーカスを設定した瞬間から、リストビュー全体が完全に変更され、条件ベースのフォーマットが「時々間違っている」だけでなく、「ロジックがまったくない」ようになりました。

これは、行を作成してアダプターを使用する正しい方法ですか?なぜこれが正しく機能しないのですか?また、フィルターを使い始めたときに完全に狂ってしまうのはなぜですか?

アドバンであなたの助けをどうもありがとう。

4

3 に答える 3

1

アダプタビューはリサイクルされるため、次のようにすべてのパスを考慮する必要があります。

if(condition == true){

   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
} else {
   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.INVISIBLE);
}

そうImageViewすれば、条件がfalseのときにが非表示になります。

あなたのフィルターの問題についての手がかりはありません、私の勘はそれが上記と同じ問題に関連しているということです。

于 2011-08-19T20:38:29.027 に答える
0

最初の問題の場合:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView == null) {
        convertView = mInflater.inflate(R.layout.my_list_row, null);

        if(condition == true)
            ((ImageView) convertView.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
        else
            ((ImageView) convertView.findViewById(R.id.image1)).setVisibility(View.INVISIBLE);
    }

    return convertView; 
}

フィルターに関しては、何をしようとしていますか?inputTypesを確認することをお勧めします。

http://developer.android.com/reference/android/widget/TextView.html#attr_android:inputType

于 2011-08-19T20:43:48.067 に答える
0

そこで、ついにSimpleAdapterをArrayAdapterに変更し、デフォルトのFilterメソッドを使用せずに、ArrayListをフィルター処理し、フィルター処理されたArrayListをアダプターリストとして設定するメソッドを実装しました。今では動作します。SimpleAdapterでは、フィルタリング後に画像が更新されておらず、フィルタリングされたリストでは、ビューを更新できませんでした。現在動作しています。

于 2011-08-20T09:45:34.993 に答える