ListView多条目加载

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


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

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;
}
@Override
public int getCount() {
    return newslist.size();
}

@Override
public Object getItem(int i) {
    return newslist.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

// 加了优化的getView方法

@Override
public 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;
}

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

// 这个方法是得到不同视图种类的数量,因为是奇数行和偶数行,因此返回一个2就可以了
   
@Override
public 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>


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

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