将值从一个活动更新到另一个活

时间:2015-11-03 13:40:58

标签: android android-activity android-listview feed

我有一个活动,其中包含一个列表(类似于fb或Instagram Feed),我有喜欢该项目的按钮,它还显示了喜欢的数量。现在假设我单击图像,它会在单独的活动中打开图像的分解视图,该活动也具有类似按钮。如果我在爆炸视图活动中对图像执行类似操作,我想在之前(Feed)屏幕上的图像上反映相同的内容。我知道一种方法是从第一个活动的onResume()方法的后端刷新提要。但是我不想刷新整个页面,丢失可能的滚动并破坏用户体验只是为了反映UI和一些变量的变化。做这些事情的标准方法有哪些? Facebook或其他类似应用程序如何实现这一目标?如果有任何图书馆可以提供帮助,请告诉我。感谢。

4 个答案:

答案 0 :(得分: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;
    }


}

答案 1 :(得分:0)

只需刷新listview适配器所提供的下载数据。

然后在适配器上调用notifyDataSetChanged()。

这样您就可以在本地更新数据并刷新列表。

不可能只更新列表视图的一行,那是你在寻找什么?

答案 2 :(得分:0)

也许您可以使用startActivityForResult()onActivityResult()

这样你就可以设置一个代码,暗示用户在第二个活动中做了一些需要第一个刷新数据的东西。

答案 3 :(得分:0)

您可以使用LocalBroadcastManager发送您之前活动将要收听的广播。

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