ListView选中多个item、改变背景、输入框的综合处理

来源:互联网 发布:结构化数据 编辑:程序博客网 时间:2024/05/17 03:26

简单来说,本篇文章讲解的是:

1、listview中选中多个item,并改变其背景颜色;

2、在listview中使用edittext获取输入;

Demo效果图:

这里写图片描述

主要功能:修改并保存输入框的值,选中每个item,背景色变为红色。

activity代码:

package com.carteryu.gala.ui.activity;import android.os.Bundle;import android.widget.ListView;import com.carteryu.gala.R;import com.carteryu.gala.data.model.ListViewModel;import com.carteryu.gala.ui.adapter.ListViewAdapter;import java.util.ArrayList;import butterknife.BindView;public class ListViewDemoActivity extends BaseActivity {    @BindView(R.id.listView)    ListView listView;    private ListViewAdapter listViewAdapter = null;    ArrayList<ListViewModel> listViewModels = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_list_view_demo);        init();    }    private void init() {        //模拟数据        for (int i=0;i<30;i++){            ListViewModel listViewModel = new ListViewModel();            listViewModel.name = "小明";            listViewModel.number = i;            listViewModels.add(listViewModel);        }        initAdapter(listViewModels);    }    /**    *初始化adapter    */    private void initAdapter(ArrayList<ListViewModel> listViewModels) {        if (listViewAdapter == null){            listViewAdapter = new ListViewAdapter(this);            listViewAdapter.setData(listViewModels);            listView.setAdapter(listViewAdapter);        } else {            listViewAdapter.clear();            listViewAdapter.setData(listViewModels);            listViewAdapter.notifyDataSetChanged();        }    }}

R.layout.activity_list_view_demo 布局:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/activity_list_view_demo"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ListView        android:id="@+id/listView"        android:layout_width="300dp"        android:layout_height="match_parent" /></RelativeLayout>

adapter代码:

public class ListViewAdapter extends ArrayAdapter<ListViewModel> {    private Context context;    //定义成员变量mTouchItemPosition,用来记录手指触摸的EditText的位置    private int mTouchItemPosition = -1;    public ListViewAdapter(Context context) {        super(context, 0);        this.context = context;    }    public void setData(ArrayList<ListViewModel> listViewModels){        synchronized (listViewModels){            for (ListViewModel listViewModel : listViewModels){                if (listViewModel != null){                    add(listViewModel);                }            }        }    }    @NonNull    @Override    public View getView(int position, View convertView, ViewGroup parent) {        final int mPosition = position;        ViewHolder viewHolder = null;        final ListViewModel listViewModel = getItem(position);        if (convertView == null){            viewHolder = new ViewHolder();            convertView = LayoutInflater.from(context).inflate(R.layout.list_view_item_layout,null);            viewHolder.linearLayout = (LinearLayout)convertView.findViewById(R.id.linearLayout);            viewHolder.name = (TextView)convertView.findViewById(R.id.tv_name);            viewHolder.number = (EditText)convertView.findViewById(R.id.et_number);            viewHolder.number.setOnTouchListener(new View.OnTouchListener() {                @Override                public boolean onTouch(View v, MotionEvent event) {                    //注意,此处必须使用getTag的方式,不能将position定义为final,写成mTouchItemPosition = position                    mTouchItemPosition = (Integer) v.getTag();                    return false;                }            });            // 让ViewHolder持有一个TextWathcer,动态更新position来防治数据错乱;不能将position定义成final直接使用,必须动态更新            viewHolder.mTextWatcher = new MyTextWatcher();            viewHolder.number.addTextChangedListener(viewHolder.mTextWatcher);            viewHolder.updatePosition(position);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder)convertView.getTag();            //动态更新TextWathcer的position            viewHolder.updatePosition(position);        }        if (listViewModel != null){            viewHolder.name.setText(listViewModel.name);            viewHolder.number.setText(String.valueOf(listViewModel.number));        }        viewHolder.number.setTag(position);        viewHolder.linearLayout.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if (listViewModel != null && listViewModel.selected){                    view.setBackgroundColor(Color.RED);                    listViewModel.selected = false;                } else {                    view.setBackgroundColor(Color.WHITE);                    listViewModel.selected = true;                }            }        });        if (listViewModel.selected){            viewHolder.linearLayout.setBackgroundColor(Color.RED);        } else {            viewHolder.linearLayout.setBackgroundColor(Color.WHITE);        }        if (mTouchItemPosition == position) {            viewHolder.number.requestFocus();            viewHolder.number.setSelection(viewHolder.number.getText().length());        } else {            viewHolder.number.clearFocus();        }        return convertView;    }    class ViewHolder{        LinearLayout linearLayout;        TextView name;        EditText number;        MyTextWatcher mTextWatcher;        //动态更新TextWathcer的position        public void updatePosition(int position) {            mTextWatcher.updatePosition(position);        }    }    class MyTextWatcher implements TextWatcher {        //由于TextWatcher的afterTextChanged中拿不到对应的position值,所以自己创建一个子类        private int mPosition;        public void updatePosition(int position) {            mPosition = position;        }        @Override        public void onTextChanged(CharSequence s, int start, int before, int count) {        }        @Override        public void beforeTextChanged(CharSequence s, int start, int count, int after) {        }        @Override        public void afterTextChanged(Editable s) {            if (!s.toString().equals("")){                getItem(mPosition).number = Integer.valueOf(s.toString());            }        }    }}

R.layout.list_view_item_layout 布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/linearLayout"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal">    <TextView        android:id="@+id/tv_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="30dp"        android:text="小明" />    <EditText        android:id="@+id/et_number"        android:layout_width="50dp"        android:layout_height="wrap_content"        android:layout_marginLeft="30dp"        android:background="@drawable/edittext_background"        android:digits="0123456789"        android:gravity="center"        android:inputType="number"        android:maxLength="3"        android:maxLines="1"        android:text="12" /></LinearLayout>

edittext_background 背景:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>        <shape xmlns:android="http://schemas.android.com/apk/res/android"            android:shape="rectangle">            <solid android:color="#EFEFEF" />            <corners android:radius="3dip" />            <stroke                android:width="0.5px"                android:color="#505050" />        </shape>    </item></layer-list>
1 0