ListView多条目加载

来源:互联网 发布:全站仪数据如何处理 编辑:程序博客网 时间:2024/06/15 13:48

今天要给大家说的是ListView的多条目加载,奇数行和偶数行分别加载不同的布局,


先给大家看一下最终效果,比较简陋,但还是可以看出奇数行和偶数行不同的布局的


public class MainActivity extends AppCompatActivity {    private ListView lv;
我这里使用的是天行数据的接口,关于天行数据,给大家一个连接,自己注册可以供练习使用
https://www.tianapi.com/#
    private String mPath="https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();        initGetData(mPath);    }


//  初始化view    private void init(){        lv = (ListView) findViewById(R.id.lv);    }//    初始化数据    private void initGetData(String mPath){        MyAsyncTask myHttpTools = new MyAsyncTask(MainActivity.this, mPath, "GET", lv);        myHttpTools.execute();    }

--------------------------------------------------------------华丽丽的分割线----------------------------------------------------------

这个是适配器的MyAdapter:

class MyAdapter extends BaseAdapter{    List<databean.NewslistBean> newslist;    Context context;    final int typeOne = 0;    final int typeTwo = 1;

// 有参构造方法
   
public MyAdapter(List<databean.NewslistBean> newslist, Context context) {    this.newslist = newslist;    this.context = context;}
@Overridepublic int getCount() {    return newslist.size();}@Overridepublic Object getItem(int i) {    return newslist.get(i);}@Overridepublic long getItemId(int i) {    return i;}

// 加了优化的getView方法

@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {

// 因为是多条目加载,因此会有两个ViewHolder类,分别执行不同的加载视图的方法

ViewHolder1 holder1 = null;ViewHolder2 holder2 = null;

// 这个方法是多条目加载中的重要方法,字面上的翻译就是得到视图种类,这里是调用

int type = getItemViewType(i);if (view == null){

// switch判断是第一个还是第二个      

switch (type){    case typeOne:

// 里面这些代码都是优化的ListView的代码
               

 holder1 = new ViewHolder1();            view = View.inflate(context,R.layout.itemfirst,null);            holder1.img1 = view.findViewById(R.id.img1);            holder1.img2 = view.findViewById(R.id.img2);            holder1.tv = view.findViewById(R.id.tv);            view.setTag(holder1);            break;        case typeTwo:            holder2 = new ViewHolder2();            view = View.inflate(context,R.layout.itemsecond,null);            holder2.pic1 = view.findViewById(R.id.pic1);            holder2.pic2 = view.findViewById(R.id.pic2);            view.setTag(holder2);            break;        default:break;    }}switch (type){    case typeOne:
//                赋值             holder1 = (ViewHolder1) view.getTag();            holder1.tv.setText(newslist.get(i).getTitle());

//     网络的图片资源
             

 ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));            ImageLoader.getInstance().displayImage
    (newslist.get(i).getPicUrl().toString(),holder1.img1);            ImageLoader.getInstance().displayImage
    (newslist.get(i).getPicUrl().toString(),holder1.img2);            break;        case typeTwo:            holder2 = (ViewHolder2) view.getTag();            ImageLoader.getInstance().displayImage
            (newslist.get(i).getPicUrl().toString(),holder2.pic1);            ImageLoader.getInstance().displayImage
            (newslist.get(i).getPicUrl().toString(),holder2.pic2);            break;        default:break;    }    return view;}

// 这里就是加载不同视图种类的方法,因为分奇数行和偶数行,因此取模是关键
   
@Overridepublic int getItemViewType(int position) {    int t = position%2;    if (t==0) {        return typeOne;    }else{        return typeTwo;    }}

// 这个方法是得到不同视图种类的数量,因为是奇数行和偶数行,因此返回一个2就可以了
   
@Overridepublic int getViewTypeCount() {    return 2;}

// 内部类
   
class ViewHolder1{    ImageView img1;    ImageView img2;    TextView tv;}class ViewHolder2{    ImageView pic1;    ImageView pic2;}

--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------

我这里使用的是MyAsyncTask类继承AsyncTask

public class MyAsyncTask extends AsyncTask<String,Integer,String>{

    private databean bean;
    Context context;
    String url;
    String type;
    ListView lv;

    public MyAsyncTask(Context context, String url, String type, ListView lv){
        super();
        this.url = url;
        this.context = context;
        this.type = type;
        this.lv = lv;
    }

    public void GetData(String murl,String mtype){


//        服务器地址
        try {
            URL url = new URL(murl);
//            打开链接(我这里使用的是HttpURLConnection方式请求数据,当然也可以使用HttpClient,

但是这个方式已经被抛弃了,但是它也十分重要,通俗一点说,是祖宗)


            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod(mtype);
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
//            post方式提交参数给服务器,以流的方式提交
            connection.setDoOutput(true);

            String params = "key=8d6e3228d25298f13af4fc40ce6c9679&num=10";
//            参数以流的形式写给服务器,以字节数组的形式写出去
            connection.getOutputStream().write(params.getBytes());
            int responseCode = connection.getResponseCode();
            if (responseCode == 200){
                InputStream inputStream = connection.getInputStream();
                String json = streamToString(inputStream, "utf-8");
                Log.d("zxz",json);
//  使用Gson方法进行解析
                Gson gson = new Gson();
                bean = gson.fromJson(json,databean.class);

            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
// 将流转化为字符串
    private  String streamToString(InputStream inputStream, String charset){

        try {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);
            BufferedReader reader = new BufferedReader(inputStreamReader);
            String content = null;
            StringBuilder builder = new StringBuilder();
            while ((content = reader.readLine())!=null){
                builder.append(content);
            }
            reader.close();
            return  builder.toString();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return  null;
    }

    @Override
    protected String doInBackground(String... strings) {
        GetData(url,type);

        return null;
    }
//这里执行的是更新UI的操作
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        List<databean.NewslistBean> list  = bean.getNewslist();
        MyAdapter myAdapter = new MyAdapter(list,context);
        lv.setAdapter(myAdapter);
    }


  }

--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------

到这里呢,class类的代码就写完了

接下来是布局文件~~~~~~~~~~~~~~~~~~~

--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------

MainActivity的布局文件,很简单

<ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------

第一个item布局文件:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:layout_weight="1">
        <ImageView
            android:src="@mipmap/ic_launcher"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/img1"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:layout_weight="1"
        android:orientation="vertical">
        <ImageView
            android:id="@+id/img2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv"
            />

    </LinearLayout>

</LinearLayout>

--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------


第二个item布局文件:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="100dp">

    <ImageView
        android:id="@+id/pic1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@mipmap/ic_launcher"/>
    <ImageView
        android:id="@+id/pic2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:src="@mipmap/ic_launcher"/>

</LinearLayout>


--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------

我的文章到这里就全部都写完了,初次写文章,希望各个前辈多多指教!