gpt4 book ai didi

Android RecyclerView - 多个Edittext同时更改

转载 作者:行者123 更新时间:2023-12-02 11:03:20 25 4
gpt4 key购买 nike

我有一个 RecyclerView,其中有许多卡片,其中包含 4 个 EditText。当我在一张卡的一个 EditText 中输入值时,它会在随机卡中填充相同的值。令人惊讶的是它不会跳转 EditText 例如:

如果我在 card1edittext1 中输入值,它会将相同的值填充到 card8 中的 edittext1 中,并且如果我更改 card8 中的值,它将更改回 card1 中的值。有人可以告诉我为什么会发生这种情况吗?

提前谢谢您

这是我的代码:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {    
private String[] mDataset;
public String[][] data = new String[30][4];


public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public LinearLayout mCardView;

public ViewHolder(LinearLayout v) {
super(v);
mCardView = v;
}
}

// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}

// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {

LinearLayout v = (LinearLayout) LayoutInflater.from(parent.getContext())
.inflate(R.layout.cards, parent, false);

ViewHolder vh = new ViewHolder(v);
return vh;
}


// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
final EditText txt = (EditText) holder.mCardView.findViewById(R.id.ip1_text);
final EditText txt2 = (EditText) holder.mCardView.findViewById(R.id.ip2_text);

final EditText txt3 = (EditText) holder.mCardView.findViewById(R.id.ip3_text);
final EditText txt4 = (EditText) holder.mCardView.findViewById(R.id.ip4_text);
txt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
data[position][0] = s.toString();
Log.d("DATA" + position + "0", s.toString());
}
});
txt2.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
data[position][1] = s.toString();
Log.d("DATA" + position + "1", s.toString());
}
});
txt3.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
data[position][2] = s.toString();
Log.d("DATA" + position + "2", s.toString());
}
});
txt4.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
data[position][3] = s.toString();
Log.d("DATA" + position + "3", s.toString());
}
});

TextView t = (TextView) holder.mCardView.findViewById(R.id.serNo);
t.setText(mDataset[position]);


}

// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}

public String[][] getData() {
return data;
}

这是我的卡片 xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:weightSum="1">
<!-- A CardView that contains a TextView -->
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="375dp"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:backgroundTint="#eeeeee"
card_view:cardCornerRadius="4dp">

<TextView
android:id="@+id/serNo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="number"
android:layout_margin="20dp"
android:textColor="@color/cardview_dark_background" />

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">

<EditText
android:id="@+id/ip1_text"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_marginTop="20dp"
android:background="@color/cardview_light_background"
android:inputType="number"
android:maxLength="2" />

<EditText
android:id="@+id/ip3_text"
android:layout_width="80dp"
android:layout_height="30dp"
android:layout_below="@+id/ip1_text"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:background="@color/cardview_light_background"
android:inputType="number"
android:maxLength="1" />

<EditText
android:id="@+id/ip2_text"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:layout_toRightOf="@+id/ip1_text"
android:background="@color/cardview_light_background"
android:inputType="number"
android:maxLength="2" />

<EditText
android:id="@+id/ip4_text"
android:layout_width="80dp"
android:layout_height="30dp"
android:layout_below="@+id/ip2_text"
android:layout_marginBottom="10dp"
android:layout_marginLeft="40dp"
android:layout_marginTop="10dp"
android:layout_toRightOf="@+id/ip3_text"
android:background="@color/cardview_light_background"
android:inputType="number"
android:maxLength="1" />
</RelativeLayout>
</android.support.v7.widget.CardView>
</LinearLayout>

Added to card one

Automatically it also appears in card 10

最佳答案

发生这种情况是因为 RecyclerView 内的 View 正在被回收。在 onBindViewHolder 中,您需要将特定文本设置为特定位置的 EditText。

  1. ViewHolder 中初始化 View 并在其中添加 TextWatchers,因为 RecyclerView 的整个理念是重用 View :

    public static class ViewHolder extends RecyclerView.ViewHolder {

    EditText txt;
    EditText txt2;
    EditText txt3;
    EditText txt4;

    TextView serNoTxt;

    public ViewHolder(LinearLayout mCardView) {
    super(mCardView);
    txt = (EditText) mCardView.findViewById(R.id.ip1_text);
    txt2 = (EditText) mCardView.findViewById(R.id.ip2_text);
    txt3 = (EditText) mCardView.findViewById(R.id.ip3_text);
    txt4 = (EditText) mCardView.findViewById(R.id.ip4_text);

    setNoTxt = (TextView) mCardView.findViewById(R.id.serNo);

    txt.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    data[getAdapterPosition()][0] = s.toString();
    Log.d("DATA" + getAdapterPosition() + "0", s.toString());
    }
    });
    txt2.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    data[getAdapterPosition()][1] = s.toString();
    Log.d("DATA" + getAdapterPosition() + "1", s.toString());
    }
    });
    txt3.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    data[getAdapterPosition()][2] = s.toString();
    Log.d("DATA" + getAdapterPosition() + "2", s.toString());
    }
    });
    txt4.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    data[getAdapterPosition()][3] = s.toString();
    Log.d("DATA" + getAdapterPosition() + "3", s.toString());
    }
    });
    }
    }
  2. onBindViewHolder 中为 EditTexts 设置适当的文本:

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
    holder.txt1.setText(data[position][0]);
    holder.txt2.setText(data[position][1]);
    holder.txt3.setText(data[position][2]);
    holder.txt4.setText(data[position][3]);

    holder.setNoTxt.setText(mDataset[position]);
    }

关于Android RecyclerView - 多个Edittext同时更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42680906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com