pulltorefresh工程研究

来源:互联网 发布:慈安和慈禧的关系知乎 编辑:程序博客网 时间:2024/04/29 10:11

题外话

向list的指定位置添加数据,如果添加位置为最后一个,则放在了最前面刷新显示,否则添加位置如果是0,则刷新后,放在最后一个显示…(像新闻之类的APP,是异步加载的,上拉刷新和下拉刷新都有)

public static void main(String[] args) {  List<String> list=new ArrayList<String>();  list.add("保护环境");     //向列表中添加数据  list.add("爱护地球");     //向列表中添加数据  list.add("从我做起");        //向列表中添加数据  list.add(1,"从我做起");     //在第1+1个元素的位置添加数据  //通过循环输出列表中的内容  for(int i=0;i<list.size();i++){   System.out.println(i+":"+list.get(i));  }}

关于创建菜单

很多东西要写,
android一共有三种形式的菜单:
1.选项菜单(optinosMenu)
2.上下文菜单(ContextMenu)
3.子菜单(subMenu)
其中最常用的就是选项菜单(optionsMenu), 该菜单在点击 menu 按键 后会在对应的Activity顶部显示出来
1.Activity菜单机制 (与dialog类似)
Activity有一套机制来实现对菜单的管理,方法如下

public class MainActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);  }  @Override  public boolean onCreateOptionsMenu(Menu menu) {    /**     * 此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。 返回true则显示该menu,false 则不显示;     * (只会在第一次初始化菜单时调用) Inflate the menu; this adds items to the action bar     * if it is present.     */    getMenuInflater().inflate(R.menu.main, menu);    return true;  }  @Override  public boolean onPrepareOptionsMenu(Menu menu) {    /**     * 在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。 同样的,     * 返回true则显示该menu,false 则不显示; (可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等) TODO     * Auto-generated method stub     */    return super.onPrepareOptionsMenu(menu);  }  @Override  public void onOptionsMenuClosed(Menu menu) {    /**     * 每次菜单被关闭时调用. (菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项) TODO     * Auto-generated method stub     */    super.onOptionsMenuClosed(menu);  }  @Override  public boolean onOptionsItemSelected(MenuItem item) {    /**     * 菜单项被点击时调用,也就是菜单项的监听方法。      * 通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。 TODO Auto-generated     * method stub     */    return super.onOptionsItemSelected(item);  }}
  1. 添加菜单:
    可以在onCreateOptionsMenu或者 onPrepareOptionsMenu方法中来添加菜单
    和上下文菜单这三项,onCreateContextMenu()
    2.1代码添加:
menu.add方法最多有4个参数,该方法有4种重载形式,定义如下:public MenuItem add(int titleRes)public MenuItem add(CharSequence title)public MenuItem add(int groupid, int itemid, int order, int titleRes)public MenuItem add(int groupid, int itemid, int order,CharSequence title)

需要添加的代码是 menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)

   add()方法的四个参数,依次是:   1、组别,如果不分组的话就写Menu.NONE,   2、Id,这个很重要,Android根据这个Id来确定不同的菜单   3、顺序,哪个菜单项在前面由这个参数的大小决定   4、文本,菜单项的显示文本   add()方法返回的是MenuItem对象,调用其setIcon()方法,为相应MenuItem设置Icon  示例: 

public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(Menu.NONE, Menu.First+1 , 0, "设置").setIcon(R.drawable.setting);
return true;
}

  2.2布局文件添加:  `  getMenuInflater().inflate(R.menu.options_menu, menu); `  调用Activity的getMenuInflater()得到一个MenuInflater,     使用inflate方法来把布局文件中的定义的菜单 加载给 第二个参数所对应的menu对象    示例: 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate( R.menu.options_menu , menu);
return true;
}

布局文件:
在res目录下建立一个menu文件夹,并创建布局文件: options_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id=" @+id/menu_setting " android:title="设置" android:icon="@drawable/setting"></item>
</menu>

3.菜单项监听
响应选项菜单项单击事件的3种方式。

3.1.设置菜单项的单击事件的对象的实例,通过MenuItem接口的setOnMenuItemClickListener方法可以设置菜单项的单击事件。该方法有一个OnMenuItemClick类型参数。菜单项的单击事件类必须实现OnMenuItemClickListener接口。

3.2.可以用OnMenuItemSelected方法响应菜单项的单击事件
public boolean OnMenuItemSelected(int featureid, MenuItem item)

事实上,当onMenuItemClick方法返回true时,即设置了菜单项的单击事件后,另两种单击事件响应方式都失效了,系统不会再调用2,3的两种方式。但如果没有设置1这种方式,调用2,3的顺序为onMenuItemSelected方法调用父类super.onMenuItemSelected()方法的位置前后,因为父类的OnMenuItemSelected方法调用了onOptionsItemSelected方法

//如果将super.onMenuItemSelected方法放在最后面,系统会执行完onMenuItemSelected方法中的代码,之后再调用onOptionsItemSelected方法@Overridepublic boolean onMenuItemSelected(int featureid, MenuItem item){    super.onMenuItemSelected(featureid,item);//这句话调用了onOptionsItemSelected方法.    return true;}

3.3. 只要菜单中的菜单项被点击,都会触发onOptionsItemSelected(MenuItem item)
item参数即为被点击的菜单项,那么需要在此方法内判断哪个Item被点击了,从而实现不同的操作。
对于两种不同的添加菜单方法,判断的方法有一点区别,但本质是一样的。

3.3.1. 代码添加菜单的判断方法
java
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch(item.getItemId()) //得到被点击的item的itemId
{
case Menu.First+1 : //对应的ID就是在add方法中所设定的Id
break;
case Menu.First+2 :
break;
}
return true;
}

