0

コメント ボックスを作成する ArrayAdapter クラスがあります。コメント ボックス内に青または黒のボタンがあります。ボタンの色は、JSON を介して受け取った配列に依存します。配列がこのように見える場合、"NO","NO","YES","NO","NO","NO"3 番目のボタンには青色のテキストが表示されます。私の JSON と ArrayAdapter クラスは、一度に 7 つのコメント ボックスを作成します。問題は、コードがボタンを青色に変更すると、ボタンが継続的に青色に変更されることです。つまり、このような配列が受信された場合"NO","NO","YES","NO","NO","NO"、3 番目のボタンは青色になり、別の一連のコメントを受信するので、今回は配列は次のようになります"NO","NO","NO","NO","NO","NO"このコードによれば、どのボタンも青色であってはなりませんが、何らかの理由で 3 番目のボタンは青色のままです。さらに複数のコメント セットを読み込むことができ、3 番目のボタンは、コードで黒にする必要があることが明確に示されていても、常に青になります。奇妙なことに、ボタンは青ですが、黒のボタンのように機能します。これが私のArrayAdapterです。

class ListAdapter extends ArrayAdapter<Item> {
        public ListAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
        }

        private List<Item> items;

        public ListAdapter(Context context, int resource, List<Item> items) {
            super(context, resource, items);
            this.items = items;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi;
                vi = LayoutInflater.from(getContext());
                v = vi.inflate(R.layout.list_item_layout, null);
            }
            final Item p = items.get(position);
            if (p != null) {
                //set xml objects 
                //must be done inside of class
              ButtonListViewItem = (TextView) v.findViewById(R.id.button_listview_item);
                if(p.getJSONArray().equals("NO")){
                 ButtonListViewItem.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ButtonListViewItem.setTextColor(0xff000000);
                        new AsyncTask().execute();
                    }//end on click
                });
                }//end if equals NO
                if(p.getJSONArray().equals("YES")){
                    ButtonListViewItem.setClickable(false);
                    ButtonListViewItem.setTextColor(0xff3399FF);
                }//end if equals yes
            }//end if null
            return v;
        }//end getView
      }//end ListAdapter class
4

1 に答える 1

1

リサイクルされたビューを正しく処理していないため、テキストの色が間違っています。

最短かつ簡単な解決策は、このチェックを削除することです。

if (v == null)

毎回新しいビューを膨らませます。これは効率的ではありませんが、コードが扱いやすくなります。

リサイクルされたビューを引き続き使用することを選択した場合の解決策は、テキストの色とボタンのクリック可能性を毎回明示的に設定することです。

if (p.getJSONArray().equals("YES")) {
    ButtonListViewItem.setClickable(false);
    ButtonListViewItem.setTextColor(0xff3399FF);
} else {
    ButtonListViewItem.setClickable(true);
    ButtonListViewItem.setTextColor(0xff000000);
}

これを行う必要があるのは、再利用されたビューがそのままの状態で引き渡され、属性が変更されたためです。XML レイアウトと一致しなくなります。そのため、以前に「はい」に関連付けられていたビューが再利用されると、テキストの色に加えた変更がそのまま残ります。テキストは青色になり、ボタンはクリックできなくなります。

新しいビューをインフレートすると、常に既知の状態から開始できます。つまり、常に XML に一致するものを開始できます。トレードオフは効率であり、ビューの膨張は比較的高価です。アプリをより効率的にする必要がある場合は、ビュー ホルダーパターンも検討する必要があります。これは、ビューを見つけることも回避できる費用であるためです。

于 2013-11-15T04:08:10.750 に答える