2015-11-03 149 views
0

我有一個活動,其中包含一個列表(類似於fb或instagram饋送),並且我有喜歡該項目的按鈕,並且它還顯示喜歡的數量。現在假設我點擊圖像,它會在單獨的活動中打開圖像的分解視圖,該活動也具有按鈕。如果我在爆炸視圖活動中對圖像進行了類似操作,我想在前一個(feed)屏幕中的圖像上反映相同的內容。我知道一種方法是從第一個活動的onResume()方法的後端刷新源。但我不想刷新整個頁面,僅僅爲了反映UI和一些變量的變化而丟失可能的滾動並破壞用戶體驗。有沒有任何標準的方式來做這些事情? Facebook或其他類似的應用如何實現這一目標?如果有任何圖書館可以提供幫助,請讓我知道。謝謝。將一個活動的值更新爲另一個活動

+0

您將獲得只有當數據更新到數據庫精確值。如果您想在離線狀態下執行此操作,則必須將數據保存在任何本地資源中。 – RAAAAM

+0

我不想維護數據庫。其實我正在創建的應用程序是一種社交應用程序,我無法下載整個圖並將其保存到數據庫。是否有任何黑客或方法可以讓我實現這一目標? –

回答

0

只需刷新從listview適配器提供的下載數據。

然後在適配器上調用notifyDataSetChanged()。

這樣你就可以在本地更新你的數據並刷新你的列表。

不可能只是更新listview的一行,那是你在找什麼?

+0

我不明白你寫的是什麼。你能澄清一下嗎? –

+0

Theres與redownloading數據和刷新列表以顯示更改之間的區別。只要指出第二件事,並詢問您是否正在尋找替代方案來更新一行而不是整個列表視圖。 – Nanoc

+0

我想更新一行,而不是整個列表。假設我重新下載了數據,我在特定索引處替換了列表對象,然後調用notifyDataSetChanged(),但同樣,重新下載數據需要幾秒鐘,並且更改不會是即時的。 –

0

也許你可以使用startActivityForResult()onActivityResult()

通過這種方式,您可以設置一個代碼,這意味着用戶在需要首先刷新數據的第二個活動中創建了一些內容。

+0

即使我這樣做,我該如何實際更新該特定列表索引中的特定變量?我如何將改變後的值從爆炸屏幕傳遞給Feed屏幕,因爲我沒有使用意圖來啓動一個活動(feed),我只是關閉了後端堆棧中的頂級活動。 –

+0

您可以通過intent extras將行對象模型傳遞給分解屏幕,然後,如果修改它,這些更改是否會反映在原始對象上,原因是java通過引用傳遞對象或者我錯了? – Nanoc

+0

事實上,Java通過傳遞引用的副本來傳遞對象。我不確定Nanoc建議的作品。我認爲Android在意圖中複製對象,以便接收對象中的更改在原始對象中不可見。無論如何,你可以試試看,並確認 – Pelocho

0

您可以使用LocalBroadcastManager發送您的上一個活動將要偵聽的廣播。

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

我想,這將只是告訴第一(飼料)活動列表是否需要更新或不。我如何實際將更改的變量的值傳遞給Feed活動? –

+0

如果以前的活動被破壞,廣播將被浪費。這是不正確的。 – Sufian

+0

在brodcast的意圖中,您可以設置任何可parcelleable的數據。 – 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; 
    } 


} 
相關問題