1. 程式人生 > >葫蘆小金剛之Xlistview多條目顯示以及下拉重新整理下拉載入

葫蘆小金剛之Xlistview多條目顯示以及下拉重新整理下拉載入

  1. 首先,話不多說,我們用微信介面來做


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>

效果圖如下