奇怪的ListView行为[更快的性能]

时间:2012-09-29 18:48:28

标签: android-layout android-widget android-listview android-arrayadapter

我发现listview的这种非常奇怪的行为,它在Android 2.1和4.1上的行为有所不同 以下是我写的两个类,谷歌建议使用这两个类来提高ListView的性能。 如何重现:添加条目,选中第一个复选框,然后添加多于一个页面的条目。复选框浮动元素! 这是我写的一个小项目: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>

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,感谢Vogella :) 我不得不使用这里提到的域模型来跟踪文本视图和复选框。

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