这个项目做的时间 我们的需求是做一个填空题来做的,当时感觉非常难,现在回头看下实际也挺简单的。算了还是记录下吧,也有些难点。项目中的数据比较复杂 所以我自己写了一个小的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是 position和index和state组合的一个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); }