十分之一代码写完安卓listview adapter 和xml

十分之一代码写完安卓listview adapter 和xml

前言:

​ 众所周知,安卓自定义一个自己想要的类的特定布局的listview的流程很复杂

  1. 首先需要在主xml里定义一个listview,
  2. 新建xml画出单个list item的布局,
  3. 新建一个物品类
  4. 新建一个物品的adapter类,布置各种属性,
  5. 在代码里初始化adapter,

这些步骤加起来代码估计已经上百行了,但其实只需要十分之一代码就能解决这个问题,只需要两步

  1. 物品类
  2. 代码添加

传统示例:

主xml

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

单个布局xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/lv_item_selector"
    >

    <TextView
        android:id="@+id/animalName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_centerVertical="true"/>

    <ImageView
        android:id="@+id/animalImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginRight="20dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:scaleType="centerCrop"
        />



</RelativeLayout>

物品类

package com.eric.test1;

public class Animal {
    
    
    public String name;
    public int img;

    public Animal(String name, int img) {
    
    
        this.name = name;
        this.img = img;
    }

    public String getName() {
    
    
        return this.name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getImg() {
    
    
        return img;
    }

    public void setImg(int img) {
    
    
        this.img = img;
    }


}

adapter类

package com.eric.test1;

import android.content.Context;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintSet;

import org.w3c.dom.Text;

import java.util.List;

public class animalAdapter extends BaseAdapter {
    
    
    public List<Animal> data;
    private Context context;

    public animalAdapter(List<Animal> data, Context context) {
    
    
        this.data = data;
        this.context = context;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    
    
        if(convertView == null){
    
    
            convertView = LayoutInflater.from(context).inflate(R.layout.animal_item,parent,false);
        }
        TextView textView = convertView.findViewById(R.id.animalName);
        ImageView imageView = convertView.findViewById(R.id.animalImage);
        textView.setText(data.get(position).getName());
        imageView.setImageResource(data.get(position).getImg());
        return convertView;
    }

    @Override
    public int getCount() {
    
    
        return data.size();
    }

    @Override
    public Object getItem(int i) {
    
    
        return null;
    }



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

主java代码

package com.eric.test1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Hw3P4 extends AppCompatActivity {
    
    
    private List<Animal> animals = new ArrayList<>();
    public List toDel = new ArrayList();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hw3_p4);

        initAnimals();
        animalAdapter animalAdapter = new animalAdapter(animals,this);
        ListView listView = findViewById(R.id.lv_menu);
        listView.setAdapter(animalAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
    
    
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    
    

                Toast.makeText(getApplicationContext(),animals.get(i).getName(),Toast.LENGTH_SHORT).show();

            }
        });

        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
    
    
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
    
    

                if(checked){
    
    
//                    Toast.makeText(getApplicationContext(),position+"is checked",Toast.LENGTH_LONG).show();
                    toDel.add(String.valueOf(position));
                }
                else{
    
    
//                    Toast.makeText(getApplicationContext(),position+"is unchecked",Toast.LENGTH_LONG).show();
                    toDel.remove(String.valueOf(position));
                }

            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    
    
                mode.getMenuInflater().inflate(R.menu.dl_animal, menu);
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    
    
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item ) {
    
    
                Collections.sort(toDel);
                Log.e("list:","current list: "+ toDel);
                for(int i = 0;i< toDel.size();i++){
    
    
                    animals.remove(Integer.parseInt(String.valueOf(toDel.get(i)))-i);
                }
                toDel.clear();
                mode.finish();
                Log.e("list:","After deleted: "+toDel);
                return true;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
    
    

            }
        });


    }



    private void initAnimals(){
    
    
        Animal lion = new Animal("Lion",R.mipmap.lion);
        Animal cat = new Animal("Cat",R.mipmap.cat);
        Animal dog = new Animal("Dog",R.mipmap.dog);
        Animal elephant = new Animal("Elephant",R.mipmap.elephant);
        Animal tiger = new Animal("Tiger",R.mipmap.tiger);
        Animal monkey = new Animal("Monkey",R.mipmap.monkey);

        animals.add(lion);
        animals.add(cat);
        animals.add(dog);
        animals.add(elephant);
        animals.add(tiger);
        animals.add(monkey);
    }

}

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KoHVolT3-1639229809769)(C:\Users\E\AppData\Roaming\Typora\typora-user-images\image-20211210215458084.png)]

新compose方法

一个简单的示例:

物品类

package com.eric.composetest

object SampleData {
    
    
    val Sample = listOf(
        Message("liu de hua","a singer"),
        Message("zhangxueyou", "also a singer"),
        Message("kitty","very cute")
    )
}

主kt代码

package com.eric.composetest

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.eric.composetest.ui.theme.ComposeTestTheme

class MainActivity : ComponentActivity() {
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)
        setContent {
    
    
            ComposeTestTheme {
    
    
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
    
    
                    DispMessages(messages = SampleData.Sample)
                }
            }
        }
    }

    @Composable
    fun MessageCard(msg: Message) {
    
    
        Row(
            modifier = Modifier.padding(all= 10.dp)
        ) {
    
    
            Image(painter = painterResource(id = R.mipmap.cat), contentDescription = "a cute kitty",
            modifier = Modifier
                .clip(CircleShape)
                .size(40.dp))

            Spacer(modifier = Modifier.padding(5.dp))

            Column {
    
    
                Text(text = msg.head)
                Spacer(modifier = Modifier.height(1.dp))
                Text(text = msg.body)
            }
        }
        
    }

    @Composable
    fun DispMessages(messages: List<Message>){
    
    
        LazyColumn {
    
    
            items(messages) {
    
     message ->
                MessageCard(message)
            }
        }
    }
}

data class Message(val head:String, val body:String)

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9hRRx81m-1639229809771)(C:\Users\E\AppData\Roaming\Typora\typora-user-images\image-20211210224930458.png)]

作者:一位路过的假面骑士
原文链接:

}
}

}

@Composable
fun DispMessages(messages: List<Message>){
    LazyColumn {
        items(messages) { message ->
            MessageCard(message)
        }
    }
}

}

data class Message(val head:String, val body:String)




### 运行结果:

[外链图片转存中...(img-9hRRx81m-1639229809771)]



###### 作者:一位路过的假面骑士



###### 原文链接:

https://blog.csdn.net/zeknes/article/details/121866517?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/fjnu_se/article/details/121879946