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
我只是想澄清一下。大多数人在第一个条目中以“一”开头的列表中计算行数。Java
ArrayList
对象计数索引以“零”开头!所以,当你说“…第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;
    }

}