葫蘆小金剛之Xlistview多條目顯示以及下拉重新整理下拉載入
阿新 • • 發佈:2019-01-12
- 首先,話不多說,我們用微信介面來做
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.RadioGroup; import com.bawei.rui.adapter.MyFragmentAdapter; import com.bawei.rui.frag.FragGrid; import com.bawei.rui.frag.FragList; import java.util.ArrayList; public class MainActivity extends FragmentActivity { private RadioGroup radioGroup; private ViewPager pager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pager = findViewById(R.id.pager); radioGroup = findViewById(R.id.radiogroup); radioGroup.check(radioGroup.getChildAt(0).getId()); ArrayList<Fragment> list = new ArrayList<>(); list.add(new FragList()); list.add(new FragGrid()); pager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(), list)); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int i) { radioGroup.check(radioGroup.getChildAt(i).getId()); } @Override public void onPageScrollStateChanged(int i) { } }); radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.radiobutton1: pager.setCurrentItem(0); break; case R.id.radiobutton2: pager.setCurrentItem(1); break; } } }); } }
隨後寫Fragment介面卡
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import java.util.ArrayList; public class MyFragmentAdapter extends FragmentPagerAdapter { private ArrayList<Fragment> list; public MyFragmentAdapter(FragmentManager fm, ArrayList<Fragment> list) { super(fm); this.list = list; } @Override public Fragment getItem(int i) { return list.get(i); } @Override public int getCount() { return list.size(); } }
2.MainActivity佈局檔案,佈局比較簡陋
程式碼就不放了
3.然後我們寫兩個Fragment
第一個用XlistView
第二用GridView
4.然後要從網路請求資料,先寫GET請求
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.net.URLConnection; public class HttpUtil { public static String requestHttpGet(String strurl) { try { URL url = new URL(strurl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); int code = connection.getResponseCode(); if (code == HttpURLConnection.HTTP_OK) { InputStream stream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "utf-8")); StringBuilder builder = new StringBuilder(); String str = ""; while ((str = reader.readLine()) != null) { builder.append(str); } return builder.toString(); } connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } return null; } }
5.GridView我們來用AsyncTask請求資料
import android.os.AsyncTask;
public class MyAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strings) {
return HttpUtil.requestHttpGet(strings[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
backs.getdate(s);
}
public interface CallBacks {
String getdate(String s);
}
private CallBacks backs;
public void setBacks(CallBacks backs) {
this.backs = backs;
}
}
6.下面放出來Xlistview的程式碼用子執行緒寫
public class FragList extends Fragment {
private MyListviewAdapter listviewAdapter;
private ArrayList<Date> data;
private XListView xListView;
private String str = "http://www.xieast.com/api/news/news.php?page=1";
private Date date;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_list, container, false);
xListView = view.findViewById(R.id.xlistview);
xListView.setPullLoadEnable(true);
//
xListView.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
new Thread() {
@Override
public void run() {
super.run();
String s = HttpUtil.requestHttpGet(str);
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(s, JsonBean.class);
ArrayList<Date> data = jsonBean.getData();
Message message = new Message();
message.what = 1;
message.obj = data;
handler.sendMessage(message);
}
}.start();
}
@Override
public void onLoadMore() {
new Thread() {
@Override
public void run() {
super.run();
String s = HttpUtil.requestHttpGet(str);
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(s, JsonBean.class);
ArrayList<Date> ddd = jsonBean.getData();
Message message = new Message();
message.what = 1;
message.obj = data;
handler.sendMessage(message);
}
}.start();
}
});
new Thread() {
@Override
public void run() {
super.run();
String s = HttpUtil.requestHttpGet(str);
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(s, JsonBean.class);
ArrayList<Date> data = jsonBean.getData();
Message message = new Message();
message.what = 0;
message.obj = data;
handler.sendMessage(message);
}
}.start();
return view;
}
private void onLoad() {
xListView.stopRefresh();;
xListView.stopLoadMore();
xListView.setRefreshTime(date+"");
date = new Date(System.currentTimeMillis()+"");
}
/* SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());//獲取當前時間
String str = formatter.format(curDate);*/
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
data = (ArrayList<Date>) msg.obj;
listviewAdapter = new MyListviewAdapter(getActivity(), data);
xListView.setAdapter(listviewAdapter);
onLoad();
break;
case 1:
xListView.setAdapter(listviewAdapter);
onLoad();
break;
case 2:
ArrayList<Date> ddd = (ArrayList<Date>) msg.obj;
xListView.setAdapter(new MyListviewAdapter(getActivity(), ddd));
onLoad();
break;
}
}
};
7.Xlistview 的介面卡 裡面引入兩個及多個佈局,也就是
我們實現多條目,多樣式。
public class MyListviewAdapter extends BaseAdapter {
private Context context;
private ArrayList<Date> list;
public MyListviewAdapter(Context context, ArrayList<Date> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
switch (getItemViewType(position)) {
case 0:
ViewHolder0 holder0;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_one, null);
holder0 = new ViewHolder0();
holder0.view0 = convertView.findViewById(R.id.name1);
holder0.img0 = convertView.findViewById(R.id.img1);
convertView.setTag(holder0);
} else {
holder0 = (ViewHolder0) convertView.getTag();
}
holder0.view0.setText(list.get(position).getAuthor_name());
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(), holder0.img0);
break;
case 1:
ViewHolder1 holder1;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_two, null);
holder1 = new ViewHolder1();
holder1.view1 = convertView.findViewById(R.id.name2);
holder1.img1 = convertView.findViewById(R.id.img2);
convertView.setTag(holder1);
}else{
holder1 = (ViewHolder1) convertView.getTag();
}
holder1.view1.setText(list.get(position).getCategory()+"");
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(), holder1.img1);
break;
}
return convertView;
}
class ViewHolder0 {
TextView view0;
ImageView img0;
}
class ViewHolder1 {
TextView view1;
ImageView img1;
}
8.在用到圖片的時候需用Image—loader
用Image—loader就得寫這個App
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
//設定框架的屬性
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.zhan)
//設定圓角
.displayer(new CircleBitmapDisplayer())
.build();
//影象載入器配置
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
.defaultDisplayImageOptions(options)
//構建
.build();
ImageLoader instance = ImageLoader.getInstance();
//獲得例項
instance.init(configuration);
//初始化
}
Xlistview與Gridview可用一個介面卡
用ImageLoader時切記註冊
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bawei.rui">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".app.App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
效果圖如下