Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在其他用户在后端更新数据时刷新列表视图_Java_Android_Json_Listview - Fatal编程技术网

Java 如何在其他用户在后端更新数据时刷新列表视图

Java 如何在其他用户在后端更新数据时刷新列表视图,java,android,json,listview,Java,Android,Json,Listview,我有一个列表视图,其中包含几个来自后端的字段。一个提要是“喜欢的数量”。 当我单击任何列表行时,它会为该行打开一个活动,该活动中有一个like按钮。当用户按下时,它会被附加到服务器上。 现在的问题是,当用户返回列表视图活动时,它应该在列表视图中显示递增的值。怎么做 注意:如果我关闭应用程序并再次启动,Like计数器将增加。 我试图再次从on Resume方法调用Create方法,但每次删除列表视图活动时,它都会生成重复的行副本 这是我的列表活动代码 public class MainActivi

我有一个列表视图,其中包含几个来自后端的字段。一个提要是“喜欢的数量”。 当我单击任何列表行时,它会为该行打开一个活动,该活动中有一个like按钮。当用户按下时,它会被附加到服务器上。 现在的问题是,当用户返回列表视图活动时,它应该在列表视图中显示递增的值。怎么做

注意:如果我关闭应用程序并再次启动,Like计数器将增加。 我试图再次从on Resume方法调用Create方法,但每次删除列表视图活动时,它都会生成重复的行副本

这是我的列表活动代码

public class MainActivity extends Activity {


// Session Manager Class
SessionManager session;

// Log tag
private static final String TAG = MainActivity.class.getSimpleName();

// Movies json url
private static final String url = "MY_URL";
private ProgressDialog pDialog;
private List<Movie> movieList = new ArrayList<Movie>();
private ListView listView;


private CustomListAdapter adapter;
{

    // Creating volley request obj
    JsonArrayRequest movieReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            Movie movie = new Movie();
                            movie.setThumbnailUrl(obj.getString("image"));
                            movie.setTitle(obj.getString("title"));
                            movie.setDate(obj.getString("date"));
                            movie.setVideo(obj.getString("video"));
                            movie.setLikes(obj.getInt("likes"));
                            movie.setId(obj.getInt("id"));

           // adding movie to movies array
                            movieList.add(movie);



                        } catch (JSONException e) {
                            e.printStackTrace();
                        }


                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data

                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            hidePDialog();

        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(movieReq);
}



@Override
protected void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //creating unique ID
    final String deviceId = Settings.Secure.getString(this.getContentResolver(),
            Settings.Secure.ANDROID_ID);
    Toast.makeText(this, deviceId, Toast.LENGTH_SHORT).show();

    Toast.makeText(getApplicationContext(), "User Login Status: " + session.isLoggedIn(), Toast.LENGTH_LONG).show();
    /**
     * Call this function whenever you want to check user login
     * This will redirect user to LoginActivity is he is not
     * logged in
     * */
    session.checkLogin();


    listView = (ListView) findViewById(R.id.list);
    adapter = new CustomListAdapter(this, movieList);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                        @Override
                                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                            // getting values from selected ListItem


                                          //  ImageView thumbNail = (ImageView)view.findViewById(R.id.thumbnail);
                                            String title = ((TextView) view.findViewById(R.id.title)).getText().toString();

                                            String likes = ((TextView)view.findViewById(R.id.likes)).getText().toString();
                                           String date = ((TextView)view.findViewById(R.id.date)).getText().toString();
                                            String video = ((TextView) view.findViewById(R.id.video)).getText().toString();
                                            String idd = ((TextView) view.findViewById(R.id.idd)).getText().toString();


                                            // Starting single contact activity
                                            Intent in = new Intent(getApplicationContext(), MovieDetailActivity.class);
                                           //  in.putExtra("THUMB", thumbNail.toString());
                                            in.putExtra("TITLE", title);
                                            in.putExtra("LIKES", likes);
                                              in.putExtra("DATE", date);
                                            in.putExtra("VIDEO", video);
                                             in.putExtra("IDD", idd);
                                            in.putExtra("UNIQUEID",deviceId);


                                            //in.putExtra(TAG_URL,"url");
                                            // in.putExtra(TAG_PHONE_MOBILE, description);
                                            startActivity(in);

                                        }

                                    }

    );




    // Creating volley request obj
