Android 从数组列表联系人到自定义列表视图中删除项目始终删除最新的项目

Android 从数组列表联系人到自定义列表视图中删除项目始终删除最新的项目,android,listview,android-listview,Android,Listview,Android Listview,我有一个自定义列表视图,包含删除按钮和微调器(微调器包含a-E字符)。 我在从自定义列表视图中删除真实行时遇到问题 自定义列表视图代码: public class customListView extends BaseAdapter { public Activity context; ArrayList<MyActivity.UserProperties> userPropertieses; public String[] spinnerValues;

我有一个自定义列表视图,包含删除按钮和微调器(微调器包含a-E字符)。 我在从自定义列表视图中删除真实行时遇到问题

自定义列表视图代码:

public class customListView extends BaseAdapter
{
    public Activity context;
    ArrayList<MyActivity.UserProperties> userPropertieses;
    public String[] spinnerValues;
    public LayoutInflater inflater;

    public  customListView(Activity context, ArrayList<MyActivity.UserProperties> userPropertieses, String[] spinnerArray)
    {
        super();
        this.context = context;
        this.userPropertieses = userPropertieses;
        spinnerValues = spinnerArray;
        this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() { return userPropertieses.size(); }

    @Override
    public Object getItem(int i) { return null; }

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

    class ViewHolder
    {
        Button btnRemove;
        Spinner spinner;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup)
    {
        final ViewHolder holder;
        if (view == null)
        {
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.custom_layout, null);

            holder.spinner = (Spinner) view.findViewById(R.id.spinner);
            holder.btnRemove = (Button) view.findViewById(R.id.bu_Remove);

            // populate spinner
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>
                    (view.getContext(), android.R.layout.simple_spinner_item, spinnerValues);
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            holder.spinner.setFocusable(true);
            holder.spinner.requestFocus();
            holder.spinner.setAdapter(dataAdapter);

            view.setTag(holder);

            // remove user implementation
            holder.btnRemove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.i("custom list view debug", "i = " + i);  // debug. verify i value is correct
                    ((MyActivity) context).deleteUser(i);
                }
            });

        }
        else
            holder = (ViewHolder) view.getTag();

        return view;
    }
}

公共类customListView扩展了BaseAdapter
{
公共活动语境;
ArrayList用户属性;
公共字符串[]spinnerValues;
公共场所;充气机;
公共customListView(活动上下文、ArrayList用户属性、字符串[]SpinneArray)
{
超级();
this.context=上下文;
this.userPropertieses=userPropertieses;
spinnerValues=SpinNerray;
this.inflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u inflater\u SERVICE);
}
@凌驾
public int getCount(){return userPropertieses.size();}
@凌驾
公共对象getItem(inti){returnnull;}
@凌驾
公共长getItemId(int i){返回0;}
类视图持有者
{
按钮btnRemove;
纺纱机;
}
@凌驾
公共视图getView(最终int i、视图视图、视图组视图组)
{
最终持票人;
如果(视图==null)
{
holder=新的ViewHolder();
视图=充气机。充气(R.layout.custom_layout,null);
holder.spinner=(spinner)view.findViewById(R.id.spinner);
holder.btnRemove=(按钮)view.findViewById(R.id.bu_Remove);
//填充微调器
ArrayAdapter dataAdapter=新的ArrayAdapter
(view.getContext(),android.R.layout.simple\u微调器\u项,微调值);
dataAdapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉项);
保持器.微调器.设置聚焦(真);
holder.spinner.requestFocus();
支架.微调器.设置适配器(数据适配器);
视图.设置标签(支架);
//删除用户实现
holder.btnRemove.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Log.i(“自定义列表视图调试”,“i=“+i”);//调试。验证i值是否正确
((MyActivity)context.deleteUser(i);
}
});
}
其他的
holder=(ViewHolder)view.getTag();
返回视图;
}
}
我的主要活动代码如下所示:

public class MyActivity extends Activity
{
    ListView listView;
    ArrayList<UserProperties> userProperties = new ArrayList<UserProperties>();
    customListView adapter;
    SensorManager sensorManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        for (int i = 0; i<5; i++) {
            userProperties.add(new UserProperties());
        }

