您的位置:首页 > 移动开发 > Android开发

加载更多

2013-11-29 23:51 417 查看
  最近朋友打电话询问android应用中加载更多的功能,就抽时间写了一下。先说下原理:UI中有两个部分,一个就是信息listView,另一个就是信息下面的点击按钮->加载更多。信息部分初始化肯定是有一部分信息,点击按钮之后让信息刷新以加载更多,其实也没什么难点,一个内容实体类,一个内容适配器,上代码吧。

    Main布局:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >

       <ListView

        android:id="@+id/list"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" >

       </ListView>

   </LinearLayout>

加载更多的按钮我写的是另一个布局,他们不在一起,当然也可以在一起,走向目的地有很多条路,另一个就留给大家去写。

  实体类我也贴出来吧:

     /**

 * 内容实体类

 *

 * @author wp

 *

 */

public class Contexs {

 String title, context;

 public String getTitle() {

  return title;

 }

 public void setTitle(String title) {

  this.title = title;

 }

 public String getContext() {

  return context;

 }

 public void setContext(String context) {

  this.context = context;

 }

}

MainActivity:

     public class MainActivity extends Activity implements OnScrollListener {

 ListView listView;

 int lastIndex = 0;// 最后一行的标志位

 int visibleItemCount;// 可见项数目

 int itemSize = 38;// 总数

 View loadMoreView;

 Button loadButton;

 public static View view;

 ItemAdapter adapter;

 @Override

 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  view = getLayoutInflater().inflate(R.layout.list_item, null);

  listView = (ListView) findViewById(R.id.list);

  loadMoreView = LayoutInflater.from(this).inflate(R.layout.load_button,

    null);

  loadButton = (Button) loadMoreView.findViewById(R.id.but);

  listView.addFooterView(loadMoreView);

  List<Contexs> contexs = new ArrayList<Contexs>();

  for (int i = 0; i < 10; i++) {

   Contexs con = new Contexs();

   con.setTitle("title" + i);

   con.setContext("this is context" + i);

   contexs.add(con);

  }

  adapter = new ItemAdapter(contexs);

  listView.setAdapter(adapter);

  listView.setOnScrollListener(this);

  final Handler handler = new Handler();

  loadButton.setOnClickListener(new OnClickListener() {

   @Override

   public void onClick(View arg0) {

    // TODO Auto-generated method stub

    loadButton.setText("正在加载...");

    handler.postDelayed(new Runnable() {

     @Override

     public void run() {

      // TODO Auto-generated method stub

      loadButton.setText("查看更多...");

      loadMoreData();

      adapter.notifyDataSetChanged();

     }

    }, 3000);

   }

  });

 }

 // 加载更多

 private void loadMoreData() {

  int count = adapter.getCount();

  if (count + 10 <= itemSize) {

   for (int i = count + 1; i <= count + 10; i++) {

    Contexs con = new Contexs();

    con.setTitle("title" + i);

    con.setContext("this is context" + i);

    adapter.addItem(con);

   }

  }

 }

 @Override

 public boolean onCreateOptionsMenu(Menu menu) {

  // Inflate the menu; this adds items to the action bar if it is present.

  getMenuInflater().inflate(R.menu.main, menu);

  return true;

 }

 @Override

 public void onScroll(AbsListView view, int firstVisibleItem,

   int visibleItemCount, int totalItemCount) {

  // TODO Auto-generated method stub

  this.visibleItemCount = visibleItemCount;

  lastIndex = firstVisibleItem + visibleItemCount - 1;

  // 如果加载完成全部,则去掉按钮

  if (totalItemCount == itemSize) {

   listView.removeFooterView(loadMoreView);

  }

 }

 @Override

 public void onScrollStateChanged(AbsListView view, int scrollState) {

  // TODO Auto-generated method stub

 }

}

最近鼠标有点问题,格式改起来有点累,不太一样的大家多包涵。

接下来,是适配器了,排版的顺序有点错了,大家理解最大:

    Adapter:

public class ItemAdapter extends BaseAdapter {

 List<Contexs> context;

 public ItemAdapter(List<Contexs> context) {

  this.context = context;

 }

 @Override

 public int getCount() {

  // TODO Auto-generated method stub

  return context.size();

 }

 @Override

 public Object getItem(int arg0) {

  // TODO Auto-generated method stub

  return context.get(arg0);

 }

 @Override

 public long getItemId(int arg0) {

  // TODO Auto-generated method stub

  return arg0;

 }

 @Override

 public View getView(int arg0, View arg1, ViewGroup arg2) {

  // TODO Auto-generated method stub

  if (arg1 == null) {

   arg1 = MainActivity.view;

  }

  TextView title = (TextView) arg1.findViewById(R.id.item_title);

  title.setText(context.get(arg0).getTitle());

  TextView con = (TextView) arg1.findViewById(R.id.item_context);

  con.setText(context.get(arg0).getContext());

  return arg1;

 }

 // 添加数据

 public void addItem(Contexs conItem) {

  context.add(conItem);

 }

}

上面注释的也挺清楚,我就不多说什么了,这个难度也不是多大,还有一个,如果大家的功能是滑屏自动刷新的话,也没什么大的改动,布局中就没有加载更多了,然后 就是在onScrollListener中OnScorll和onScrollStateChanged中重写一下这些方法,道理一样的。希望以上的可以帮助刚刚入门的同僚,今晚就到这吧,有什么问题,欢迎大家多多评论。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息