enter code here
    JsonArrayRequest movieReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            Movie movie = new Movie();
                            movie.setThumbnailUrl(obj.getString("image"));
                            movie.setTitle(obj.getString("title"));
                            movie.setDate(obj.getString("date"));
                            movie.setVideo(obj.getString("video"));
                            movie.setLikes(obj.getInt("likes"));
                            movie.setId(obj.getInt("id"));

                            // adding movie to movies array
                            movieList.add(movie);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }


                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data

                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            hidePDialog();

        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(movieReq);
}

@Override
protected void onResume() {
    super.onResume();


}

@Override
public void onDestroy() {
    super.onDestroy();
    hidePDialog();
}

private void hidePDialog() {
    if (pDialog != null) {
        pDialog.dismiss();
        pDialog = null;
    }
}




@Override
 public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

public class CustomListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<Movie> movieItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public CustomListAdapter(Activity activity, List<Movie> movieItems) {
        this.activity = activity;
        this.movieItems = movieItems;
    }

    @Override
    public int getCount() {
        return movieItems.size();
    }

    @Override
    public Object getItem(int location) {
        return movieItems.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.list_row, null);

        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();
        NetworkImageView thumbNail = (NetworkImageView) convertView
                .findViewById(R.id.thumbnail);
        TextView title = (TextView) convertView.findViewById(R.id.title);
        TextView likes = (TextView) convertView.findViewById(R.id.likes);
        TextView date = (TextView) convertView.findViewById(R.id.date);
        TextView video = (TextView) convertView.findViewById(R.id.video);
        TextView id = (TextView) convertView.findViewById(R.id.idd);
        //TextView year = (TextView) convertView.findViewById(R.id.releaseYear);

        // getting movie data for the row
        Movie m = movieItems.get(position);

        // thumbnail image
        thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);

        // title
        title.setText(m.getTitle());

        // rating
        date.setText(m.getDate());
        video.setText(m.getVideo());

        likes.setText(String.valueOf(m.getLikes()));
        id.setText(String.valueOf(m.getId()));


        return convertView;
        // Listview on item click listener

    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }
}

使用SortedList和RecyclerView请求实施:

这是我用来建造我的房子的例子

这是我的稍微复杂一些的代码,其中包括通过工具栏中的SearchView进行排序。如果希望示例不进行排序,可以使用上面链接中的示例。控制逻辑位于管理此适配器和片段的my Presenter类中:

当您调用任何批处理更新时,列表将在UI中自动更新自身。因此,当您获得初始数据时,只需调用addAllyourData,RecyclerView就会自动填充列表。当您获得更新的数据时,只需调用addAllyourNewData,RecyclerView将自动添加新项目并删除不存在的新项目,从而为您留下一个完全更新的列表。您需要确保实现SorterList。回调方法比较…、AreContentsSame…、AreItemsSame。。。以确保在添加/删除项目时,其行为符合您的要求


如果你需要更多的帮助,请告诉我。坦率地说,这种更新和排序数据的实现类型非常平滑。

更改数据集后,调用adapter.notifyDataSetChanged;还要确保它是从主线发出的。这不是回答,而是建议。您会反对使用RecyclerView和SortedList吗?如果没有,则当您再次检索数据并将其应用于RecyclerView时,将使用更新的数据自动更新RecyclerView。它还可以防止重复。如果你有兴趣,请告诉我,我会发布。请发布@anxhatto
public class AdapterInstitutionList extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

// lists to control all items and items visible after sorting
private SortedList<MInstitutionInfo> visibleList;
private ArrayList<MInstitutionInfo> allItems;

// my fragment and the presenter
private FInstitutionSelection fInstitutionSelection;
private PInstitutionList presenter;


public AdapterInstitutionList(PInstitutionList pInstitutionSelection, FInstitutionSelection fInstitutionSelection) {
    // get ref to fragment, presenter, and create new callback for sortedlist
    this.fInstitutionSelection = fInstitutionSelection;
    presenter = pInstitutionSelection;
    visibleList = new SortedList<>(MInstitutionInfo.class, new InstitutionListCallback());
    allItems = new ArrayList<>();

}

// inflate your list item view here
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.listitem_institution, parent, false);
    return new InstitutionViewHolder(view);
}

// on binding, you populate your list item with the values, onclickhandle, etc
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    InstitutionViewHolder institutionViewHolder = (InstitutionViewHolder) viewHolder;
    final MInstitutionInfo institutionInfo = visibleList.get(position);
    institutionViewHolder.setInstitutionInfo(institutionInfo);
    institutionViewHolder.populateTextView();
    institutionViewHolder.parent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            presenter.onInstitutionSelected(institutionInfo);
        }
    });
}


