2015-11-03 148 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; 
    } 


} 
相关问题