一、编写一个自定义的xml,内容为我们想要的一行列表的内容
这里我在布局里加一个图片和文字
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imgPhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></ImageView>
<TextView
android:id="@+id/textName"
android:layout_margin="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
</LinearLayout>
二、自定义类,与每行列表的内容对应起来
我的列表里有一张图片和一行文字,所以我的这个类有两个数据:图片资源id,和文字内容
public class MyListView{
private int imgId; //图片id
private String textName; //名字
public MyListView(int imgId,String textName)
{
this.imgId=imgId;
this.textName=textName;
}
public String getName()
{
return this.textName;
}
public int getImg()
{
return this.imgId;
}
}
三、自定义适配器
自定义一个类并继承于ArrayAdapter类,作用是把布局和布局内的内容加载适配进去。
public class MyAdapt extends ArrayAdapter<MyListView>{
private int resourceId;
public MyAdapt(Context context,int resId,List<MyListView> myListView)
{
super(context,resId,myListView);
resourceId=resId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyListView myListView=getItem(position); //获取当前的哪一列的实体
View view;
ViewHonder viewHonder;
if(convertView==null)
{
view= LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
viewHonder=new ViewHonder();
viewHonder.imgView=(ImageView)view.findViewById(R.id.imgPhoto);
viewHonder.textView=(TextView) view.findViewById(R.id.textName);
view.setTag(viewHonder);
}
else //已经加载过布局,无需再次加载
{
view=convertView;
viewHonder=(ViewHonder) view.getTag();
}
//把适配器里两项内容加载出来
viewHonder.textView.setText(myListView.getName());
viewHonder.imgView.setImageResource(myListView.getImg());
return view;
}
//定义内部类
class ViewHonder{
ImageView imgView;
TextView textView;
}
}
四、使用我们的适配器
public class MainActivity extends AppCompatActivity {
static String TAG="MAIN";
private List<MyListView> listMy=new ArrayList<>(); //自定义列表
String name[]={"允宝","小科","威仔","帅咔佳宝"};
int img[]={R.drawable.img0,R.drawable.img1,R.drawable.img2,R.drawable.img3};
int clickNum=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//隐藏自带活动标题栏
ActionBar actBar=getSupportActionBar();
if(actBar!=null)
{
actBar.hide();
}
//配置ArrayAdapt
init_myListView(); //初始化数据
MyAdapt myAdapt=new MyAdapt(MainActivity.this,R.layout.my_list_view,listMy);
ListView listViewCh1=(ListView)findViewById(R.id.listViewCh1);
listViewCh1.setAdapter(myAdapt);
//点击事件
listViewCh1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
MyListView myListView=listMy.get(i);
Toast.makeText(MainActivity.this,myListView.getName() , Toast.LENGTH_SHORT).show();
//修改内容
clickNum++;
Log.d(TAG, "onItemClick: "+clickNum);
MyListView myNewListView=new MyListView(myListView.getImg(),name[i]+clickNum);
listMy.set(i,myNewListView);
myAdapt.notifyDataSetChanged(); //更新UI
}
});
}
//把列表内容填充好
private void init_myListView()
{
for(int i=0;i<1;i++)
{
for(int j=0;j<name.length;j++)
{
MyListView myListView=new MyListView(img[j],name[j]);
listMy.add(myListView);
}
}
}
}
五、效果展示