Android定制arrayadapter&;listview奇怪的行为

Android定制arrayadapter&;listview奇怪的行为,android,listview,adapter,Android,Listview,Adapter,我只在屏幕上出现的listview的第一项上有奇怪的行为;它粘在第二个上。它是一个动态列表视图,用户可以在其中写入文本和添加/删除新行。请参阅下面的代码: 添加新行的按钮代码: add_task.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { job_task_array.add(new JobTask_Model

我只在屏幕上出现的listview的第一项上有奇怪的行为;它粘在第二个上。它是一个动态列表视图,用户可以在其中写入文本和添加/删除新行。请参阅下面的代码:

添加新行的按钮代码:

add_task.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            job_task_array.add(new JobTask_Model("", 50));
            job_task_update(rootView, item_job_task_height);
            for (int i = 0; i < job_task_array.size(); i++)
                Log.e("job_task", job_task_array.get(i).getJob_task_name());
        }
    });
自定义适配器:

    // Object model for the posting_2 job_task_listView
public class JobTask_Model {
    private int job_task_seekbar_value;
    private String job_task_name;

    public JobTask_Model(String job_task_name, int job_task_seekbar_value) {
        this.job_task_seekbar_value = job_task_seekbar_value;
        this.job_task_name = job_task_name;
    }

    public String getJob_task_name() {
        return job_task_name;
    }

    public int getJob_task_seekbar_value() {
        return job_task_seekbar_value;
    }
}

/**
 * This class is the adapter for the tasks
 **/
public class JobTasks_Adapter extends ArrayAdapter {
    private final ArrayList<JobTask_Model> job_task_array;
    private Context context;

    public JobTasks_Adapter(Context context, ArrayList arrayList) {
        super(context, R.layout.item_job_task, arrayList);
        this.context = context;
        job_task_array = arrayList;
    }

    // Create static class for our special viewholder model, references item_job_task layout
    class JobTask_ViewHolder {
        EditText job_task_name;
        SeekBar job_task_seekbar;
        Button job_task_delete;
    }

    // This gets the view
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            LayoutInflater layoutInflater = ((Activity) context).getLayoutInflater();
            view = layoutInflater.inflate(R.layout.item_job_task, parent, false);
            // configure view holder
            JobTask_ViewHolder viewHolder = new JobTask_ViewHolder();
            viewHolder.job_task_name = (EditText) view.findViewById(R.id.job_task_name);
            viewHolder.job_task_seekbar = (SeekBar) view.findViewById(R.id.job_task_seekbar);
            viewHolder.job_task_delete = (Button) view.findViewById(R.id.job_task_delete);
            view.setTag(viewHolder);
        }
        JobTask_ViewHolder viewHolder = (JobTask_ViewHolder) view.getTag();

        // Set the bar value so it doesn't reset when we add another one in
        viewHolder.job_task_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                job_task_array.get(position).job_task_seekbar_value = progress;
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
        });

        viewHolder.job_task_name.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) {
                job_task_array.get(position).job_task_name = s.toString();
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });

        // Button to delete each task
        viewHolder.job_task_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                job_task_array.remove(position);
                job_task_update(rootView, -item_job_task_height);
            }
        });

        viewHolder.job_task_seekbar.setProgress(job_task_array.get(position).getJob_task_seekbar_value());
        viewHolder.job_task_name.setText(job_task_array.get(position).getJob_task_name());

        return view;
    }
}
//发布作业任务列表视图的对象模型
公共类JobTask\u模型{
私有int作业任务seekbar值;
私有字符串作业\任务\名称;
公共作业任务模型(字符串作业任务名称,整数作业任务seekbar值){
this.job\u task\u seekbar\u value=job\u task\u seekbar\u value;
this.job\u task\u name=job\u task\u name;
}
公共字符串getJob\u task\u name(){
返回作业任务名称;
}
public int getJob_task_seekbar_value(){
返回job\u task\u seekbar\u值;
}
}
/**
*此类是任务的适配器
**/
公共类JobTasks_适配器扩展了ArrayAdapter{
私有最终数组列表作业任务数组;
私人语境;
public JobTasks_适配器(上下文上下文,ArrayList ArrayList){
super(上下文,R.layout.item\u job\u task,arrayList);
this.context=上下文;
作业任务数组=数组列表;
}
//为我们的特殊viewholder模型创建静态类,参考项目\作业\任务布局
类作业任务\视图持有者{
编辑文本作业任务名称;
SeekBar作业\任务\ SeekBar;
按钮作业任务删除;
}
//这就得到了视图
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
LayoutInflater LayoutInflater=((活动)上下文)。getLayoutInflater();
视图=LayoutFlater.充气(R.layout.item\u job\u task,父项,false);
//配置视图保持架
JobTask_ViewHolder ViewHolder=新JobTask_ViewHolder();
viewHolder.job\u task\u name=(EditText)view.findViewById(R.id.job\u task\u name);
viewHolder.job\u task\u seekbar=(seekbar)view.findViewById(R.id.job\u task\u seekbar);
viewHolder.job\u task\u delete=(按钮)view.findViewById(R.id.job\u task\u delete);
view.setTag(viewHolder);
}
JobTask_ViewHolder ViewHolder=(JobTask_ViewHolder)view.getTag();
//设置条形图值,以便在添加另一个条形图时不会重置
viewHolder.job\u task\u seekbar.setOnSeekbarchaneListener(新的seekbar.onSeekbarchaneListener(){
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progress、boolean-fromUser){
job\u task\u array.get(position).job\u task\u seekbar\u value=进度;
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
});
viewHolder.job\u task\u name.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
job_task_array.get(position.job_task_name=s.toString();
}
@凌驾
公共无效后文本已更改(可编辑){
}
});
//按钮删除每个任务
viewHolder.job\u task\u delete.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
作业任务数组。删除(位置);
作业任务更新(根视图,-项目作业任务高度);
}
});
viewHolder.job_task_seekbar.setProgress(job_task_array.get(position.getJob_task_seekbar_value());
viewHolder.job_task_name.setText(job_task_array.get(position.getJob_task_name());
返回视图;
}
}

