Java ArrayAdapter中的getView()表示第1行是位置0,而不是正确的位置1
问题 我有一个带有Java ArrayAdapter中的getView()表示第1行是位置0,而不是正确的位置1,java,android,android-studio,listview,android-arrayadapter,Java,Android,Android Studio,Listview,Android Arrayadapter,问题 我有一个带有TextView和EditText的ListView。我在EditText上有一个addTextChangeListener(),因此我可以将文本立即保存到ArrayList中,以便在父活动中检索它*出于某种原因,当我在第1行时,它认为位置是第0行,并将EditText信息从第1行保存到数组的位置0。它继续将第1行信息保存到数组的位置1。所以我有两个第一行的信息。之后的一切都是完全正常的 有人知道如何解决这个问题吗 ArrayAdapter class CustomListV
TextView
和EditText
的ListView
。我在EditText上有一个addTextChangeListener()
,因此我可以将文本立即保存到ArrayList
中,以便在父活动中检索它*出于某种原因,当我在第1行时,它认为位置是第0行,并将EditText
信息从第1行保存到数组的位置0。它继续将第1行信息保存到数组的位置1。所以我有两个第一行的信息。之后的一切都是完全正常的
有人知道如何解决这个问题吗
ArrayAdapter
class CustomListViewEntryAdapter extends ArrayAdapter<ThoughtClass> {
private ArrayList<ThoughtClass> mListOfThoughtClass;
private ThoughtClass mThoughtClass;
private int mNumberOfThought;
private String mThoughtEntry;
static class ViewHolder {
CardView cardView;
EditText editText;
TextView textView;
}
public CustomListViewEntryAdapter(@NonNull Context context, ArrayList<ThoughtClass> thoughtClass) {
super(context, R.layout.listview_entry_edittext_row ,thoughtClass);
mListOfThoughtClass = thoughtClass;
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
View currentView = convertView;
if(convertView == null) {
LayoutInflater davidsInflater = LayoutInflater.from(getContext());
currentView = davidsInflater.inflate(R.layout.listview_entry_edittext_row, parent, false);
viewHolder = new ViewHolder();
viewHolder.cardView = currentView.findViewById(R.id.thoughtCard);
viewHolder.textView = currentView.findViewById(R.id.thoughtNumber);
viewHolder.editText = currentView.findViewById(R.id.thoughtEntry);
// associate the holder with the view for later lookup
currentView.setTag(viewHolder);
}
else {
// view already exists, get the holder instance from the view
viewHolder = (ViewHolder) currentView.getTag();
}
viewHolder.editText.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) {
mListOfThoughtClass.get(position).setThoughtEntry(s.toString());
}
});
mThoughtClass = mListOfThoughtClass.get(position);
mNumberOfThought = mThoughtClass.getNumberOfThought();
if(mThoughtClass.getThoughtEntry() == null) {
mThoughtEntry = "";
}
else {
mThoughtEntry = mThoughtClass.getThoughtEntry();
}
// Set objects
viewHolder.textView.setText( Integer.toString(mNumberOfThought) );
if(!mThoughtEntry.equals("") || mThoughtEntry != null) {
viewHolder.editText.setText(mThoughtEntry);
}
return currentView;
}
}
编辑
我忘了提到这一部分。在父视图中有一个添加按钮,用于向适配器引入新成员。但我不认为这会影响定位
public void addNewThought() {
ThoughtClass thoughtClass = new ThoughtClass(++mNumberOfThoughts);
mThoughtClassList.add( thoughtClass );
setListViewHeightBasedOnItems(mNegativeThoughtsListView);
mNegativeThoughtsAdapter.notifyDataSetChanged();
}
public boolean setListViewHeightBasedOnItems(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
mThoughtClassList = mNegativeThoughtsAdapter.getItems();
if (listAdapter != null) {
int numberOfItems = listAdapter.getCount();
// Get total height of all mItems.
int totalItemsHeight = 0;
for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
View item = listAdapter.getView(itemPos, null, listView);
item.measure(0, 0);
totalItemsHeight += item.getMeasuredHeight();
}
// Get total height of all item dividers.
int totalDividersHeight = listView.getDividerHeight() *
(numberOfItems - 1);
// Set list height.
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalItemsHeight + totalDividersHeight;
listView.setLayoutParams(params);
listView.requestLayout();
return true;
} else {
return false;
}
}
public void addnewthough(){
ThoughtClass ThoughtClass=新的ThoughtClass(++MNThoughts);
mThoughtClassList.add(thoughtClass);
setListViewHeightBasedOnItems(mNegativeThoughtsListView);
mNegativeThoughtsAdapter.notifyDataSetChanged();
}
公共布尔值setListViewHeightBasedOnItems(ListView ListView){
ListAdapter ListAdapter=listView.getAdapter();
mThoughtClassList=mNegativeThoughtsAdapter.getItems();
if(listAdapter!=null){
int numberOfItems=listAdapter.getCount();
//获取所有斜接的总高度。
int totalItemsHight=0;
对于(int-itemPos=0;itemPos
我只是想澄清一下。大多数人在第一个条目中以“一”开头的列表中计算行数。JavaArrayList
对象计数索引以“零”开头!所以,当你说“…第1行是位置0…”时,你是从0还是1开始计算行数?@Barns很抱歉弄糊涂了。我从0开始数行。我想展示第0行的东西在位置0,第1行的东西在位置1Ok。很高兴知道。我假设您在这行代码中遇到了问题:mListOfThoughtClass.get(position.setThoughtEntry(s.toString())
我从未见过getView()
将条目的位置弄错……因此我认为问题可能出在ThoughtClass
中。你能编辑你的问题并添加ThoughtClass
code吗?@Barns谢谢!这也是我所相信的。我有它在调试模式,但当我键入一封信,使它很难遵循时,侦听器会被调用很多担心延迟。。。我现在也在编写自己的代码。您可以尝试的一件事是检查位置
和数组列表
的索引之间是否存在差异。在postertextchanged()
方法中添加以下内容:int-myIndex=mListOfThoughtClass.indexOf(mListOfThoughtClass.get(position))代码>这可能会为myIndex
和position
显示不同的值。如果它们相同,那么问题可能在ThoughtClass
中。似乎setNumberOfThink()
方法可能存在一些问题。确保第一个条目为零。
public void addNewThought() {
ThoughtClass thoughtClass = new ThoughtClass(++mNumberOfThoughts);
mThoughtClassList.add( thoughtClass );
setListViewHeightBasedOnItems(mNegativeThoughtsListView);
mNegativeThoughtsAdapter.notifyDataSetChanged();
}
public boolean setListViewHeightBasedOnItems(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
mThoughtClassList = mNegativeThoughtsAdapter.getItems();
if (listAdapter != null) {
int numberOfItems = listAdapter.getCount();
// Get total height of all mItems.
int totalItemsHeight = 0;
for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
View item = listAdapter.getView(itemPos, null, listView);
item.measure(0, 0);
totalItemsHeight += item.getMeasuredHeight();
}
// Get total height of all item dividers.
int totalDividersHeight = listView.getDividerHeight() *
(numberOfItems - 1);
// Set list height.
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalItemsHeight + totalDividersHeight;
listView.setLayoutParams(params);
listView.requestLayout();
return true;
} else {
return false;
}
}