做项目时一个listview 里面嵌套ediTtext 滑动之后 保存数据

这个项目做的时间 我们的需求是做一个填空题来做的,当时感觉非常难,现在回头看下实际也挺简单的。算了还是记录下吧,也有些难点。项目中的数据比较复杂 所以我自己写了一个小的Demo。

Adapter里面

public class MyAdapter extends BaseAdapter {
    private Context mCtx;
    private List<ItemBean> mList = new ArrayList<>();
    //这里使用treeMap不适用hashMap是因为 treeMap里面是有序的   而hashMap是乱序(这里一定要记住 这是一个item的 数据,而不是整体的  这里总是弄迷)
    TreeMap<Integer, DateViewForPosition> treeMapDate = new TreeMap<>();
    ArrayList<QuestionNumberCell> questionNumberCells = null;
    TreeMap<String, String> emptyDataList = null;
    DateViewForPosition dataView;

    public MyAdapter(Context context, List<ItemBean> list) {
        this.mCtx = context;
        this.mList = list;
    }

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

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Holder holder;
        if (convertView == null) {
            holder = new Holder();
            convertView = LayoutInflater.from(mCtx).inflate(R.layout.item, null);
            holder.title = (TextView) convertView.findViewById(R.id.question_title_tv);
            holder.answerLayout = (LinearLayout) convertView.findViewById(R.id.answer_layout);
            convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();
        }
        ItemBean bean = mList.get(position);
        holder.title.setText(bean.getContent());

        if (treeMapDate.get(position) == null) {
            dataView = new DateViewForPosition();
        } else {
            dataView = treeMapDate.get(position);//从里面获取保存的答案
        }

        if (dataView.getQuestionNumberCellsDate().size() != 0 && dataView.getQuestionNumberCellsNum().size() != 0) {
            questionNumberCells = dataView.getQuestionNumberCellsNum();
            emptyDataList = dataView.getQuestionNumberCellsDate();
        } else {
            questionNumberCells = new ArrayList<>();
            emptyDataList = new TreeMap<>();
            dataView.setQuestionNumberCellsDate(emptyDataList);
            dataView.setQuestionNumberCellsNum(questionNumberCells);
            treeMapDate.put(position, dataView);
        }

        holder.answerLayout.removeAllViews();//每次进来都是不同的item了  所以就要清空
        int emptyNumber = bean.getEmptemNum();//框框的数量
        if (questionNumberCells.size() <= 0) {//没有数据,需要绘制边框      先针对框框进行处理
            int number = 1, viewIndex = 0;
            for (int i = 0; i < emptyNumber; i = i + 2) {
                QuestionNumberCell questionNumberCell = new QuestionNumberCell(mCtx);
                questionNumberCell.setOnChangeListener(new DataChangeListener());
                questionNumberCell.init(number);//传进去num是框前面的数字
                questionNumberCell.setPosition(position);
                questionNumberCell.setIndex(viewIndex);//下标
                holder.answerLayout.addView(questionNumberCell);
                number += 2;
                if (i != 0 && emptyNumber - i == 1 && emptyNumber % i == 1) {//单个的(除了1                    questionNumberCell.disableRightView();
                    emptyDataList.put(position + "_" + viewIndex + "_" + "0", ""); //这里这样操作 是为了下次绘制的时候没有点击的框没输入的 没被存起来
                } else if (emptyNumber == 1) {//一个的
                    questionNumberCell.disableRightView();
                    emptyDataList.put(position + "_" + viewIndex + "_" + "0", "");
                } else {//双个的
                    emptyDataList.put(position + "_" + viewIndex + "_" + "0", "");
                    emptyDataList.put(position + "_" + viewIndex + "_" + "1", "");
                }
                questionNumberCells.add(questionNumberCell);
                viewIndex++;
            }
        } else {
            holder.answerLayout.removeAllViews();
            for (int i = 0; i < questionNumberCells.size(); i++) {
                holder.answerLayout.addView(questionNumberCells.get(i));
            }
        }
        //在针对数据进行处理
        if (emptyDataList.size() > 0) {  //有数据
            int index = 0;
            for (int i = 0; i < emptyNumber; i = i + 2) {
                QuestionNumberCell questionNumberCell = questionNumberCells.get(index);
                if (i != 0 && emptyNumber - i == 1 && emptyNumber % i == 1) {//单个的(除了1                    questionNumberCell.setAnswer(emptyDataList.get(position + "_" + index + "_" + "0"));
                } else if (emptyNumber == 1) {//一个的
                    questionNumberCell.setAnswer(emptyDataList.get(position + "_" + index + "_" + "0"));
                } else {//双个的
                    questionNumberCell.setAllAnswer(emptyDataList.get(position + "_" + index + "_" + "0"), emptyDataList.get(position + "_" + index + "_" + "1"));
                }
                index++;
            }
        } else {
            int index = 0;
            for (int i = 0; i < emptyNumber; i = i + 2) {
                QuestionNumberCell questionNumberCell = questionNumberCells.get(index);
                if (i != 0 && emptyNumber - i == 1 && emptyNumber % i == 1) {//单个的(除了1                    questionNumberCell.setAnswer("");
                } else if (emptyNumber == 1) {//一个的
                    questionNumberCell.setAnswer("");
                } else {//双个的
                    questionNumberCell.setAllAnswer("", "");
                }
                index++;
            }
        }
        return convertView;
    }

    //监听输入框 失去焦点的事件
    public class DataChangeListener implements InputDataChangeListener {
        @Override                        //index是第几行  state代表 左边的框为0  右边为1
        public void onDataChange(int position, int index, String data, int state) {
            Log.d("ydd", "onDataChange============ position =  " + position + "index = " + index + "date=" + data + "state=" + state);
            DateViewForPosition dateViewForPosition = treeMapDate.get(position);
            TreeMap<String, String> questionNumberCellsDate = dateViewForPosition.getQuestionNumberCellsDate();
            questionNumberCellsDate.put(position + "_" + index + "_" + state, data);
        }
    }

    public class Holder {
        public TextView title;
        public LinearLayout answerLayout;
    }
}
 item: 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <TextView
        android:text="123111111"
        android:layout_marginLeft="30dp"
        android:id="@+id/question_title_tv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center_vertical"
        android:textSize="15sp"/>

    <!--这是填空题的layout-->
    <LinearLayout
        android:id="@+id/answer_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:layout_marginTop="15dp"
        android:orientation="vertical"
        android:visibility="visible">
    </LinearLayout>
