Android实时列表视图(RESOLVE)

时间:2015-08-24 13:22:16

标签: php android sqlite listview

我有一个用于后端的PHP,它可以将一个事件插入我的数据库,并将放入我的Android App ListView,但是当App已经运行时它不会添加。我试过notifyDataSetChanged();并且它无效。

以下是我的新闻源代码( ListView

private ListView listView;
private FeedListAdapter listAdapter;
private List<FeedItem> feedItems;
private String URL_FEED = "webserver";


@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_newsfeed, container, false);
    listView = (ListView) v.findViewById(R.id.list);
    feedItems = new ArrayList<>();
    listAdapter = new FeedListAdapter(getActivity(), feedItems);
    listView.setAdapter(listAdapter);
    //       new ColorDrawable(getResources().getColor(android.R.color.transparent)));
    // We first check for cached request
    Cache cache = AppController.getInstance().getRequestQueue().getCache();
    Cache.Entry entry = cache.get(URL_FEED);
    if (entry != null) {
        // fetch the data from cache
        try {
            String data = new String(entry.data, "UTF-8");
            try {
                parseJsonFeed(new JSONObject(data));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    } else {
        // making fresh volley request and getting json
        JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET,
                URL_FEED, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                VolleyLog.d(TAG, "Response: " + response.toString());
                if (response != null) {
                    parseJsonFeed(response);
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
            }

        });
        // Adding request to volley request queue
        AppController.getInstance().addToRequestQueue(jsonReq);
        v.bringToFront();
    }return v;
}
/**
     * Parsing json reponse and passing the data to feed view list adapter
     * */
private void parseJsonFeed(JSONObject response) {
    try {
        JSONArray feedArray = response.getJSONArray("newsfeed");

        for (int i = 0; i < feedArray.length(); i++) {
            JSONObject feedObj = (JSONObject) feedArray.get(i);

            FeedItem item = new FeedItem();
            item.setId(feedObj.getInt("id"));
            item.setName(feedObj.getString("title"));

            // Image might be null sometimes
            String image = feedObj.isNull("image") ? null : feedObj
                    .getString("image");
            item.setImge(image);

            item.setStatus(feedObj.getString("type"));
            item.setProfilePic(feedObj.getString("profilePic"));
            item.setTimeStamp(feedObj.getString("timestamp"));
            feedItems.add(item);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

FeedListAdapter的代码

public class FeedListAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<FeedItem> feedItems;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();

public FeedListAdapter(Activity activity, List<FeedItem> feedItems) {
    this.activity = activity;
    this.feedItems = feedItems;
}



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

@Override
public Object getItem(int location) {
    return feedItems.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.feed_item, null);

    if (imageLoader == null)
        imageLoader = AppController.getInstance().getImageLoader();

    TextView name = (TextView) convertView.findViewById(R.id.name);
    TextView timestamp = (TextView) convertView
            .findViewById(R.id.timestamp);
    TextView statusMsg = (TextView) convertView
            .findViewById(R.id.txtStatusMsg);
    TextView url = (TextView) convertView.findViewById(R.id.txtUrl);
    NetworkImageView profilePic = (NetworkImageView) convertView
            .findViewById(R.id.profilePic);
    FeedImageView feedImageView = (FeedImageView) convertView
            .findViewById(R.id.feedImage1);

    FeedItem item = feedItems.get(position);

    name.setText(item.getName());

    // Converting timestamp into x ago format
    CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
            Long.parseLong(item.getTimeStamp()),
            System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);
    timestamp.setText(timeAgo);

    // Chcek for empty status message
    if (!TextUtils.isEmpty(item.getStatus())) {
        statusMsg.setText(item.getStatus());
        statusMsg.setVisibility(View.VISIBLE);
    } else {
        // status is empty, remove from view
        statusMsg.setVisibility(View.GONE);
    }

    // Checking for null feed url
    if (item.getUrl() != null) {
        url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">"
                + item.getUrl() + "</a> "));

        // Making url clickable
        url.setMovementMethod(LinkMovementMethod.getInstance());
        url.setVisibility(View.VISIBLE);
    } else {
        // url is null, remove from the view
        url.setVisibility(View.GONE);
    }

    // user profile pic
    profilePic.setImageUrl(item.getProfilePic(), imageLoader);

    // Feed image
    if (item.getImge() != null) {
        feedImageView.setImageUrl(item.getImge(), imageLoader);
        feedImageView.setVisibility(View.VISIBLE);
        feedImageView
                .setResponseObserver(new FeedImageView.ResponseObserver() {
                    @Override
                    public void onError() {
                    }

                    @Override
                    public void onSuccess() {
                    }
                });
    } else {
        feedImageView.setVisibility(View.GONE);
    }

    return convertView;
}}

我想要的是如果我在我的数据库中插入一个新事件,它会自动添加到我的ListView上,例如 Facebook 我该怎么做?代码

2 个答案:

答案 0 :(得分:1)

它并不困难,只是有点棘手 互联网上有很多教程 请遵循此Tutorial

或者你可以通过使用Library Volley实现这一点Tutorial

这是带图像和textViews Tutorial

的图片

答案 1 :(得分:1)

要更新ListView中的数据,请在FeedListAdapter适配器类中创建一个方法,并在Adapter数据源中添加新数据后调用notifyDataSetChanged

public void addAllItems(ArrayList<String> arritems){
  <Array_List>.addAll(arritems);
  this.notifyDataSetChanged();
}

其中<Array_List>是您在getViewgetCount()适配器的FeedListAdapter方法中使用的ArrayList对象。

现在从addAllItems致电onResponse

@Override
  public void onResponse(JSONObject response) {
   VolleyLog.d(TAG, "Response: " + response.toString());
   if (response != null) {
     ArrayList<String> newitems= parseJsonFeed(response);
      listAdapter.addAllItems(newitems);
    }
  }