EDIT - Сначала я только что показал один из метода обновления ребенка рассматривает только оставив это адаптер в неустойчивом состоянии (, потому что исходный вопрос не дает много информации о базовой структуре данных).
Адаптер: адаптер объект действует в качестве моста между AdapterView и исходными данными для этой точки зрения. Адаптер обеспечивает доступ к элементам данных . Адаптер также несет ответственность за создание представления для каждого элемента в наборе данных.
Примечание:Поскольку определение сам описывает, что очень важно для поддержания состояния средств (данные + вид). Поэтому вы всегда должны иметь постоянный пользовательский интерфейс.
Чтобы правильно привести пример, я также определил класс модели данных ItemData
на основе предположения о заданном изображении в исходном вопросе.
/**
* Model Class
*/
public class ItemData {
private Uri imageUri;
private String msg;
private Date timeStamp;
public void setImageUri(Uri uri) {
this.imageUri = uri;
}
public Uri getImageUri() {
return this.imageUri;
}
...
}
CustomAdapter
Создайте специальный адаптер для ListView, который будет поддерживать мнения ребенка с его набором данных соответственно. Вы должны сохранить ссылку на последний выбранный индекс строки lastSelectedIndexRow
, который может быть использован позже для обновления вида.
Примечание:Чтобы получить представление для любого индекса в listView
, мы не должны вызывать getView()
метод адаптера. Поскольку вызов getView()
с нулевым значением для convertView заставляет адаптер раздуть новый вид из ресурса макета адаптера (не получает представление, которое уже отображается).
AdapterView всегда должна быть обновлена с notifyDataSetChanged() на основе текущего удержания набора данных адаптером.
public class CustomAdapter extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private List<ItemData> dataList;
private int lastSelectedRowIndex = -1;
public static int LOAD_IMAGE_RESULT = 201;
public CustomAdapter(Context context, ArrayList<ItemData> dataList) {
// hold the items
this.context = context;
this.dataList = dataList;
this.inflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return (dataList != null && !dataList.isEmpty()) ? dataList.size() : 0;
}
@Override
public ItemData getItem(int position) {
return (dataList != null && !dataList.isEmpty()) ? dataList.get(position) : null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderItem viewHolder;
if (converView == null) {
// inflate the layout
convertView = inflater.inflate(R.layout.row_item, parent, false);
// well set up the ViewHolder
viewHolder = new ViewHolderItem();
viewHolder.avatar = (ImageButton)view.findById(R.id.avatar);
// store the holder with the view.
convertView.setTag(viewHolder);
}
else {
// we've just avoided calling findViewById() on resource every time
// just use the viewHolder
viewHolder = (ViewHolderItem) convertView.getTag();
}
// Set row data
ItemData data = (ItemData)getItem(position);
if (data != null) {
// set message
viewHolder.message.setText(data.getMessage());
// set formatted timestamp
String formattedTimeStamp = ...; // convert data.getTimeStamp() into formatted version
viewHolder.timeStamp.setTextView(formattedTimeStamp);
// set Image and also it's action.
viewHolder.avatar.setImageUri(data.getImageUri());
viewHolder.avatar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
Intent intent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
((Activity)context).startActivityForResult(intent, LOAD_IMAGE_RESULT);
} catch (Exception e) {
Log.e("Demo application", "Failed to invoke call", e);
}
}
}
}
}
/**
* Get the last selected item index
*
*/
public int getLastSelectedItemIndex() {
return lastSelectedRowIndex;
}
/**
* Update the adapater with new data
*
*/
public void updateItems(List<ItemData> dataList) {
if (this.dataList != dataList)
this.dataList = dataList;
// update the view.
notifyDataSetChanged();
// reset the last selection
lastSelectedRowIndex = -1;
}
/**
* Hold View items
*/
static class ViewHolderItem {
private ImageView avatar;
private TextView message;
private TextView timeStamp;
}
}
ExampleActivity
В деятельности, вы, к определенной ссылке заказного адаптера и обработке результатов выбора изображения в onActivityResult()
методе. После того, как вы получите выбранное изображение из галереи, обновите базовые данные, содержащиеся внутри dataList
, а также обновите адаптер, вызвав метод updateItems()
.
Способ адаптера updateItems()
принимает новый список данных в качестве аргумента и аннулирует адаптерView, вызывая notifyDataSetChanged().
public class ExampleActivity extend FragmentActivity {
private ListView listView;
private CustomAdapter adapter;
private List<ItemData> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataList = ...; // Load the list from database
// Create the custom adapter with filled list items.
adapter = new CustomAdapter(this, dataList);
// List View and set the data adapter
listView = (ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Check if it's coming from MediaStore Selection.
if (resultCode == Activity.RESULT_OK &&
requestCode == CustomAdapter.LOAD_IMAGE_RESULT) {
// Get the selected rowIndex
if (adapter != null && dataList != null) {
// check the row index is valid
int rowIndex = adapter.getLastSelectedItemIndex();
if (rowIndex > -1 && rowIndex < dataList.size()) {
// Get the item
ItemData item = dataList.get(rowIndex);
// Update the item with imageUri
item.setImageUri(Uri.parse(data.getData()));
/**
* If you may want to update the information in database,
* then it's the best place, but please do in background thread.
*/
//Now notify the adapter with new changes
adapter.updateItems(dataList);
}
}
}
}
...
}
Какие проблемы возникают после того, как я нажму аватар, и выберите фотографию, как я обновляю аватар в методе onActivityResult? – chenzhongpu