У меня есть 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);
}
Почему вы не используете AsynckTask? Вызовите 'makeIconVisible' в вашем postExecute mehod AsynckTask или проверьте библиотеку волейбола здесь, чтобы быстрее и разрешить кеширование запроса/ответа https://developers.google.com/events/io/sessions/325304728 – pyus13
Просто сохраните свой список как переменную и когда процесс asynk завершен (Enter to onpostexecute()), то обновите listview – Amsheer