做项目时一个listview 里面嵌套ediTtext 滑动之后 保存数据
2016-06-15 14:37
615 查看
这个项目做的时间 我们的需求是做一个填空题来做的,当时感觉非常难,现在回头看下实际也挺简单的。算了还是记录下吧,也有些难点。项目中的数据比较复杂 所以我自己写了一个小的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"><TextViewandroid: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--><LinearLayoutandroid: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;@Overrideprotected 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的滚动事件@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) { //滚动就让框框失去焦点 listview的到焦点 进而保存输入的数据lsitview.setFocusable(true);lsitview.setFocusableInTouchMode(true);lsitview.requestFocus();}@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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/>";elsereturn "";}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"><TextViewandroid: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"/><EditTextandroid: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"/><TextViewandroid: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"/><EditTextandroid: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是 position和index和state组合的一个string value是填写的数据ArrayList<QuestionNumberCell> questionNumberCellsNum = new ArrayList<>();//这里存储postion对应的框框的listpublic 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);}
相关文章推荐
- JAVA书写规范、命名规范
- 面试题29 数组中超过一半的数字
- 移动开发(webapp)过程中的小细节总结
- Postman 安装 & 资料
- 基础理解2:CSS3按钮动画
- python开发总结
- gridview易忘点集合
- LightOJ 1403 Air Raid 最小路径覆盖
- Rotate Array
- 【必须学好】字典、哈希与Map
- 【Unity】按住鼠标右键,移动场景内镜头(适用于塔防等游戏视角)
- MySQL 常用函数 加密函数
- Cocos2d-Lua之类型及类型转换
- jvm如何判断实例对象是否需要回收
- 微信带参数二维码php
- 使用iOS控件UICollectionView生成可拖动的桌面
- android.util.AndroidRuntimeException: Calling startActivity from outside of an Activity context
- R语言选择特定的行,对某一列排序
- Android5.0录屏
- springMVC配置文件位置及名称