2014-01-11 49 views
1

我有一個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); 
} 
+0

你爲什麼不使用AsynckTask?在你的postExecute的AsynckTask mehod中調用'makeIconVisible',或者在這裏查看Volley Library以獲得更快的緩存啓用請求/響應https://developers.google.com/events/io/sessions/325304728 – pyus13

+0

只需將你的listview保存爲變量並當asynk進程完成時(輸入到onpostexecute())然後刷新列表視圖 – Amsheer

回答

2

您可以使用AsyncTask嘗試類似於此的內容。

private void makeIconVisible(ImageView icon) 
{ 
    new MakeIconVisibleTask().execute(icon); 
} 

class MakeIconVisibleTask extends AsyncTask<View, Void, Integer> { 
    private View mView; 
    String mResult = null; 

    @Override 
    protected Integer doInBackground(View... arg0) { 
     mView = arg0[0]; 

     mResult = Utils.httpPost("MyURLHere", SomePostData); 

     int success = -1; 
     if(mResult!=null && !mResult.isEmpty()) { 
      success = 1; 
     } 

     return success; 
    } 

    @Override 
    protected void onPostExecute(Integer res) { 
     if(res >0) { 
      mView.setVisibility(View.VISIBLE); 
     } 
    } 

} 
+0

謝謝。這對我的代碼流稍作修改。 –

1

使用這一個。

Thread thread = new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       String result = Utils.httpPost("MyURLHere", SomePostData); 
       if (result != null) 
       { 
        handler.sendEmptyMessage(0); 
       } 
      } 
     }); 
     thread.start(); 



Handler handler = new Handler() { 
@Override 
public void handleMessage(Message msg) { 
    makeIconVisibile(icon); 
} 

};