我有一個ListView與一些TextViews,一個ImageView & a Button。 ImageView是默認的「不可見」。在按鈕的點擊處理程序中,我必須做一些無法在UI線程中完成的http調用,所以我爲它創建了一個後臺線程。根據http調用的結果,我必須顯示ImageView(最初是'隱形')。點擊按鈕更新列表查看行項目
這是我的佈局文件(list_row.xml
)的一部分:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_selector"
android:padding="5dip" >
<ImageView
android:id="@+id/imageViewIcon"
android:layout_width="50dip"
android:layout_height="50dip"
android:visibility="invisible"
/>
<TextView
android:id="@+id/textViewName"
...
/>
<Button
android:id="@+id/button"
...
/>
這裏是我如何設置適配器:
ListView appList = (ListView) findViewById(R.id.list);
MyAdapter adapter = new MyAdapter(getApplicationContext(), MainActivity.this, MyDataInAnArray);
appList.setAdapter(adapter);
這裏是MyAdapter類:
public class MyAdapter extends BaseAdapter
{
Context mContext;
Context mActivity;
SomeDataType[] mData;
LayoutInflater mInflater;
public MyAdapter(Context context, Context activity, SomeDatatype[] data)
{
mContext = context;
mActivity = activity;
mData = data;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
..... Some more required @Override functions here ....
@Override
public View getView(final int pos, View convertView, ViewGroup parent)
{
View vi = convertView;
if (convertView == null)
vi = mInflater.inflate(R.layout.list_row, null);
TextView tvName = (TextView) vi.findViewById(R.id.textViewName);
tvName.setText(mData[pos].name);
final ImageView icon = (ImageView) vi.findViewById(R.id.imageViewIcon);
final Button button = (Button) vi.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
String result = Utils.httpPost("MyURLHere", SomePostData);
if (result != null)
{
... and some more processing
**makeIconVisibile(icon);**
}
}
});
thread.start();
}
});
return vi;
}
問題:我應該如何切換ImageView在函數makeIconVisible()
中的可見性? 由於http響應處理在後臺線程中,因此我無法直接從那裏修改可見性。我將不得不在UIThread上運行這個。 mContext.runOnUiThread
& mActivity.runOnUiThread
都不起作用。我應該如何修改下面的函數使其工作?
private void makeIconVisible(ImageView icon)
{
// What else is to be done here?
icon.setVisibility(View.VISIBLE);
}
你爲什麼不使用AsynckTask?在你的postExecute的AsynckTask mehod中調用'makeIconVisible',或者在這裏查看Volley Library以獲得更快的緩存啓用請求/響應https://developers.google.com/events/io/sessions/325304728 – pyus13
只需將你的listview保存爲變量並當asynk進程完成時(輸入到onpostexecute())然後刷新列表視圖 – Amsheer