3.3.2.布局文件添加菜单的判断方法:
java
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch(item.getItemId()) //得到被点击的item的itemId
{
case R.id.menu_setting : //这里的Id就是布局文件中定义的Id,在用R.id.XXX的方法获取出来
break;
case R.id.menu_info:
break;
}
return true;
}


研究PullToRefreshListActivity

PullToRefreshListActivity.Java

/******************************************************************************* * Copyright 2011, 2012 Chris Banes. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/package com.handmark.pulltorefresh.samples;import java.util.Arrays;import java.util.LinkedList;import android.app.ListActivity;import android.os.AsyncTask;import android.os.Bundle;import android.text.format.DateUtils;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import com.handmark.pulltorefresh.library.PullToRefreshBase;import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;import com.handmark.pulltorefresh.library.PullToRefreshBase.OnLastItemVisibleListener;import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;import com.handmark.pulltorefresh.library.PullToRefreshBase.State;import com.handmark.pulltorefresh.library.PullToRefreshListView;import com.handmark.pulltorefresh.library.extras.SoundPullEventListener;public final class PullToRefreshListActivity extends ListActivity {    static final int MENU_MANUAL_REFRESH = 0;    static final int MENU_DISABLE_SCROLL = 1;    static final int MENU_SET_MODE = 2;    static final int MENU_DEMO = 3;    private LinkedList<String> mListItems;    private PullToRefreshListView mPullRefreshListView;    private ArrayAdapter<String> mAdapter;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_ptr_list);        mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);        // Set a listener to be invoked when the list should be refreshed.        mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {            @Override            public void onRefresh(PullToRefreshBase<ListView> refreshView) {                String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),                        DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);                // Update the LastUpdatedLabel                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);                // Do work to refresh the list here.                new GetDataTask().execute();            }        });        // Add an end-of-list listener,提示已经到了列表最后一项...        mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {            @Override            public void onLastItemVisible() {                Toast.makeText(PullToRefreshListActivity.this, "End of List!", Toast.LENGTH_SHORT).show();            }        });        ListView actualListView = mPullRefreshListView.getRefreshableView();        // Need to use the Actual ListView when registering for Context Menu        registerForContextMenu(actualListView);        mListItems = new LinkedList<String>();        mListItems.addAll(Arrays.asList(mStrings));        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems);        /**         * Add Sound Event Listener         */        SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(this);        soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);        soundListener.addSoundEvent(State.RESET, R.raw.reset_sound);        soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);        mPullRefreshListView.setOnPullEventListener(soundListener);        // You can also just use setListAdapter(mAdapter) or        // mPullRefreshListView.setAdapter(mAdapter)        actualListView.setAdapter(mAdapter);    }    private class GetDataTask extends AsyncTask<Void, Void, String[]> {        @Override        protected String[] doInBackground(Void... params) {            // Simulates a background job.            try {                Thread.sleep(4000);            } catch (InterruptedException e) {            }            return mStrings;        }        @Override        protected void onPostExecute(String[] result) {            mListItems.addFirst("Added after refresh...");            mAdapter.notifyDataSetChanged();            // Call onRefreshComplete when the list has been refreshed.            mPullRefreshListView.onRefreshComplete();            super.onPostExecute(result);        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        menu.add(0, MENU_MANUAL_REFRESH, 0, "Manual Refresh");        menu.add(0, MENU_DISABLE_SCROLL, 1,                mPullRefreshListView.isScrollingWhileRefreshingEnabled() ? "Disable Scrolling while Refreshing"                        : "Enable Scrolling while Refreshing");        menu.add(0, MENU_SET_MODE, 0, mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_PULL_DOWN"                : "Change to MODE_PULL_BOTH");        menu.add(0, MENU_DEMO, 0, "Demo");        return super.onCreateOptionsMenu(menu);    }    @Override    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {        AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;        menu.setHeaderTitle("Item: " + getListView().getItemAtPosition(info.position));        menu.add("Item 1");        menu.add("Item 2");        menu.add("Item 3");        menu.add("Item 4");        //这个函数是什么意思...        super.onCreateContextMenu(menu, v, menuInfo);    }    @Override    public boolean onPrepareOptionsMenu(Menu menu) {//这里是在显示选项菜单前的工作...        MenuItem disableItem = menu.findItem(MENU_DISABLE_SCROLL);        disableItem                .setTitle(mPullRefreshListView.isScrollingWhileRefreshingEnabled() ? "Disable Scrolling while Refreshing"                        : "Enable Scrolling while Refreshing");        MenuItem setModeItem = menu.findItem(MENU_SET_MODE);        setModeItem.setTitle(mPullRefreshListView.getMode() == Mode.BOTH ? "Change to MODE_FROM_START"                : "Change to MODE_PULL_BOTH");        return super.onPrepareOptionsMenu(menu);    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case MENU_MANUAL_REFRESH:                new GetDataTask().execute();                mPullRefreshListView.setRefreshing(false);                break;            case MENU_DISABLE_SCROLL:                mPullRefreshListView.setScrollingWhileRefreshingEnabled(!mPullRefreshListView                        .isScrollingWhileRefreshingEnabled());                break;            case MENU_SET_MODE:                mPullRefreshListView.setMode(mPullRefreshListView.getMode() == Mode.BOTH ? Mode.PULL_FROM_START                        : Mode.BOTH);                break;            case MENU_DEMO:                mPullRefreshListView.demo();                break;        }        return super.onOptionsItemSelected(item);    }    private String[] mStrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",            "Allgauer Emmentaler", "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",            "Allgauer Emmentaler" };}

探究ExpandableListView

0 0
原创粉丝点击