</LinearLayout>

Activity里面:

/**
 * Created by ydd.
 * Date: 2016-06-14
 */
public class ListViewForHomeWorkActivity extends Activity {
    ListView lsitview;
    List<ItemBean> homeWorkList;
    MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_homework_layout);
        initView();
        initDate();
    }

    private void initView() {
        homeWorkList = new ArrayList();
        adapter = new MyAdapter(this, homeWorkList);
        lsitview = (ListView) findViewById(R.id.lsitview);
        lsitview.setAdapter(adapter);
        lsitview.setOnScrollListener(new AbsListView.OnScrollListener() {//监听listview的滚动事件
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) { //滚动就让框框失去焦点 listview的到焦点 进而保存输入的数据
                lsitview.setFocusable(true);
                lsitview.setFocusableInTouchMode(true);
                lsitview.requestFocus();
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });
    }

    private void initDate() {
        homeWorkList.add(new ItemBean(1, "这是第" + 1 + "道题目,1个框框"));
        homeWorkList.add(new ItemBean(3, "这是第" + 2 + "道题目,3个框框"));
        homeWorkList.add(new ItemBean(2, "这是第" + 3 + "道题目,2个框框"));
        homeWorkList.add(new ItemBean(5, "这是第" + 4 + "道题目,5个框框"));
        homeWorkList.add(new ItemBean(3, "这是第" + 5 + "道题目,3个框框"));
        homeWorkList.add(new ItemBean(1, "这是第" + 6 + "道题目,1个框框"));
        homeWorkList.add(new ItemBean(2, "这是第" + 7 + "道题目,2个框框"));
        homeWorkList.add(new ItemBean(4, "这是第" + 8 + "道题目,4个框框"));
        homeWorkList.add(new ItemBean(7, "这是第" + 9 + "道题目,7个框框"));
        homeWorkList.add(new ItemBean(2, "这是第" + 10 + "道题目,2个框框"));
        homeWorkList.add(new ItemBean(1, "这是第" + 11 + "道题目,1个框框"));
        homeWorkList.add(new ItemBean(4, "这是第" + 12 + "道题目,4个框框"));
        homeWorkList.add(new ItemBean(6, "这是第" + 13 + "道题目,6个框框"));
        homeWorkList.add(new ItemBean(2, "这是第" + 14 + "道题目,2个框框"));
        homeWorkList.add(new ItemBean(1, "这是第" + 15 + "道题目,1个框框"));
        adapter.notifyDataSetChanged();
    }
}

QuestionNumberCellli:

package list_for_homework;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import baidumaps.iasu.com.map.R;


public class QuestionNumberCell extends LinearLayout {

    private TextView numberTv, rightNumberTv;
    private EditText answerEt, rightAnswerEt;

    private int position;
    private int index;

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    private InputDataChangeListener changeListener;
    public QuestionNumberCell(Context context) {
        super(context);
        init();
    }