@Override
public int getItemCount() {
    return visibleList.size();
}

// my utility function for the presenter/fragment
public MInstitutionInfo get(int position) {
    return visibleList.get(position);
}

public int add(MInstitutionInfo item) {
    return visibleList.add(item);
}

public int indexOf(MInstitutionInfo item) {
    return visibleList.indexOf(item);
}

public void updateItemAt(int index, MInstitutionInfo item) {
    visibleList.updateItemAt(index, item);
}

public void addAll(List<MInstitutionInfo> items) {
    visibleList.beginBatchedUpdates();
    try {
        for (MInstitutionInfo item : items) {
            visibleList.add(item);
            allItems.add(item);
        }
    } finally {
        visibleList.endBatchedUpdates();
    }
}

public void addAll(MInstitutionInfo[] items) {
    addAll(Arrays.asList(items));
}

public boolean remove(MInstitutionInfo item) {
    return visibleList.remove(item);
}

public MInstitutionInfo removeItemAt(int index) {
    return visibleList.removeItemAt(index);
}

public void clearVisibleList() {
    visibleList.beginBatchedUpdates();
    try {
        // remove items at end to remove unnecessary array shifting
        while (visibleList.size() > 0) {
            visibleList.removeItemAt(visibleList.size() - 1);
        }
    } finally {
        visibleList.endBatchedUpdates();
    }
}

public void clearAllItemsList() {
    allItems.clear();
}

public void filterList(String queryText) {
    clearVisibleList();
    visibleList.beginBatchedUpdates();
    try {
        String constraint = queryText.toLowerCase();
        for (MInstitutionInfo institutionInfo : allItems) {
            if (institutionInfo.getName() != null && institutionInfo.getName().toLowerCase().contains(constraint)) {
                visibleList.add(institutionInfo);
            }
        }
    } finally {
        visibleList.endBatchedUpdates();
    }
}

public void clearFilter() {
    if (visibleList.size() == allItems.size()) {
        return;
    }
    clearVisibleList();
    visibleList.beginBatchedUpdates();
    try {
        for (MInstitutionInfo institutionInfo : allItems) {
            visibleList.add(institutionInfo);
        }
    } finally {
        visibleList.endBatchedUpdates();
    }
}

// the callback for the SortedList
// this manages the way in which items are added/removed/changed/etc
// mine is pretty simple
private class InstitutionListCallback extends SortedList.Callback<MInstitutionInfo> {
    @Override
    public int compare(MInstitutionInfo o1, MInstitutionInfo o2) {
        return o1.getName().compareTo(o2.getName());
    }

    @Override
    public void onInserted(int position, int count) {
        notifyItemRangeInserted(position, count);
    }

    @Override
    public void onRemoved(int position, int count) {
        notifyItemRangeRemoved(position, count);
    }

    @Override
    public void onMoved(int fromPosition, int toPosition) {
        notifyItemMoved(fromPosition, toPosition);
    }

    @Override
    public void onChanged(int position, int count) {
        notifyItemRangeChanged(position, count);
    }

    @Override
    public boolean areContentsTheSame(MInstitutionInfo oldItem, MInstitutionInfo newItem) {
        return oldItem.getName().equals(newItem.getName());
    }

    @Override
    public boolean areItemsTheSame(MInstitutionInfo item1, MInstitutionInfo item2) {
        return item1.getName().equals(item2.getName());
    }
}

// this is the view holder that is used for the list items
private class InstitutionViewHolder extends RecyclerView.ViewHolder {

    public View parent;
    public TextView tvName;
    public MInstitutionInfo institutionInfo;

    public InstitutionViewHolder(View itemView) {
        super(itemView);
        parent = itemView;
        tvName = (TextView) itemView.findViewById(R.id.tv_institution_listitem_name);
    }

    public MInstitutionInfo getInstitutionInfo() {
        return institutionInfo;
    }

    public void setInstitutionInfo(MInstitutionInfo institutionInfo) {
        this.institutionInfo = institutionInfo;
    }

    public void populateTextView() {
        if (tvName != null && institutionInfo != null && institutionInfo.getName() != null) {
            tvName.setText(institutionInfo.getName());
        }
    }

}
myRecyclerView.setAdapter(myAdapter);