将一些logcat语句添加到此方法中

这将帮助您查看“标记”是否正确关联(创建/读取),因为相同的两个视图应具有不同的“标记”对象

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {

        LayoutInflater layoutInflater = ((Activity) context).getLayoutInflater();
        view = layoutInflater.inflate(R.layout.item_job_task, parent, false);
        // configure view holder
        JobTask_ViewHolder viewHolder = new JobTask_ViewHolder();
        viewHolder.job_task_name = (EditText) view.findViewById(R.id.job_task_name);
        viewHolder.job_task_seekbar = (SeekBar) view.findViewById(R.id.job_task_seekbar);
        viewHolder.job_task_delete = (Button) view.findViewById(R.id.job_task_delete);
        view.setTag(viewHolder);
        Log.d("JobTasks_Adapter", "View was null" + view + " tag: " + viewHolder);
    } else {
        // this will give us address of the view
        Log.d("JobTasks_Adapter", "View was non-null" + view);
    }
    JobTask_ViewHolder viewHolder = (JobTask_ViewHolder) view.getTag();
    Log.d("JobTasks_Adapter", "viewHolder address " + viewHolder);

    ....
}

您的
静态
不是静态

这样做:

// Create static class for our special viewholder model, references item_job_task layout
class JobTask_ViewHolder {
    EditText job_task_name;
    SeekBar job_task_seekbar;
    Button job_task_delete;
}
为此:

// Create static class for our special viewholder model, references item_job_task layout
static class JobTask_ViewHolder {
    EditText job_task_name;
    SeekBar job_task_seekbar;
    Button job_task_delete;
}

例如,你所说的“坚持”到底是什么意思?你的意思是视觉上的?(如果是,请张贴图片)还是第一个数组元素“显示”为第二个?(或诸如此类的)字面上是。。。单击“添加”按钮时进行更改。在视觉上和阵列中。我现在正试图调试它,但遇到了一些问题:在非边缘情况下会发生什么情况(也就是说……当数组中已经有3个或更多项并且添加了一个新项时?),所有其他项都会正确执行。这只是列表中第一个搞砸的项目。我有两个单独的列表,分别做不同的事情(所以我使用两个适配器),第一个加载额外“列表项”的列表似乎会遇到这个问题。其他一切都正常工作。如果您可以将此发布到github,我很乐意查看所有内容(或者至少查看项目中包含“this”部分的子集)。将其设置为static没有任何作用:(由于动画的原因,输出被严重破坏…但我可以看到标签是不同的。我认为这与动画有关,它正在重置,但我不能真正确定是什么。。。
// Create static class for our special viewholder model, references item_job_task layout
class JobTask_ViewHolder {
    EditText job_task_name;
    SeekBar job_task_seekbar;
    Button job_task_delete;
}
// Create static class for our special viewholder model, references item_job_task layout
static class JobTask_ViewHolder {
    EditText job_task_name;
    SeekBar job_task_seekbar;
    Button job_task_delete;
}