【发布时间】:2011-11-04 13:07:25
【问题描述】:
我正在创建一个ListView,它有一个TextView 和一个ProgressBar。 ProgressBar 最初处于不可见状态。我正在为包含文本视图数据的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 等...更好的是请发布您的整个适配器类