0

在我的应用程序中,我有一个ListViewand ArrayAdapter。当我在其中选择某个元素时,ListView我还可以看到更多选定的元素。

此外,当我在(选择后)滚动元素时,ListView我的选择消失并且元素被随机选择。

适配器代码:

final ListAdapter adapter = new ArrayAdapter<BinLocationsComponent>(activity, R.layout.simple_list_item_multiple_choice, locationComponents) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if ( convertView == null ) {
            convertView = layoutInflater.inflate(layout.simple_test_layout_with_one_text_field, null);
        }
        return convertView;
    }
};

看起来需要设置一些参数。

你能帮我避免这个问题吗?


UPD1

final ListAdapter adapter = new ArrayAdapter<BinLocationsComponent>(activity, R.layout.simple_list_item_multiple_choice, locationComponents) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final LocationsViewHolder viewHolder;
        if ( convertView == null ) {
            convertView = layoutInflater.inflate(layout.rp_bin_locations_block_element, parent, false);
            viewHolder = new LocationsViewHolder();
            viewHolder.init(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (LocationsViewHolder) convertView.getTag();
        }
        final BinLocation binLocation = locationComponents.get(position).getBinLocation();
        if ( binLocation != null ) {
            viewHolder.provideValues(binLocation);
        }
        return convertView;
    }

    class LocationsViewHolder {
        TextView stationName;
        TextView rackName;
        TextView binName;
        TextView volume;
        NumberPicker numberOfItems;

        public void init(View view) {
            stationName = (TextView) view.findViewById(id.ro_station_name);
            rackName = (TextView) view.findViewById(id.ro_rack_name);
            binName = (TextView) view.findViewById(id.ro_bin_name);
            volume = (TextView) view.findViewById(id.ro_volume_value);
            numberOfItems = (NumberPicker) view.findViewById(id.ro_number_of_items);
        }

        public void provideValues(BinLocation location) {
            stationName.setText(location.getStationName());
            rackName.setText(location.getRackName());
            binName.setText(location.getBinName());
            volume.setText(valueOf(location.getVolume()));
        }

    }
};

和 simple_list_item_multiple_choice 它是 android sdk 的文件:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeightSmall"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
/>
4

1 回答 1

2

哇,这是你第一次遇到的第一个障碍ListView。不用担心。首先了解如何ListView工作,这很重要。否则你无法掌握ListView。简而言之:ListView创建少量 rowView并为每一行使用它们。因此,如果您有 50 个元素,那么在 convertView 为空的情况下,ListView可能只有 10 次被调用。getView()所以简而言之,如果你不getView()为每个位置更新视图内部方法的状态,那真的会很混乱。也请在您的ListView. 它将大大增加滚动并使用更少的资源。更多关于视图持有者模式http://www.jmanzano.es/blog/?p=166

更新:

我说

所以简而言之,如果你不getView()为每个位置更新视图内部方法的状态,那真的会很混乱。

 private SparseBooleanArray checkedPositions = new SparseBooleanArray();// class variable


listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
             if(checkedPositions.get(position)){
                 checkedPositions.put(position, false);
             }else{
                 checkedPositions.put(position, true);
             }
        }

    });

现在在你的getView()

((CheckedTextView)convertView.findViewById(R.id.checkedTextView)).setChecked(checkedPositions.get(position));

根据您的需要调整此代码。或者你可以有一个布尔变量BinLocation来维护检查的位置。但是记住并理解里面保持状态的点getView()

于 2013-07-05T10:48:21.083 回答