У меня есть одно действие, которое содержит список (похожий на fb или instagram feed), и у меня есть кнопки для симпатии к этому элементу, а также количество понравившихся. Теперь предположим, что я нажимаю на изображение, он открывает покомпонентное изображение изображения в отдельном упражнении, которое также имеет кнопку. Если я делаю что-то вроде изображения в разобранном виде, я хочу отразить то же самое на изображении на предыдущем (фиде) экране. Я знаю, что один способ заключается в обновлении фида из бэкэнда по методу onResume()
первого действия. Но я не хочу обновлять всю страницу, потерять возможную прокрутку и нарушить работу пользователя только для того, чтобы отразить изменение пользовательского интерфейса и некоторых переменных. Есть ли стандартный способ делать такие вещи? Как это делает facebook или другие подобные приложения? Если есть библиотека, которая могла бы помочь, сообщите мне об этом. Благодарю.Обновить значения от одного вида деятельности до другого
ответ
Просто обновите загруженные данные с того места, где подаются адаптеры listview.
Затем вызовите notifyDataSetChanged() на адаптер.
Таким образом, вы обновляете свои данные локально и обновляете свой список.
Невозможно просто обновить одну строку списка, это то, что вы ищете?
Я не понял, что вы написали. Не могли бы вы прояснить? –
Theres разница между повторной загрузкой данных и обновлением списка для отображения изменений. Просто указывая на вторую вещь и спрашивая, ищете ли вы альтернативу обновлять только одну строку, а не весь список. – Nanoc
Я хочу просто обновить одну строку, а не весь список. И предположим, что я повторно загружаю данные, я заменяю объект списка на определенный индекс и вызываю notifyDataSetChanged(), но затем также перезагрузка данных занимает несколько секунд, и изменение не будет мгновенным. –
Возможно, вы можете использовать startActivityForResult()
и onActivityResult()
.
Таким образом, вы можете установить код, который подразумевает, что пользователь сделал что-то во втором действии, которое нуждается в первом обновлении данных.
, даже если я это сделаю, как я могу обновить эту конкретную переменную в этом конкретном списке? И как мне передать измененное значение из взорванного экрана на экран подачи, так как я не использую намерение начать работу (фид), я просто закрываю верхнюю активность из заднего стека. –
вы можете передать модель объекта строки на взорванный экран с помощью намерений, а затем, если вы измените его, будут ли изменения отражаться на исходной причине объекта java, передающей объект по ссылке или я ошибаюсь? – Nanoc
Фактически Java передает объекты, передавая копию ссылки. Я не уверен, что предлагает Nanoc.Я думаю, что Android копирует объект в намерении, поэтому изменения в полученном объекте не будут видны в исходном. Во всяком случае, вы можете попробовать и подтвердить – Pelocho
Вы можете использовать LocalBroadcastManager для отправки широковещательной передачи, на которую будет прослушиваться предыдущая активность.
Intent intent = new Intent(LIST_UPDATED);
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
Я предполагаю, что это просто скажет первую (фид) активность, нужно ли обновлять список или нет. Как я могу передать значение измененных переменных в активность фида? –
Передача будет потрачена впустую, если предыдущая активность будет уничтожена. И это не правильный путь. – Sufian
В намерении brodcast вы можете установить любые данные, которые могут обрабатываться отдельно. – Shilpi
Мое решение onActivityResult() + notifyDataSetChanges() мой код в течение 10 минут не совершенным, но:
public class MainActivity extends Activity {
private AdapterListView adapterListView;
private int adapterUpdateItemPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
ListView listView = (ListView) findViewById(R.id.listView);
ArrayList<SomeObject> list = new ArrayList<>();
for (int i = 0 ; i < 20 ; i++)
list.add(new SomeObject());
adapterListView = new AdapterListView((LayoutInflater) getApplicationContext()
.getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE), list);
listView.setAdapter(adapterListView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapterUpdateItemPosition = position;
startActivityForResult(new Intent(MainActivity.this, SecondActivity.class), SecondActivity.REQUEST_UPDATE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if (requestCode == SecondActivity.REQUEST_UPDATE){
adapterListView.updateListView(adapterUpdateItemPosition, data.getBooleanExtra(SecondActivity.ADAPTER_POSITION, false));
}
}
}
}
public class SecondActivity extends Activity {
public static final String ADAPTER_POSITION = "ADAPTER_POSITION";
public static final int REQUEST_UPDATE = 2321;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.item_grid);
findViewById(R.id.tv_item_grid).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setResult(RESULT_OK, new Intent().putExtra(ADAPTER_POSITION, true));
finish();
}
});
}
}
public class AdapterListView extends BaseAdapter {
private LayoutInflater lInflater;
private ArrayList<SomeObject> objects;
public AdapterListView(LayoutInflater lInflater, ArrayList<SomeObject> objects) {
this.lInflater = lInflater;
this.objects = objects;
}
@Override
public int getCount() {
return objects.size();
}
@Override
public SomeObject getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item_grid, parent, false);
}
SomeObject p = getItem(position);
if(p.isLike()) {
((TextView) view.findViewById(R.id.tv_item_grid)).setText("LIKE");
} else ((TextView) view.findViewById(R.id.tv_item_grid)).setText("NOT LIKE");
return view;
}
public void updateListView(int position, boolean isLike){
getItem(position).setLike(isLike);
notifyDataSetChanged();
}
}
public class SomeObject{
private boolean like = false;
public boolean isLike() {
return like;
}
public void setLike(boolean like) {
this.like = like;
}
}
вы получите точное значение только тогда, когда обновляются данные в БД. если вы хотите сделать это в автономном режиме, вы должны хранить свои данные в любом локальном ресурсе. – RAAAAM
Я не хочу поддерживать БД. Фактически приложение, которое я создаю, является своего рода социальным приложением, и я не могу загрузить весь график и сохранить его в БД. Разве нет никакого взлома или метода, который позволил бы мне достичь этого? –