2014-01-11 4 views
1

У меня есть ListView с некоторыми TextViews, ImageView & a Button. ImageView является bydefault 'Invisible'. В обработчике кликов кнопки мне нужно сделать некоторые HTTP-вызовы, которые не могут быть выполнены в UI-Thread, поэтому я создал для него фоновый поток. Основываясь на результате вызова http, я должен показать ImageView (который изначально был «Невидимым»).Update ListView элементов строки при нажатии кнопки

Вот часть моего файла макета (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; 
} 

Вопрос: Как переключить visiblity 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? Вызовите 'makeIconVisible' в вашем postExecute mehod AsynckTask или проверьте библиотеку волейбола здесь, чтобы быстрее и разрешить кеширование запроса/ответа https://developers.google.com/events/io/sessions/325304728 – pyus13

+0

Просто сохраните свой список как переменную и когда процесс asynk завершен (Enter to onpostexecute()), то обновите listview – 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); 
} 

};

Смежные вопросы