您的位置:首页 > 其它

做项目时一个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);}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: