Java Android RecyclerView';s EditText在输入数据后交换其位置并向下滚动
我有一个由Java Android RecyclerView';s EditText在输入数据后交换其位置并向下滚动,java,android,android-edittext,android-recyclerview,Java,Android,Android Edittext,Android Recyclerview,我有一个由TextView和EditText组成的RecyclerView,对于TextView和RecyclerView来说,我的工作非常好,但是对于EditText,如果我在第一个单元格中输入值并继续输入其他单元格并滚动,则上面输入的值将不存在 public class Assesment_MarkcardAdapter extends RecyclerView.Adapter<Assesment_MarkcardAdapter.ContactViewHolder> {
TextView
和EditText
组成的RecyclerView
,对于TextView
和RecyclerView
来说,我的工作非常好,但是对于EditText
,如果我在第一个单元格中输入值并继续输入其他单元格并滚动,则上面输入的值将不存在
public class Assesment_MarkcardAdapter extends RecyclerView.Adapter<Assesment_MarkcardAdapter.ContactViewHolder> {
private String[] mDataset;
public Assesment_MarkcardAdapter(String[] myDataset)
{
mDataset = myDataset;
}
private List<Assesment_cardinfo> contactList;
private static String LOG_TAG = "Assesment_MarkcardAdapter";
public Assesment_MarkcardAdapter(List<Assesment_cardinfo> contactList) {
this.contactList = contactList;
}
@Override
public int getItemCount() {
return contactList.size();
}
@Override
public void onBindViewHolder(ContactViewHolder contactViewHolder, int i)
{
mDataset = new String[contactList.size()];
Assesment_cardinfo ci = contactList.get(i);
contactViewHolder.studentname.setText(ci.getStudentname());
contactViewHolder.studentid.setText(ci.getStudentid());
contactViewHolder.grade.setText(ci.getGrade());
contactViewHolder.improvement.setText(ci.getImprovements());
contactViewHolder.grade.setTag(ci);
contactViewHolder.improvement.setTag(ci);
contactViewHolder.myCustomEditTextListener.updatePosition(i);
contactViewHolder.myCustomEditTextListener2.updatePosition2(i);
//contactViewHolder.grade.setText(mDataset[i]);
}
@Override
public Assesment_MarkcardAdapter.ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.assesment_markcard, viewGroup, false);
return new ContactViewHolder(itemView , new MyCustomEditTextListener(),new MyCustomEditTextListener2());
}
public static class ContactViewHolder extends RecyclerView.ViewHolder {
public MyCustomEditTextListener myCustomEditTextListener;
public MyCustomEditTextListener2 myCustomEditTextListener2;
protected TextView studentname;
protected TextView studentid;
protected EditText grade;
protected EditText improvement;
public ContactViewHolder(View v, MyCustomEditTextListener myCustomEditTextListener, MyCustomEditTextListener2 myCustomEditTextListener2 ) {
super(v);
studentname = (TextView) v.findViewById(R.id.txt_student_name);
studentid = (TextView) v.findViewById(R.id.txt_student_id);
grade = (EditText) v.findViewById(R.id.edtxt_grade);
this.myCustomEditTextListener = myCustomEditTextListener;
grade.addTextChangedListener(myCustomEditTextListener);
improvement = (EditText) v.findViewById(R.id.edtxt_improvement);
this.myCustomEditTextListener2 = myCustomEditTextListener2;
improvement.addTextChangedListener(myCustomEditTextListener2);
}
}
private class MyCustomEditTextListener implements TextWatcher
{
private int position;
public void updatePosition(int position)
{
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
// no op
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
contactList.get(position).setGrade(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
// no op
}
}
private class MyCustomEditTextListener2 implements TextWatcher
{
private int position;
public void updatePosition2(int position)
{
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
// no op
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
contactList.get(position).setImprovements(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
// no op
}
}
public List<Assesment_cardinfo> getStudentLists()
{
return contactList;
}
}
public class assessment\u markcardapter扩展了RecyclerView.Adapter{
私有字符串[]mDataset;
公共评估\u MarkcardAdapter(字符串[]myDataset)
{
mDataset=myDataset;
}
私人名单联系人名单;
私有静态字符串LOG\u TAG=“assessment\u markcardapter”;
公共评估\u MarkcardAdapter(列表联系人列表){
this.contactList=联系人列表;
}
@凌驾
public int getItemCount(){
返回contactList.size();
}
@凌驾
BindViewHolder上的公共无效(ContactViewHolder ContactViewHolder,int i)
{
mDataset=新字符串[contactList.size()];
assessment_cardinfo ci=联系人列表。获取(i);
contactViewHolder.studentname.setText(ci.getStudentname());
contactViewHolder.studentid.setText(ci.getStudentid());
contactViewHolder.grade.setText(ci.getGrade());
contactViewHolder.improvement.setText(ci.getImprovements());
contactViewHolder.grade.setTag(ci);
contactViewHolder.improvement.setTag(ci);
contactViewHolder.myCustomEditTextListener.updatePosition(i);
contactViewHolder.myCustomEditTextListener2.updatePosition2(i);
//contactViewHolder.grade.setText(mDataset[i]);
}
@凌驾
公共评估\u MarkcardAdapter.ContactViewHolder onCreateViewHolder(视图组视图组,int i)
{
视图项视图=布局调整器。
来自(viewGroup.getContext())。
充气(R.layout.Assessment_markcard,viewGroup,false);
返回新的ContactViewHolder(itemView,新的MyCustomEditTextListener(),新的MyCustomEditTextListener2());
}
公共静态类ContactViewHolder扩展了RecyclerView.ViewHolder{
公共MyCustomEditTextListener MyCustomEditTextListener;
公共MyCustomEditTextListener2 MyCustomEditTextListener2;
受保护的文本视图studentname;
受保护的文本视图studentid;
保护文本等级;
文本改进;
公共联系人视图持有者(视图v、MyCustomEditTextListener、MyCustomEditTextListener、MyCustomEditTextListener2、MyCustomEditTextListener2){
超级(五);
studentname=(TextView)v.findViewById(R.id.txt\u student\u name);
studentid=(TextView)v.findViewById(R.id.txt\u student\u id);
等级=(编辑文本)v.findViewById(R.id.edtxt_等级);
this.myCustomEditTextListener=myCustomEditTextListener;
grade.addTextChangedListener(myCustomEditTextListener);
改进=(EditText)v.findViewById(R.id.edText_改进);
this.myCustomEditTextListener2=myCustomEditTextListener2;
改进.addTextChangedListener(myCustomEditTextListener2);
}
}
私有类MyCustomEditTextListener实现TextWatcher
{
私人职位;
公共无效更新位置(整数位置)
{
这个位置=位置;
}
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i2,int i3)
{
//无操作
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i2,int i3)
{
contactList.get(position.setGrade(charSequence.toString());
}
@凌驾
public void PostTextChanged(可编辑){
//无操作
}
}
私有类MyCustomEditTextListener2实现TextWatcher
{
私人职位;
公共无效更新位置2(内部位置)
{
这个位置=位置;
}
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i2,int i3)
{
//无操作
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i2,int i3)
{
contactList.get(position.setImprovements(charSequence.toString());
}
@凌驾
public void PostTextChanged(可编辑){
//无操作
}
}
公共列表GetStudentList()
{
返回联系人列表;
}
}
将输入字段放在回收器视图中真的很糟糕。尝试重新构建您的UI设计。回收器视图应始终具有只读字段。即使这样,您也可以尝试动态创建视图并将其添加到rooot布局中。
例如,有一个XML文件,其中线性布局将是您的根。再创建一个XML文件,并继续将此模板添加到根视图中
可能是这样的
这将是您的根布局instear od recycler视图
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
//Create a template layout.You need to add the property i am just skippint it
<LinearLayout>
<TextView/>
<EditText/>
// In you activity write a method to create a view dynamically from template and add it to your root Layout.
LinearLayout rootLayout=(LinearLayout)findViewById(R.id.container);
createChilds(rootLayout);
private void createChilds(LinearLayout rootLayout)
{
LinearLayout childContainer=(LinearLayout)LayoutInflater.from(context).inflate(R.layout.template_layout,null);
TextView tv=childContainer.findViewById(R.id.textviewid);
EditText et=childContainer.findViewById(R.id.edittextviewid);
// you can register for textwatcher for edit text if you want
//Add it to roolayout
rootLayout.addView(childContainer);
}
//创建一个模板布局。你需要添加属性,我只是跳过它
//在“活动”中,编写一个从模板动态创建视图的方法,并将其添加到根布局中。
LinearLayout rootLayout=(LinearLayout)findViewById(R.id.container);
createChilds(rootLayout);
私有void createChilds(LinearLayout rootLayout)
{
LinearLayout childContainer=(LinearLayout)LayoutInflater.from(context).flate(R.layout.template_布局,null);
TextView tv=childContainer.findViewById(R.id.textviewid);
EditText et=childContainer.findViewById(R.id.edittextviewid);
//如果需要,您可以注册textwatcher以编辑文本
//将其添加到roolayout
rootLayout.addView(childContainer);
}
在您的onBindViewHolder()中添加这两行。
设置侦听器之后,即
contactViewHolder.myCustomEditTextListener.updatePosition(i);
contactViewHolder.myCustomEditTextListener2.updatePosition2(i);
这两行代码
contactViewHolder.myCustomEditTextListener.updatePosition(i);
contactViewHolder.myCustomEditTextListener2.updatePosition2(i);
holder.editQty.addTextChangedListener
holder.editQty.addTextChangedListener(null);
holder.editQty.addTextChangedListener(new TextWatcher())