【问题标题】:wiered behaviour of listview while scrolling滚动时列表视图的奇怪行为
【发布时间】:2011-11-04 13:07:25
【问题描述】:

IMAGE URL ---> Please click

我正在创建一个ListView,它有一个TextView 和一个ProgressBarProgressBar 最初处于不可见状态。我正在为包含文本视图数据的BaseAdapter 提供一个ArrayList

当点击ListView 的项目时,ProgressBar 被启用,一个 Http 连接被建立并且TextView 的值被来自服务器的数据更新。我为此使用了AsyncTask

假设列表中有 10 个项目,我正在单击 1、2、3、4 个项目,在每个项目中都会显示进度条并更新文本视图。但是当我滚动列表视图时出现问题。之前显示在 3 的进度条显示在项目 7、6、8、9 中的任何一项中(在 3 中不再显示)。 3 项进度条的行为并不具体,它可能发生在 1、2、4 进度条上。进度条画在任何地方。发生了什么我不知道

ListView 初始化的活动类:

private void onListViewItemSelection()
{
    progressLstVw.setOnItemClickListener( new OnItemClickListener() 
    {
        public void onItemClick( AdapterView<?> parent, View view, int position, long id ) 
        {

            downloadFile(url, view, position);
            view.postInvalidate(); 
        }
    });
}

public void downloadFile(String url, View view, int position)
{
    ProgressBar itemProgressBar = null;
    TextView titleTxtVw = null;

    itemProgressBar = (ProgressBar) view.findViewById(R.id.progressbar);
    titleTxtVw = (TextView) view.findViewById(R.id.progress_txt_TxtVw);

    progressBar = itemProgressBar;
    progressTxtVw = titleTxtVw;

    Handler handler = new Handler()
    {
        public void handleMessage(Message message)
        {
            switch (message.what)
            {
                case HttpConnection.DID_START: 
                {
                    Log.d("Twitter Icon", "Starting Connection");
                    progressBar.setVisibility(View.VISIBLE);
                    break;
                }
                case HttpConnection.DID_SUCCEED: 
                {
                    int position = message.getData().getInt("ITEM_POSITOIN");

                    listDataAry.get(position).setTxtData(message.getData().getString("RECIEVED_DATA"));
                    listDataAry.get(position).setProgressData(message.getData().getInt("PERCENT_CMPLTD"));

                    progressTxtVw.setText(listDataAry.get(position).getTxtData());
                    progressBar.setProgress(listDataAry.get(position).getProgressData());
                    break;
                }
                case HttpConnection.DID_CLOSED: 
                {
                    //progressBar.setVisibility(View.GONE);
                    break;
                }
                case HttpConnection.DID_ERROR: 
                {
                    Exception e = (Exception) message.obj;
                    e.printStackTrace();
                    break;
                }
            }
        }
    };
    new HttpConnection(handler, position).get(url);
}

基础适配器获取视图方法

public class ListAddapter extends BaseAdapter

{ 私有上下文上下文 = null; 私有 LayoutInflater layoutInflater = null; 私有 ArrayList urls = null;

public ListAddapter(Context context, LayoutInflater layoutInflater, ArrayList<ListData> urls)
{
    this.context = context;
    this.layoutInflater = layoutInflater;
    this.urls = urls;
}
@Override
public int getCount()
{
    System.out.println("getCount");
    return urls.size();
}

@Override
public Object getItem(int arg0) 
{
    System.out.println("getItem");
    return null;
}

@Override
public long getItemId(int arg0) 
{
    System.out.println("getItemId");
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    View row = convertView;
    ViewHolder viewHolder = null;

    if(row == null)
    {
        ViewController viewController = null;

        row = layoutInflater.inflate(R.layout.listview, parent ,false);
        viewController = new ViewController(row);
        viewHolder = new ViewHolder();
        viewHolder.viewController = viewController;
        row.setTag(viewHolder);
    }
    else
    {
        viewHolder = (ViewHolder) row.getTag();
    }

    viewHolder.viewController.setTextData(urls.get(position).getTxtData());
    viewHolder.viewController.setProgressData(urls.get(position).getProgressData());


/*  if(row == null)
    {
        row = layoutInflater.inflate(R.layout.listview, parent ,false);
    }
    viewController = new ViewController(row);*/
    return row;
}

static class ViewHolder 
{
    ViewController viewController;
}

查看控制器类

public ViewController(View view)
{
    this.view = view;
    intializeUI();
}

private void intializeUI()
{
    txtView = (TextView) view.findViewById(R.id.progress_txt_TxtVw);
    progressBar = (ProgressBar) view.findViewById(R.id.progressbar);
}

public void setProgressData(int progressData) 
{
    this.progressData = progressData;
    progressBar.setProgress(this.getProgressData());
}

public int getProgressData() 
{
    return progressData;
}

public void setTextData(String textData) 
{
    this.textData = textData;
    txtView.setText(this.getTextData());
}

public String getTextData() 
{
    return textData;
}

【问题讨论】:

  • 嗯,这个不是很清楚。尤其是第三段。您能改写一下并添加一些相关代码吗?
  • 延迟完成 AsyncTask 然后执行任何 UI 操作,在完成 asynctask 之前有可能获得空值。
  • 不看代码什么都说不出来。至少应该看到适配器。
  • 写你的getView来自Adapter,代码会有所帮助。你打电话给adapter.notifyDataChanged(); 吗?
  • 还有 getPosition(或其他名称)、getItem 等...更好的是请发布您的整个适配器类

标签: android listview


【解决方案1】:

只需更改以下代码,您就会得到正确的响应

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    View row = convertView;
    ViewHolder viewHolder = null;

    ViewController viewController = null;

    row = layoutInflater.inflate(R.layout.listview, parent ,false);
    viewController = new ViewController(row);
    viewHolder = new ViewHolder();
    viewHolder.viewController = viewController;
    row.setTag(viewHolder);
    viewHolder.viewController.setTextData(urls.get(position).getTxtData());
    viewHolder.viewController.setProgressData(urls.get(position).getProgressData());


/*  if(row == null)
    {
        row = layoutInflater.inflate(R.layout.listview, parent ,false);
    }
    viewController = new ViewController(row);*/
    return row;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多