简单来说,本篇文章讲解的是:
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>