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

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

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>

猜你喜欢

转载自blog.csdn.net/carter_yu/article/details/64130621
今日推荐