0

リストビューのこの非常に奇妙な動作を見つけ、Android 2.1 と 4.1 では動作が異なります。ListView のパフォーマンスを高速化するために使用するように Google がアドバイスする、私が作成した 2 つのクラスを次に示します。再現方法: エントリを追加し、最初のチェックボックスをオンにしてから、複数のエントリを 1 ページ以上追加します。チェックされたボックスは、要素を介してフロート! ここに私が書いた小さなプロジェクトがあります: http://tinyurl.com/strange-listview Anyone can explain the issue or a workaround?

public class AlarmManagerActivity extends Activity {
    private PerformanceArrayAdapter mPerformaceArrayAdapter;
    private ListView mListView;
    private ArrayList<String> mListItems = new ArrayList<String>();
    private int mCounter = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mListView = (ListView) findViewById(R.id.listViewCondition);
        mPerformaceArrayAdapter = new PerformanceArrayAdapter(this, mListItems);
        mListView.setAdapter(mPerformaceArrayAdapter);
    }

    public void onClickAdd(View view){
        mListItems.add("" + mCounter++);
        mPerformaceArrayAdapter.notifyDataSetChanged();
    }
}

そして、これがmain.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:id="@+id/buttonAdd" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="Add New Alarm"
    android:onClick="onClickAdd" />
<ListView android:id="@+id/listViewCondition"
    android:layout_height="wrap_content" android:layout_width="match_parent"></ListView>
</LinearLayout>

そして、パフォーマンス アダプター クラス。

public class PerformanceArrayAdapter extends ArrayAdapter<String> {
    private final Activity context;
    private final ArrayList<String> mListItems;

    static class ViewHolder {
        public TextView textView1;
        public TextView textView2;
        public CheckBox checkBox;
    }

    public PerformanceArrayAdapter(Activity context, ArrayList<String> listItems) {
        super(context, R.layout.row_layout, listItems);
        this.context = context;
        this.mListItems = listItems;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        if (rowView == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            rowView = inflater.inflate(R.layout.row_layout, null);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.textView1 = (TextView) rowView.findViewById(R.id.textView1);
                    viewHolder.textView2 = (TextView) rowView.findViewById(R.id.textView2);
            viewHolder.checkBox = (CheckBox) rowView.findViewById(R.id.checkBox1);
            rowView.setTag(viewHolder);
        }
        ViewHolder holder = (ViewHolder) rowView.getTag();
        holder.textView1.setText(mListItems.get(position));
        return rowView;
    }
}

こちらがrow_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true" android:text="TextView1"></TextView>
    <TextView android:id="@+id/textView2" android:layout_below="@+id/textView1"
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="TextView2"></TextView>
    <CheckBox android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/checkBox1"
            android:layout_alignParentRight="true" android:focusable="false"
            android:focusableInTouchMode="false"></CheckBox>
    </RelativeLayout>
4

1 に答える 1

0

Vogella のおかげで解決策を見つけました :) ここで説明したドメイン モデルを使用して、テキスト ビューとチェック ボックスの両方を追跡する必要がありました。

http://www.vogella.com/articles/AndroidListView/article.html#listadvanced_interactive

于 2012-10-01T15:37:00.597 に答える