android 列表视图自动刷新

android listview autorefresh

我正在列表视图中显示数据库中的内容,它工作正常我正在使用自动刷新,因此它会在几秒钟后更新。问题是 在我向下滚动一点并自动刷新后,它会将我带到列表视图的顶部,我只想让它保持在滚动后的位置,或者这是一种更好的自动刷新方式,无需重新加载已加载的内容...

这是我的代码

public class Chatting extends ListActivity {
// fr the sending of message
    private static final String TAG_POSTS = "posts";
    public static final String TAG_ID = "id";
    public static final String TAG_time = "time";
    public static final String TAG_state = "state";
    public static final String TAG_MESSAGE = "categories_message";
    public static final String TAG_CATEGORIES_LOGO = "categories_logo";
    public static final String TAG_from = "from ";
    //end


    JSONParser jsonParser = new JSONParser();
    private ProgressDialog pDialog;

    private static final String URL_CATEGORY = "http://10.0.2.2/ochat/selectmess.php";

    private BaseAdapter mAdapter;
    EditText mess;
    private ListView lv;
    ImageButton send;
    private static final String TAG_SUCCESS = "success";
    Intent b = getIntent();
    String state;
    int flag = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.yon);
        mess = (EditText) findViewById(R.id.mess);
        send = (ImageButton) findViewById(R.id.send);
        lv = getListView();
        lv.setDivider(null);

        lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View view,
                    int position, long arg3) {

                Toast.makeText(Chatting.this, "Item selected: " + position,
                        Toast.LENGTH_LONG).show();

            }
        });

        final Handler ham = new Handler();
        Runnable race = new Runnable() {

            @Override
            public void run() {
                new LoadComments().execute();
                ham.postDelayed(this, 1 * 1000);
            }

        };
        ham.postDelayed(race, 4 * 1000);

        sending();
    }

    private void sending() {
        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {


                if (!isOnline(Chatting.this)) {
                    Toast.makeText(Chatting.this, "No network connection",
                            Toast.LENGTH_LONG).show();
                    return;
                }



            }


            private boolean isOnline(Context mContext) {
                ConnectivityManager cm = (ConnectivityManager) mContext
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                if (netInfo != null && netInfo.isConnectedOrConnecting()) {
                    return true;
                }
                return false;
            }

        });

    }

        class LoadComments extends
            AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
        private ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Chatting.this);

            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);

        }

        @Override
        protected ArrayList<HashMap<String, String>> doInBackground(
                Void... arg0) {

            ArrayList<HashMap<String, String>> categoryList = new ArrayList<HashMap<String, String>>();

            SharedPreferences sp = PreferenceManager
                    .getDefaultSharedPreferences(Chatting.this);
            String friend = sp.getString("value", "anon");
            String username = sp.getString("username", "anon");

            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username", username));
            params.add(new BasicNameValuePair("friend", friend));
            JSONObject json = jsonParser.makeHttpRequest(URL_CATEGORY, "POST",
                    params);


            try {           
                JSONArray categories = json.getJSONArray(TAG_POSTS);

                for (int i = 0; i < categories.length(); i++) {
                    String id = categories.getJSONObject(i).getString("TAG_ID");
                    String time = categories.getJSONObject(i).getString(
                            "TAG_time");
                    String songs_count = categories.getJSONObject(i).getString(
                            "TAG_CATEGORIES_COUNT");
                    String from = categories.getJSONObject(i).getString(
                            "TAG_from");
                state = categories.getJSONObject(i).getString(
                            "TAG_state");

                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put(TAG_ID, id);
                    map.put(TAG_time, time);
                    map.put(TAG_MESSAGE, songs_count);
                    map.put(TAG_from, from);
                    map.put(TAG_state, state);

                    categoryList.add(map);
                }
            } catch (Throwable e) {
                e.printStackTrace();
            }
            return categoryList;
        }

        @Override
        protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
            super.onPostExecute(result);
            if(pDialog.isShowing()){
                pDialog.dismiss();
            }
            mAdapter = new MessageCategoryList(Chatting.this,result);
            lv.setAdapter(mAdapter);
            mAdapter.notifyDataSetChanged();


        }
    }


      }

您可以通过调用存储您的 ListView 的当前位置:

getListView().getFirstVisiblePosition();

您可以在刷新后使用以下任一方式滚动回先前的位置:

getListView().setSelection(priorPosition); , 要么 getListView().smoothScrollToPosition(priorPosition);