        listView = (ListView) findViewById(R.id.listView);
        String[] spinnerValues = new String[] {"A", "B", "C", "D", "E"};
        adapter = new customListView(MyActivity.this, userProperties, spinnerValues);
        listView.setAdapter(adapter);
    }

    public void deleteUser (int index)
    {
        Log.i("debug", "Removing item " + index); // the index is really true and the true node deleting from the ArrayList but somehow the latest delete from the UI
        userProperties.remove(index);
        adapter.notifyDataSetChanged();
    }
}
公共类MyActivity扩展活动
{
列表视图列表视图;
ArrayList userProperties=新的ArrayList();
自定义列表视图适配器;
传感器管理器传感器管理器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
sensorManager=(sensorManager)getSystemService(传感器服务);
对于(int i=0;i
此行将始终从
列表视图中删除第一个值

你可以用

查看代码是否有帮助(它基本上是一个
ListActivity
,带有一个自定义适配器,用于保存选中项目的状态(+不同的背景)):

public类选择扩展了ListActivity{
private ArrayList mItems=new ArrayList();
私有选择适配器mAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
对于(int i=0;i<24;i++){
添加(“名称”+i);
}
//R.layout.adapters\u cabselection\u行是线性布局(带绿色
//包装ImageView和TextView的背景(#99cc00))
mAdapter=新选择适配器(此,
R.layout.adapters\u cabselection\u row,R.id.the\u text,mItems);
setListAdapter(mAdapter);
getListView().setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE\u MODE);
getListView().SetMultichoiceModelListener(新的MultichoiceModelListener()){
私有整数nr=0;
@凌驾
公共布尔onCreateActionMode(ActionMode模式,菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。右菜单,菜单);
返回true;
}
@凌驾
公共布尔onPrepareActionMode(操作模式,菜单){
返回false;
}
@凌驾
公共布尔值onActionItemClicked(ActionMode模式,菜单项){
StringBuilder sb=新的StringBuilder();
设置位置=mAdapter.getCurrentCheckedPosition();
用于(整数位置:位置){
sb.追加(“+pos+”,”);
}               
开关(item.getItemId()){
案例R.id.edit_条目:
Toast.makeText(CABSelection.this,“编辑的条目:”+sb.toString(),
吐司。长度(短)。show();
打破
案例R.id.delete_条目:
Toast.makeText(CABSelection.this,“删除的条目:”+sb.toString(),
吐司。长度(短)。show();
打破
案例R.id.完成它:
nr=0;
mAdapter.clearSelection();
Toast.makeText(CABSelection.this,“完成CAB!”,
吐司。长度(短)。show();
mode.finish();
}
返回false;
}
@凌驾
公共void onDestroyActionMode(ActionMode模式){
nr=0;
mAdapter.clearSelection();
}
@凌驾
已更改MCheckedStateChanged(操作模式,
int位置,长id,布尔值已选中){
((MyActivity) context).deleteUser(i);
public class CABSelection extends ListActivity {

    private ArrayList<String> mItems = new ArrayList<String>();
    private SelectionAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        for (int i = 0; i < 24; i++) {
            mItems.add("Name" + i);
        }
        // R.layout.adapters_cabselection_row is a LinearLayout(with green
        // background(#99cc00)) that wraps an ImageView and a TextView
        mAdapter = new SelectionAdapter(this,
                R.layout.adapters_cabselection_row, R.id.the_text, mItems);
        setListAdapter(mAdapter);
        getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() {

            private int nr = 0;

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                MenuInflater inflater = getMenuInflater();
                inflater.inflate(R.menu.cabselection_menu, menu);
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                StringBuilder sb = new StringBuilder();
                Set<Integer> positions = mAdapter.getCurrentCheckedPosition();
                for (Integer pos : positions) {
                    sb.append(" " + pos + ",");
                }               
                switch (item.getItemId()) {
                case R.id.edit_entry:
                    Toast.makeText(CABSelection.this, "Edited entries: " + sb.toString(),
                            Toast.LENGTH_SHORT).show();
                    break;
                case R.id.delete_entry:
                    Toast.makeText(CABSelection.this, "Deleted entries : " + sb.toString(),
                            Toast.LENGTH_SHORT).show();
                    break;
                case R.id.finish_it:
                    nr = 0;
                    mAdapter.clearSelection();
                    Toast.makeText(CABSelection.this, "Finish the CAB!",
                            Toast.LENGTH_SHORT).show();
                    mode.finish();
                }
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
                nr = 0;
                mAdapter.clearSelection();
            }

            @Override
            public void onItemCheckedStateChanged(ActionMode mode,
                    int position, long id, boolean checked) {
                if (checked) {
                    nr++;
                    mAdapter.setNewSelection(position, checked);                    
                } else {
                    nr--;
                    mAdapter.removeSelection(position);                 
                }
                mode.setTitle(nr + " rows selected!");

            }

        });
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        l.setItemChecked(position, !mAdapter.isPositionChecked(position));
    }

    private class SelectionAdapter extends ArrayAdapter<String> {

        private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>();

        public SelectionAdapter(Context context, int resource,
                int textViewResourceId, List<String> objects) {
            super(context, resource, textViewResourceId, objects);
        }

        public void setNewSelection(int position, boolean value) {
            mSelection.put(position, value);
            notifyDataSetChanged();
        }

        public boolean isPositionChecked(int position) {
            Boolean result = mSelection.get(position);
            return result == null ? false : result;
        }

        public Set<Integer> getCurrentCheckedPosition() {
            return mSelection.keySet();
        }

        public void removeSelection(int position) {
            mSelection.remove(position);
            notifyDataSetChanged();
        }

        public void clearSelection() {
            mSelection = new HashMap<Integer, Boolean>();
            notifyDataSetChanged();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView, parent);//let the adapter handle setting up the row views
            v.setBackgroundColor(Color.parseColor("#99cc00")); //default color
            if (mSelection.get(position) != null) {
                v.setBackgroundColor(Color.RED);// this is a selected position so make it red
            }
            return v;
        }

    }

}
adapter = new MyListAdapter(this);
lv = (ListView) findViewById(android.R.id.list);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
    AlertDialog.Builder adb=new AlertDialog.Builder(MyActivity.this);
    adb.setTitle("Delete?");
    adb.setMessage("Are you sure you want to delete " + position);
    final int positionToRemove = position;
    adb.setNegativeButton("Cancel", null);
    adb.setPositiveButton("Ok", new AlertDialog.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            MyDataObject.remove(positionToRemove);
            adapter.notifyDataSetChanged();
        }});
    adb.show();
    }
});
 getView(final int i,
 holder.btnRemove.setTag(i);
 int position = v.getTag(); 
 ..deleteUser(position);