在此总结下所学的ListView知识。首先先上效果图。
项目中配置了 ButterKnife,具体配置方法可以参考 http://www.cnblogs.com/whoislcj/p/5620128.html 这篇博客。
接着是主界面的布局activity_main,主要存放一个顶部标题和一个ListView。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.listviewdemo.MainActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPaleBlue"> <TextView android:id="@+id/txtView_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="ONE PIECE" android:textSize="35dp" /> <ImageView android:id="@+id/img_change" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="5dp" android:src="@mipmap/default_change" android:visibility="gone" /> </RelativeLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/background_light" /> <ListView android:id="@+id/lstView_main" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:background="@color/colorPaleBlue" android:divider="@android:color/background_light" android:dividerHeight="1dp" android:scrollbars="none" /> </LinearLayout>
主界面的话,主要是对适配器进行一些操作。代码如下:
package com.example.listviewdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.example.listviewdemo.adapter.OnePieceAdapter; import com.example.listviewdemo.bean.OnePieceBean; import java.util.ArrayList; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity { @BindView(R.id.lstView_main) ListView lstViewMain; @BindView(R.id.txtView_title) TextView txtViewTitle; @BindView(R.id.img_change) ImageView imgChange; /** * 数据集 */ private ArrayList<OnePieceBean> mData = new ArrayList<OnePieceBean>(); // 头布局的高度 private int headerHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定View ButterKnife.bind(this); //初始化 initData(); //初始化数据适配器 OnePieceAdapter adapter = new OnePieceAdapter(this, mData); //设置适配器 lstViewMain.setAdapter(adapter); //点击监听 adapter.setOnItemOnclickListener(new OnePieceAdapter.OnItemOnclickListener() { @Override public void ItemOnclickListener(OnePieceBean item) { Toast.makeText(MainActivity.this, "我是" + item.getName(), Toast.LENGTH_SHORT).show(); } }); lstViewMain.setSelection(1); } private void initData() { mData.add(new OnePieceBean("路飞", R.mipmap.op01, "船长,成为海贼王的男人", "$500,000,000-")); mData.add(new OnePieceBean("索隆", R.mipmap.op02, "副船长,世界第一的大剑豪", "$320,000,000-")); mData.add(new OnePieceBean("乌索普", R.mipmap.op03, "大骗子,勇敢的海上战士", "$200,000,000-")); mData.add(new OnePieceBean("山治", R.mipmap.op04, "厨师,要找到all blue", "$177,000,000-")); mData.add(new OnePieceBean("娜美", R.mipmap.op05, "航海士,要找到财宝", "$66,000,000-")); mData.add(new OnePieceBean("乔巴", R.mipmap.op06, "医生,是一只爱吃棉花糖的驯鹿", "$100-")); mData.add(new OnePieceBean("罗宾", R.mipmap.op07, "恶魔之子,要找到历史正文", "%130,000,000-")); mData.add(new OnePieceBean("弗兰奇", R.mipmap.op08, "改造人,super..", "$94,000,000-")); mData.add(new OnePieceBean("布鲁克", R.mipmap.op09, "灵魂之王,活着真好", "$83,000,000-")); mData.add(new OnePieceBean("艾斯", R.mipmap.op10, "火拳艾斯,路飞的结拜哥哥", "$500,000,000-")); } }
自定义了一个bean用于存放数据,代码如下:
package com.example.listviewdemo.bean; /** * Created by 老王 on 2017/1/9. */ public class OnePieceBean { private String name; private int imgUrl; private String detail; private String reward; /** * @param name 姓名 * @param imgUrl 图片url * @param detail 详细描述 * @param reward 赏金 */ public OnePieceBean(String name, int imgUrl, String detail, String reward) { this.name = name; this.imgUrl = imgUrl; this.detail = detail; this.reward = reward; } public String getName() { return name; } public int getImgUrl() { return imgUrl; } public String getDetail() { return detail; } public String getReward() { return reward; } }
通过集合的方法把数据保存起来,传入到适配器中,适配器的代码如下:
package com.example.listviewdemo.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.example.listviewdemo.R; import com.example.listviewdemo.bean.OnePieceBean; import java.util.ArrayList; /** * Created by 老王 on 2017/1/9. */ public class OnePieceAdapter extends BaseAdapter { private Context context; private LayoutInflater inflater; private ArrayList<OnePieceBean> mData; OnItemOnclickListener onItemOnclickListener = null; public interface OnItemOnclickListener { void ItemOnclickListener(OnePieceBean item); } public void setOnItemOnclickListener(OnItemOnclickListener onItemOnclickListener) { this.onItemOnclickListener = onItemOnclickListener; } public OnePieceAdapter(Context context, ArrayList<OnePieceBean> mData) { this.context = context; inflater = LayoutInflater.from(context); this.mData = mData; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int i) { return mData.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(final int i, View view, ViewGroup viewGroup) { final ViewHolder holder; if (view == null) { holder = new ViewHolder(); view = inflater.inflate(R.layout.one_piece, null); holder.txtViewName = (TextView) view.findViewById(R.id.txtView_name); holder.imgUrl = (ImageView) view.findViewById(R.id.img_url); holder.txtViewDetail = (TextView) view.findViewById(R.id.txtView_detail); holder.txtViewReward = (TextView) view.findViewById(R.id.txtView_reward); holder.rlOp = (RelativeLayout) view.findViewById(R.id.rl_op); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } final OnePieceBean item = mData.get(i); holder.txtViewName.setText(item.getName()); holder.imgUrl.setBackgroundResource(item.getImgUrl()); holder.txtViewDetail.setText(item.getDetail()); holder.txtViewReward.setText(item.getReward()); if (onItemOnclickListener != null) { holder.rlOp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onItemOnclickListener.ItemOnclickListener(item); } }); } return view; } public class ViewHolder { RelativeLayout rlOp; TextView txtViewName; ImageView imgUrl; TextView txtViewDetail; TextView txtViewReward; } }
适配器中还加载了一个布局one_piece.xml,用于存放图片,人物姓名和人物介绍等信息。布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rl_op" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPaleBlue"> <ImageView android:id="@+id/img_url" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/txtView_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/img_url" android:paddingTop="10dp" /> <TextView android:id="@+id/txtView_detail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/img_url" android:layout_toRightOf="@id/img_url" android:paddingBottom="10dp" /> <TextView android:id="@+id/txtView_reward" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:paddingRight="5dp" android:paddingTop="20dp" /> </RelativeLayout>
这样就达到了listView的基本显示效果了。对于具体的代码操作要看客自己手动操作下方能有更深刻的认识。