Android定制arrayadapter&;listview奇怪的行为
我只在屏幕上出现的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
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;
}