2015-11-03 4 views
0

У меня есть одно действие, которое содержит список (похожий на fb или instagram feed), и у меня есть кнопки для симпатии к этому элементу, а также количество понравившихся. Теперь предположим, что я нажимаю на изображение, он открывает покомпонентное изображение изображения в отдельном упражнении, которое также имеет кнопку. Если я делаю что-то вроде изображения в разобранном виде, я хочу отразить то же самое на изображении на предыдущем (фиде) экране. Я знаю, что один способ заключается в обновлении фида из бэкэнда по методу onResume() первого действия. Но я не хочу обновлять всю страницу, потерять возможную прокрутку и нарушить работу пользователя только для того, чтобы отразить изменение пользовательского интерфейса и некоторых переменных. Есть ли стандартный способ делать такие вещи? Как это делает facebook или другие подобные приложения? Если есть библиотека, которая могла бы помочь, сообщите мне об этом. Благодарю.Обновить значения от одного вида деятельности до другого

+0

вы получите точное значение только тогда, когда обновляются данные в БД. если вы хотите сделать это в автономном режиме, вы должны хранить свои данные в любом локальном ресурсе. – RAAAAM

+0

Я не хочу поддерживать БД. Фактически приложение, которое я создаю, является своего рода социальным приложением, и я не могу загрузить весь график и сохранить его в БД. Разве нет никакого взлома или метода, который позволил бы мне достичь этого? –

ответ

0

Просто обновите загруженные данные с того места, где подаются адаптеры listview.

Затем вызовите notifyDataSetChanged() на адаптер.

Таким образом, вы обновляете свои данные локально и обновляете свой список.

Невозможно просто обновить одну строку списка, это то, что вы ищете?

+0

Я не понял, что вы написали. Не могли бы вы прояснить? –

+0

Theres разница между повторной загрузкой данных и обновлением списка для отображения изменений. Просто указывая на вторую вещь и спрашивая, ищете ли вы альтернативу обновлять только одну строку, а не весь список. – Nanoc

+0

Я хочу просто обновить одну строку, а не весь список. И предположим, что я повторно загружаю данные, я заменяю объект списка на определенный индекс и вызываю notifyDataSetChanged(), но затем также перезагрузка данных занимает несколько секунд, и изменение не будет мгновенным. –

0

Возможно, вы можете использовать startActivityForResult() и onActivityResult().

Таким образом, вы можете установить код, который подразумевает, что пользователь сделал что-то во втором действии, которое нуждается в первом обновлении данных.

+0

, даже если я это сделаю, как я могу обновить эту конкретную переменную в этом конкретном списке? И как мне передать измененное значение из взорванного экрана на экран подачи, так как я не использую намерение начать работу (фид), я просто закрываю верхнюю активность из заднего стека. –

+0

вы можете передать модель объекта строки на взорванный экран с помощью намерений, а затем, если вы измените его, будут ли изменения отражаться на исходной причине объекта java, передающей объект по ссылке или я ошибаюсь? – Nanoc

+0

Фактически Java передает объекты, передавая копию ссылки. Я не уверен, что предлагает Nanoc.Я думаю, что Android копирует объект в намерении, поэтому изменения в полученном объекте не будут видны в исходном. Во всяком случае, вы можете попробовать и подтвердить – Pelocho

0

Вы можете использовать LocalBroadcastManager для отправки широковещательной передачи, на которую будет прослушиваться предыдущая активность.

Intent intent = new Intent(LIST_UPDATED); 
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent); 
+0

Я предполагаю, что это просто скажет первую (фид) активность, нужно ли обновлять список или нет. Как я могу передать значение измененных переменных в активность фида? –

+0

Передача будет потрачена впустую, если предыдущая активность будет уничтожена. И это не правильный путь. – Sufian

+0

В намерении brodcast вы можете установить любые данные, которые могут обрабатываться отдельно. – Shilpi

1

Мое решение 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; 
    } 


}