您的位置:首页 > 其它

listview的下拉刷新和上滑加载。

2016-05-22 17:08 302 查看
listview需要适配器,更改数据之后,在适配器中实现数据的addall操作即可。

下拉刷新:

布局:

<?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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: