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
- ListView选中多个item、改变背景、输入框的综合处理
- listView选中后item背景改变
- ListView点击或选中item改变背景
- ListView点击或选中item改变背景
- 设置listview的item选中背景
- gridview,点击选中一个或多个item,并改变item背景颜色,字体等
- ListView点击item改变背景,重新选中另一项刷新,默认是选中第一项的状态
- listview选中item背景变色
- 改变选中的ListView Item数据颜色直到选中下一个
- 有关ListView 多个item选中的问题
- ListView 处理Item的选中状态(checked)
- android tabhost 每个item的选中改变背景,和标题
- android tabhost 每个item的选中改变背景,和标题
- ListView Item 选中时 改变 TextView 的字体颜色
- 改变listview中item选中时文字的颜色
- 改变listview中item选中时文字的颜色
- 改变listview中item选中时文字的颜色
- Android的ListView子Item选中改变TextView字体颜色
- tcp/ip1
- javaWeb学习_04:js的基本对象
- javascript在 html 文档中的执行顺序
- 端口占用
- mysql基础的一些注意事项
- ListView选中多个item、改变背景、输入框的综合处理
- android-webView 定位功能开启
- Tomcat服务器的安装和启动
- 数据机构1
- 《Java高并发程序设计》学习 --5.3 并行模式之生产者-消费者模式
- TCP/IP 如何断开连接
- CSS样式预设
- 简单数学(关于素数判断和因数分解)
- android-webView与H5的调用