滚动时自定义ListView随机更改按钮文本或编辑文本

时间:2015-07-09 06:25:47

标签: android listview android-listview

我已经搜索过这个但是无济于事我没有得到问题的确切答案。

我在ListView内有一个按钮,当点击该按钮时,它会显示一个警告对话框来选择日期,选择日期后,所选日期将是该按钮的文本。代码工作正常,但当我向下滚动时,日期将随机更改 这是我的适配器的getView()方法的代码。当我输入任何EditText时,EditText也会发生这种情况,但是当我开始滚动值时也改变了。

这是我的获取视图方法

public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if(convertView == null){
        convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);

        viewHolder = new ViewHolder();
        viewHolder.btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
        viewHolder.txtNotes  = (EditText) convertView.findViewById(R.id.rpNotes);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder) convertView.getTag();
    }


    RepeatEntryList repeatEntryList = listData.get(position);
    viewHolder.btnDate.setText(repeatEntryList.getDate());
    viewHolder.btnDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          //EVEN IF I REMOVE THE CODE FOR SETTING THE BUTTON TEXT TO JUST LIKE THE BELOW CODE. SCROLLING ISSUES STILL PERSIST

          viewHolder.btnDate.setText("just sample date text");

            //**NOTE UPDATED**
            //MY EDITTEXT ALSO HAVE THE SAME BEHAVIOR
        }
    });
    viewHolder.txtNotes.setHint(contx.getResources().getString(R.string.placeholder_txt));
    return convertView;
}

注意假设我在EditText内有20个按钮和20个ListView。当我向所有EditText输入内容并通过点击更改按钮的文字时,向下滚动ListViewEditText和按钮的文字或值将会改变或交换,有时不见了。

关于我的问题,有人可以向我解释为什么ListView表现得像这样,以及如何避免这种行为。

5 个答案:

答案 0 :(得分:7)

在代码中进行更改删除if(convertView == null){} else {}条件并直接使用如下

convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);
Button btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
TextView txtNotes  = (EditText) convertView.findViewById(R.id.rpNotes);

答案 1 :(得分:3)

position

中制作final变量getView
final int position

并且还将你的模态课作为最终版。

final RepeatEntryList repeatEntryList = listData.get(position);

答案 2 :(得分:3)

只需添加以下行,repeatEntryList.setDate("选择日期")

datePickerTo.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                String strdate = (pickerTo.getMonth() + 1) + "-" + pickerTo.getDayOfMonth() + "-" + pickerTo.getYear();

                                viewHolder.btnDate.setText(mainActivity.pickerStringTodate(strdate));

//Here is your new line
repeatEntryList.setDate(mainActivity.pickerStringTodate(strdate))


                                try {
                                    Date date1 = mainActivity.dateFormat.parse(viewHolder.btnDate.getText().toString());
                                    Date date2 = mainActivity.dateFormat.parse(mainActivity.dateFormat.format(new Date()));
                                    if (date1.before(date2)) {
                                        Toast.makeText(contx, "You cannot select past date", Toast.LENGTH_LONG).show();
                                        viewHolder.btnDate.setText(mainActivity.dateFormat.format(new Date()));
                                    }
                                } catch (ParseException e) {
                                    e.printStackTrace();
                                }
                            }
                        }).setNegativeButton("Cancel", null);
                        datePickerTo.show();

答案 3 :(得分:2)

您正在使用if条件:

if (date1.before(date2)) { 
    Toast.makeText(contx, "You cannot select past date", Toast.LENGTH_LONG).show();
    viewHolder.btnDate.setText(mainActivity.dateFormat.format(new Date()));
}else{viewHolder.btnDate.setVisibility(View.GONE);}

但没有别的情况。其他情况也应该处理。

答案 4 :(得分:1)

这就是我为解决我的问题而做的事情,因为有人可能会遇到同样的问题:
 1.首先我在我的自定义Adapter类中创建i变量,它是RepeatEntryListAdapter并将其命名为listData

public ArrayList<RepeatEntryList> listData;

2。我引用listData变量作为RepeatEntryList类的数组列表,这是我的getter和setter类。

public RepeatEntryListAdapter(Context context,ArrayList<RepeatEntryList> listdata){
          this.listData = listdata;
            this.contx = context;
            mainActivity = (MainActivity) context;
            layoutInflater= LayoutInflater.from(context);
       }

3。在getview方法中,我为按钮创建了click事件。在click事件中我实例化了我的getter类,然后使用我的getter类的实例化变量并使用settext,设置按钮的文本并设置的日期lisData 变量。重要的部分是使用 listData 变量,其中我使用位置变量来设置 listData 的某个位置的值,如同此

 RepeatEntryList re = rListData;
 viewHolder.btnDate.setText('07-06-2015')//say the date selected is the string inside setText                          re.setDate(viewHolder.btnDate.getText().toString());//set Date is a setter method inside my RepeatEntryList class
 listData.set(position, re);//position variable should be final

4。这是解决我的自定义列表视图的滚动问题最棘手的部分,这是由edittext观察者引起的,滚动时触发。我做的是。

一个。我创建了一个像这样实现TextWatcher的类

class EditTextWatcher implements TextWatcher{

        private int mPosition;
        private boolean mActive;

        void setPosition(int position){
            mPosition = position;
        }
        void setActive(boolean active){
            mActive = active;
        }
        @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) {
            if(mActive){
                //rNotes.set(mPosition,s.toString());
                RepeatEntryList re = listData.get(mPosition);
                re.setNotes(s.toString());
                listData.set(mPosition,re);
            }
        }
    }

湾我还在我的静态类ViewHolder

中为EditeTextWatcher创建了一个变量
 static class ViewHolder{
   public Button btnDate;
   public EditText txtNotes;
   public EditTextWatcher mWatcher;
}

℃。在我的getview方法中,我创建了一个EditTextWatcher()的新实例,它也创建了一个新的textwatcher而不使用最后一个事件,因为我创建了一个textwatcher的新实例

public View getView(final int position, View convertView, ViewGroup parent) {

        final ViewHolder viewHolder;

        final RepeatEntryList rListData = listData.get(position);

        if(convertView == null){
            convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);

            viewHolder = new ViewHolder();
            viewHolder.btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
            viewHolder.mWatcher = new EditTextWatcher();
            viewHolder.txtNotes  = (EditText) convertView.findViewById(R.id.rpNotes);
            viewHolder.txtNotes.addTextChangedListener(viewHolder.mWatcher);

            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();


        }

        viewHolder.btnDate.setText(rListData.getDate());

        viewHolder.mWatcher.setActive(false);
        viewHolder.txtNotes.setText(rListData.getNotes());
        viewHolder.mWatcher.setPosition(position);
        viewHolder.mWatcher.setActive(true);


      //here is the part of button click event i mention above (no 3.)
return convertView;
}