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>
--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------
<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>
--------------------------------------------------------------又是一条华丽丽的分割线----------------------------------------------------------
我的文章到这里就全部都写完了,初次写文章,希望各个前辈多多指教!