listview的下拉刷新和上滑加载。
2016-05-22 17:08
302 查看
listview需要适配器,更改数据之后,在适配器中实现数据的addall操作即可。
下拉刷新:
布局:
listview适配器:注意addall操作:
fragment:
这里我用本地服务器写了一个json文件,并对它进行了解析,刷新用了handle操作实现,获取数据完毕后addall。
以上就是下拉操作的实现,下面是上滑加载,当快加载到末端时自动加载。
该碎片继承了AbsListView.OnScrollListener接口,并在快到末端时实现加载操作。
xml:
适配器如下:
public class NewsItem {
String title;
String id;
public NewsItem(String title,String id)
{
this.title=title;
this.id=id;
}
public String getNewsTitle()
{
return title;
}
public String getTypeId()
{
return id;
}
}
news为实习时做一个新闻客户端实现的,上滑显示最新消息,当上拉到底部时,就加载历史记录并展示,json数据解析我用了官方的jsonobject,还有其它解析方式,相对来说更简单。
总结:总的来说就是一个对控件的监听然后实现响应组件的数据更新并更新UI
下拉刷新:
布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>
listview适配器:注意addall操作:
public class FruitAdapter extends ArrayAdapter { private int resourceId; private final int TYPE_ONE=0,TYPE_TWO=1,TYPE_COUNT=2; public FruitAdapter(Context context, int resource) { super(context, resource); resourceId=resource; } public void initData(List<Fruit> objects){ clear(); addAll(objects); } @Override //每个子项被滚动到屏幕内的时候会被调用 public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit= (Fruit) getItem(position); int type=getItemViewType(position); ViewHolder viewHolder = null; ViewHolder2 viewHolder2=null; //为空加载布局,不为空重用 if (convertView==null) { //加载布局 convertView= LayoutInflater.from(getContext()).inflate(resourceId, null); //convertView为空就创建,不为空调用 viewHolder=new ViewHolder() ; //获取实例 viewHolder.fruitImage= (ImageView) convertView.findViewById(R.id.fruit_image); viewHolder.fruitName= (TextView) convertView.findViewById(R.id.fruit_name); //可以使用setTag把查找的view缓存起来方便多次重用 convertView.setTag(viewHolder); } else { //重新获取viewHolder viewHolder= (ViewHolder)convertView.getTag(); } //设置显示的图片和文字 viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName()); return convertView; } class ViewHolder{ ImageView fruitImage; TextView fruitName; } class ViewHolder2{ TextView textView; } }
fragment:
package com.example.administrator.frag_pager; /** * Created by Administrator on 2016/1/11. */ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; public class Fram1 extends Fragment { private List fruitList=new ArrayList(); private FruitAdapter fruitAdapter; private SwipeRefreshLayout swipeRefreshLayout; private ListView listView; public static final int SHOW_RESPONSE=0; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); String response=(String) msg.obj; JSONwithJSONObject(response); } }; private void JSONwithJSONObject(String jsonData) { try { JSONArray jsonArray=new JSONArray(jsonData); for (int i=0;i<jsonArray.length();i++) { JSONObject jsonObject=jsonArray.getJSONObject(i); String name=jsonObject.getString("id"); String imageId=jsonObject.getString("version"); // responseText.setText(id); int num=jsonObject.getInt("id"); Log.d("HAHA", name); Log.d("HAHA", String.valueOf(num)); Fruit fruit=new Fruit(name,Integer.parseInt(imageId)); // fruitList.addAll(0, new initfruit().initFruits(num)); fruitList.addAll(0, new initfruit().initFruits(num)); swipeRefreshLayout.setRefreshing(false); fruitAdapter.initData(fruitList); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onCreate(Bundle savedInstanceState) { // System.out.println("OneFragment onCreate"); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // System.out.println("OneFragment onCreateView"); View view=inflater.inflate(R.layout.lay1, container, false); listView= (ListView) view.findViewById(R.id.list_view); swipeRefreshLayout= (SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { swipeRefreshLayout.setRefreshing(true); Toast.makeText(getActivity(), "haha", Toast.LENGTH_SHORT).show(); sendRequestWithHttpURLConnection("http://192.168.2.190:8080/json_test"); fruitList.addAll(0, new initfruit().initFruits(0)); swipeRefreshLayout.setRefreshing(false); fruitAdapter.initData(fruitList); } }); swipeRefreshLayout.setColorScheme(new int[]{android.R.color.holo_blue_dark, android.R.color.holo_orange_light, android.R.color.holo_red_light}); fruitList.addAll(new initfruit().getFruit()); fruitList.addAll(new initfruit().initFruits(0)); fruitAdapter=new FruitAdapter(getActivity(),R.layout.fruit_item); listView.setAdapter(fruitAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fruit fruit = (Fruit) fruitList.get(position); String s = Integer.toString(position); Toast.makeText(getActivity(), s, Toast.LENGTH_SHORT).show(); } }); fruitAdapter.initData(fruitList); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } private void sendRequestWithHttpURLConnection( final String str){ //开启线程来发起网络请求 new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub HttpURLConnection connection=null; try { URL url=new URL(str); connection =(HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); InputStream in=connection.getInputStream(); //下面对获取到的输入流进行读取 BufferedReader reader=new BufferedReader(new InputStreamReader(in)); StringBuilder response=new StringBuilder(); String line; while((line=reader.readLine())!=null){ response.append(line); } Message message=new Message(); message.what=SHOW_RESPONSE; message.obj=response.toString(); handler.sendMessage(message); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ if(connection!=null){ connection.disconnect(); } } } }).start(); } }
这里我用本地服务器写了一个json文件,并对它进行了解析,刷新用了handle操作实现,获取数据完毕后addall。
public void initData(List<Fruit> objects){ clear(); addAll(objects); }
public class Fruit { private String name; private int imageId; public Fruit(String name, int imageId) { this.name=name; this.imageId=imageId; } public String getName(){ return name; } public int getImageId(){ return imageId; } }
以上就是下拉操作的实现,下面是上滑加载,当快加载到末端时自动加载。
public class TypeFragment extends Fragment implements AbsListView.OnScrollListener { // ArrayList<String> listString=new ArrayList(); ArrayList<com.youloft.news.dao.Item> Item=new ArrayList(); // ArrayList<NewsItem>lnewsItem=new ArrayList(); ListView listView; String id; SwipeRefreshLayout swipeRefreshLayout; private int lastVisibleIndex; String type; String s; private int page=0; ItemAdapter itemAdapter=null; private Handler handler = new Handler() { public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); String response=(String) msg.obj; JSONwithJSONObject(response); listView.setSelection(lastVisibleIndex); // list.add(map); } }; private void JSONwithJSONObject(String jsonData) { try { JSONArray jsonArray=new JSONArray(jsonData); List<NewsItem> data=new ArrayList<>(); for (int i=0;i<jsonArray.length();i++) { JSONObject jsonObject=jsonArray.getJSONObject(i); String id =jsonObject.getString("id"); String title =jsonObject.getString("title"); NewsItem newsItem=new NewsItem(title,id); data.add(newsItem); // listString.add(title); // Log.d("HHHLK", Integer.toString(i)); } // ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), // R.layout.new_item,R.id.nItem,listString); itemAdapter.buildData(data); //itemAdapter.initData(lnewsItem); swipeRefreshLayout.setRefreshing(false); // listView.setAdapter(arrayAdapter); } catch (Exception e){ e.printStackTrace(); } } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = this.getArguments(); if(bundle != null){ type = bundle.getString("id"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view=inflater.inflate(R.layout.frag_type, container, false); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initView(); } public void initView(){ listView= (ListView) getView().findViewById(R.id.list_view); swipeRefreshLayout= (SwipeRefreshLayout) getView().findViewById(R.id.knowswipeRefreshLayout); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { Log.d("OO", "D"); sendRequestWithHttpURLConnection("http://192.168.2.178:84/api/NewsList/GetTitle?typeId=" + type + "&page=0"); } }); itemAdapter=new ItemAdapter(getActivity(),R.layout.new_item); listView.setAdapter(itemAdapter); listView.setOnScrollListener(this); sendRequestWithHttpURLConnection("http://192.168.2.178:84/api/NewsList/GetTitle?typeId=" + type + "&page=0"); } private void sendRequestWithHttpURLConnection(final String str) { new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL(str); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); InputStream in = connection.getInputStream(); ; BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } Message message = new Message(); message.obj = response.toString(); handler.sendMessage(message); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } } } }).start(); } public static TypeFragment newInstance(String Type) { Bundle bundle=new Bundle(); bundle.putSerializable("id", Type); TypeFragment fragment=new TypeFragment(); fragment.setArguments(bundle); return fragment; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (lastVisibleIndex>itemAdapter.getCount()-10){ page++; Log.d("OO","D"); sendRequestWithHttpURLConnection("http://192.168.2.178:84/api/NewsList/GetTitle?typeId=" + type + "&page="+page); Log.d("OO","DD"); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { lastVisibleIndex= listView.getLastVisiblePosition(); Log.d("OO","DDD"); } }
该碎片继承了AbsListView.OnScrollListener接口,并在快到末端时实现加载操作。
xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/knowswipeRefreshLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout> </RelativeLayout>
适配器如下:
package com.youloft.news.utils; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.youloft.news.R; import com.youloft.news.activity.ContentActivity; import com.youloft.news.dao.Item; import com.youloft.news.dao.NewsItem; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/3/15. */ public class ItemAdapter extends ArrayAdapter { private int resourceId; Context context=null; List<NewsItem> mData=new ArrayList<>(); public ItemAdapter(Context context, int resource) { super(context, resource); resourceId=resource; this.context=context; } // public void initData(ArrayList<NewsItem> objects){ // clear(); // addAll(objects); // } public void buildData(List<NewsItem> data){ addAll(data); } @Override //每个子项被滚动到屏幕内的时候会被调用 public View getView(int position, View convertView, ViewGroup parent) { NewsItem onenew= (NewsItem) getItem(position); // int type=getItemViewType(position); ViewHolder viewHolder = null; //为空加载布局,不为空重用 if (convertView==null) { //加载布局 convertView= LayoutInflater.from(getContext()).inflate(resourceId, null); //convertView为空就创建,不为空调用 viewHolder=new ViewHolder(convertView) ; //获取实例 // viewHolder.fruitImage= (ImageView) convertView.findViewById(R.id.fruit_image); // viewHolder.newName= (TextView) convertView.findViewById(R.id.nItem); //可以使用setTag把查找的view缓存起来方便多次重用 convertView.setTag(viewHolder); } else { //重新获取viewHolder viewHolder= (ViewHolder)convertView.getTag(); } //设置显示的图片和文字 // viewHolder.fruitImage.setImageResource(fruit.getImageId()); // viewHolder.newName.setText(onenew.getNewsTitle()); viewHolder.bulid(onenew); return convertView; } class ViewHolder{ // ImageView fruitImage; TextView newName; NewsItem model=null; public ViewHolder(View v){ newName=(TextView)v.findViewById(R.id.nItem); } public void bulid(NewsItem item){ this.model=item; newName.setText(item.getNewsTitle()); newName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ContentActivity.actionStart(context, model.getTypeId()); } }); } } }
public class NewsItem {
String title;
String id;
public NewsItem(String title,String id)
{
this.title=title;
this.id=id;
}
public String getNewsTitle()
{
return title;
}
public String getTypeId()
{
return id;
}
}
news为实习时做一个新闻客户端实现的,上滑显示最新消息,当上拉到底部时,就加载历史记录并展示,json数据解析我用了官方的jsonobject,还有其它解析方式,相对来说更简单。
总结:总的来说就是一个对控件的监听然后实现响应组件的数据更新并更新UI
相关文章推荐
- 商业研究(19):变革家,专注创业项目分析,重点服务广大散户(建议股权众筹者谨慎买入。。。)
- AndroidFlux一览
- µWebSockets:一种WebSocket服务器实现
- pgloader
- LeetCode-121&122&123&188.Best Time to Buy and Sell Stock
- 第7课:Spark Streaming源码解读之JobScheduler内幕实现和深度思考
- CentOS 7.1编译安装PHP7
- HDU 2639 Bone Collector II
- 深度学习_caffe (4) 基于mnist实例搭建新的神经网络&在caffe中添加层
- 工厂模式(Factory Pattern)和java反射机制优化思考
- 网络编程read, write, recv, send函数返回值
- PAT简易连连看
- Android clipchilder属性分析
- Linux文件和目录操作命令大全
- 第二次课堂作业
- python学习03-数字
- Spring整体架构及源码项目搭建
- 初级Java攻城狮面试指导(二)
- IKExpressionV2.1.2快速入门
- Css详解之(伪类选择器)