在ListView上选择多个项目,选择错误的项目

时间:2015-05-28 14:40:21

标签: android listview android-fragments android-listview

我在ListView上有Fragment的代码。我的目标是在列表中选择多个项目并突出显示它们。 我的代码会突出显示该项目,但是当我滚动列表时,会突出显示更多项目,当我再次向上滚动时,会再次突出显示更多项目,每当我滚动时,它会一遍又一遍地突出显示并更改为默认状态列表。我不知道为什么会这样。 注意:我已经尝试过CHOICE_MODE_SINGLE,CHOICE_MODE_MULTIPLE,CHOICE_MODE_MULTIPLE_MODAL,我也尝试过MultiChoiceModeListener,但我的应用程序应该使用9以上的API。这对我来说不是解决方案。

我的片段(不想使用ListFragment)

 public class InventarioFragment extends Fragment {

ListView listInventario;
public static InventarioFragment newInstance()
{
    return new InventarioFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
    final View view  = inflater.inflate(R.layout.fragment_inventario_list,container,false);
    listInventario = (ListView) view.findViewById(R.id.list_inv);

    listInventario.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {


            v.setBackgroundColor(Color.BLUE);

        }
    });
    return view;
}
}

这是我片段的XML(请注意,我正在为列表中的项目使用数组)。

My Fragment XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:orientation="horizontal"
        android:weightSum="1">

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5">
        <ImageButton
            android:id="@+id/ib_cancel_inventario"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:background="@drawable/btn_cancel"
            android:layout_centerInParent="true"/>

        </RelativeLayout>
        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5">
            <ImageButton
                android:id="@+id/ib_submit_inventario"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:background="@drawable/btn_ok"
                android:layout_centerInParent="true"/>

        </RelativeLayout>


    </LinearLayout>
    <TextView

        android:layout_width="fill_parent"
        android:layout_height="20dp"
        android:background="#DF0101"/>

    <ListView
        android:id="@+id/list_inv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:entries="@array/list_inventario"

        >

    </ListView>

</LinearLayout>

</LinearLayout>

我没有使用和适配器,因为我从默认数组中设置了列表项。

对不起我的英语,我希望你能帮助我。 (我无法上传图片,因为我还没有足够的声誉)。

1 个答案:

答案 0 :(得分:0)

您可以使用以下适配器来实现目标。

删除Listview中的android:entries="@array/list_inventario",并在XML中添加如下所示的选择模式。

<ListView 
    android:id="@+id/list_inv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:choiceMode="multipleChoice">
</ListView>

InventarioFragment

public class InventarioFragment extends Fragment {

private Activity activity;
private ListView listInventario;
private String[] inventatioItems;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.activity=activity;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view  = inflater.inflate(R.layout.fragment_inventario_list,container,false);
    listInventario = (ListView) view.findViewById(R.id.list_inv);
    inventatioItems=getResources().getStringArray(R.array.list_inventario);

    InverntarioAdapter adapter=new InverntarioAdapter(activity);
    listInventario.setAdapter(adapter);
    listInventario.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View v, int pos, long arg3) {
            listInventario.setItemChecked(pos, true);;  
        }
    });

    return view;
}


private class InverntarioAdapter extends BaseAdapter{

    private LayoutInflater inflator;

    public InverntarioAdapter(Context context){
        inflator=(LayoutInflater) context.getSystemService(activity.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return inventatioItems.length;
    }

    @Override
    public Object getItem(int position) {
        return inventatioItems[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        TextView tv;
        if(convertView == null){
            convertView=inflator.inflate(android.R.layout.simple_list_item_1, null);
            convertView.setBackground(getResources().getDrawable(R.drawable.selector_background));
        }
        tv=(TextView) convertView.findViewById(android.R.id.text1);             
        tv.setText(inventatioItems[position]);

        if(listInventario.isItemChecked(position)){
            //background Color of selected items
            convertView.setBackgroundColor(Color.BLUE);
        }
        else{
            convertView.setBackgroundColor(Color.WHITE);
        }

        return convertView;
    }
}
}