    public QuestionNumberCell(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public QuestionNumberCell(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        LayoutInflater.from(getContext()).inflate(R.layout.evaluation_question_number_item, this, true);

        numberTv = (TextView) findViewById(R.id.question_left_number_tv);
        answerEt = (EditText)findViewById(R.id.question_left_number_et);

        rightNumberTv= (TextView)findViewById(R.id.question_right_number_tv);
        rightAnswerEt= (EditText)findViewById(R.id.question_right_number_et);

        answerEt.setOnFocusChangeListener(leftOnFocusChangeListener);
        rightAnswerEt.setOnFocusChangeListener(rightOnFocusChangeListener);
    }

    public void setOnChangeListener(InputDataChangeListener listener)
    {
        changeListener = listener;
    }


    OnFocusChangeListener leftOnFocusChangeListener = new OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            String data = ((EditText) v).getText().toString().trim();
            if (!hasFocus ) {
                changeListener.onDataChange(getPosition(),getIndex(),data, 0);
            }else
            {
                ((EditText) v).setSelection(data.length());
            }
        }
    };

    OnFocusChangeListener rightOnFocusChangeListener = new OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            String data = ((EditText) v).getText().toString().trim();
            if (!hasFocus ) {
                changeListener.onDataChange(getPosition(),getIndex(),data,1);
            }else
            {
                ((EditText) v).setSelection(data.length());
            }
        }
    };

    public void init(int number)
    {
        numberTv.setText(number+"");
        rightNumberTv.setText((++number) + "");
    }

    public void setAnswerWidth(int width,int height)
    {
        answerEt.setWidth(width);
        answerEt.setHeight(height);
    }

    public void disableRightView()
    {
        rightNumberTv.setVisibility(View.INVISIBLE);
        rightAnswerEt.setVisibility(View.INVISIBLE);
    }

    public void setAnswer(String info)
    {
        answerEt.setText(info);
        answerEt.setSelection(answerEt.getText().length());
    }

    public void setAllAnswer(String leftInfo, String rightInfo)
    {
        answerEt.setText(leftInfo);
        rightAnswerEt.setText(rightInfo);
        answerEt.setSelection(answerEt.getText().length());
        rightAnswerEt.setSelection(rightAnswerEt.getText().length());
    }

    public String getAnswer()
    {
        return answerEt.getText().toString().trim();
    }

    public String getAllAnswer()
    {
        String leftAnswer = answerEt.getText().toString().trim();
        String rightAnswer = rightAnswerEt.getText().toString().trim();
        if(leftAnswer.length() > 0 && rightAnswer.length() > 0)
            return answerEt.getText().toString().trim()+"<br/>"+rightAnswerEt.getText().toString().trim()+"<br/>";
        else
            return "";
    }

    public boolean isAllAnswerInput()
    {
        return answerEt.getText().toString().length() > 0 && rightAnswerEt.getText().toString().length() > 0;
    }

    public boolean isAnswerInput()
    {
        return answerEt.getText().toString().length() > 0 ;
    }
}

evaluation_question_number_item:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="35dp"
              android:gravity="center"
              android:orientation="horizontal"
              android:layout_marginLeft="10dp"
              android:layout_marginRight="10dp"
              android:layout_marginBottom="10dp">

    <TextView
        android:id="@+id/question_left_number_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/black_66"
        android:textSize="14sp"
        android:text="1"/>

    <EditText
        android:id="@+id/question_left_number_et"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:layout_marginLeft="13dp"
        android:singleLine="true"
        android:background="@drawable/edit_green_line"
        android:textSize="16sp"
        android:textColor="@color/black_66"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"/>

    <TextView
        android:id="@+id/question_right_number_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:textColor="@color/black_66"
        android:textSize="14sp"
        android:text="2"/>

    <EditText
        android:id="@+id/question_right_number_et"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:singleLine="true"
        android:layout_marginLeft="13dp"
        android:textSize="16sp"
        android:background="@drawable/edit_green_line"
        android:textColor="@color/black_66"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"/>
</LinearLayout>

DateViewForPosition:

public class DateViewForPosition {//
    TreeMap<String, String> questionNumberCellsDate  = new TreeMap<>();//每个框框的数据   key positionindexstate组合的一个string   value是填写的数据
    ArrayList<QuestionNumberCell> questionNumberCellsNum = new ArrayList<>();//这里存储postion对应的框框的list
    public TreeMap<String, String> getQuestionNumberCellsDate() {
        return questionNumberCellsDate;
    }

    public void setQuestionNumberCellsDate(TreeMap<String, String> questionNumberCellsDate) {
        this.questionNumberCellsDate = questionNumberCellsDate;
    }


    public ArrayList<QuestionNumberCell> getQuestionNumberCellsNum() {
        return questionNumberCellsNum;
    }

    public void setQuestionNumberCellsNum(ArrayList<QuestionNumberCell> questionNumberCellsNum) {
        this.questionNumberCellsNum = questionNumberCellsNum;
    }
}

InputDataChangeListener:

public interface InputDataChangeListener {
     void onDataChange(int position, int index, String data, int state);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值