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