簡體   English   中英

單擊按鈕更新ListView行項

[英]Update ListView row items on click of button

我有一個ListView與一些TextViews,一個ImageView和一個按鈕。 ImageView是默認的“隱形”。 在按鈕的單擊處理程序中,我必須執行一些無法在UI-Thread中完成的http調用,因此我為它創建了一個后台線程。 根據http調用的結果,我必須顯示ImageView(最初是'Invisible')。

這是我的布局文件( 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;
}

問題 :如何在函數makeIconVisible()切換ImageView的可見性? 由於http響應處理是在后台線程中,我不能直接從那里修改visiblity。 我將不得不在UIThread上運行它。 mContext.runOnUiThreadmActivity.runOnUiThread都不起作用。 我應該如何修改以下功能才能使其正常工作?

private void makeIconVisible(ImageView icon)
{
    // What else is to be done here?
    icon.setVisibility(View.VISIBLE);
}

你可以使用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);
        }
    }

}

使用這個。

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);
} 

};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM