ListView自定义Adapter

用自定义Adapter的简单ListView实现选择目录

  1. 定义item项的布局
  2. 定义一个ListView
  3. 定义一个类来保存一个item的信息
  4. 定义适配器类,在getView方法中实现listView的item的布局和数据填充
  5. 在activity中定义一个item信息类的list,往其中添加item信息类的实例,用该list得到自定义的适配器类的实例,最后调用ListView的setAdapter方法绑定适配器

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="2dp"
    >
    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_marginRight="2dp"
        android:layout_marginLeft="2dp"
        android:layout_marginTop="-1dp"
        android:background="@drawable/stroke_line_white"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/item_icon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            />
    <LinearLayout
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/item_name"
            android:layout_weight="2"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:textSize="18sp"
            android:lines="1"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#64ffffff"
            android:layout_marginRight="20dp"
            />
        <TextView
            android:id="@+id/item_msg"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:textSize="10sp"
            />
    </LinearLayout>
    </LinearLayout>
</LinearLayout>

directory_choose_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="40dp"
       android:orientation="horizontal">
       <TextView
           android:id="@+id/tv_present_dir"
           android:layout_weight="1"
           android:layout_width="0dp"
           android:layout_height="match_parent" />
   </LinearLayout>
    <ListView
        android:id="@+id/file_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:divider="@null"
        android:headerDividersEnabled="true"
        android:footerDividersEnabled="true"
        android:overScrollMode="always"
        >
    </ListView>

    </LinearLayout>
    <TextView
        android:layout_gravity="center_vertical|right"
        android:id="@+id/to_parent_dir"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:text="⬆"
        android:textColor="#49c4f9"
        android:gravity="center"
        android:textSize="40sp"
        android:background="@drawable/round_bg_black"
        />
    </FrameLayout>
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.com.m3u8">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".DirChooseActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <!--往sdcard中写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!--在sdcard中创建/删除文件的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
</manifest>

ListItem.java

package com.test.com.m3u8;

import java.io.File;

public class ListItem {
    private String itemName;
    private String itemMsg;
    private int itemIcon;
    public ListItem(File file){
        if(file.exists()){
            itemName=file.getName();
            if(file.isDirectory()){
                itemIcon=R.drawable.dir;
                if(file.list()!=null){
                    this.itemMsg=file.list().length+"项";
                }
            }else{
                itemIcon=R.drawable.file;
                String s=file.getName();
                if(s.lastIndexOf(".")!=-1){
                 this.itemMsg=s.substring(s.lastIndexOf(".")+1)+"文件";
                }
            }
            if(this.itemMsg==null){this.itemMsg="--";}
        }
    }
    public ListItem(String name, String msg, int icon) {
        this.itemName= name;
        this.itemMsg = msg;
        this.itemIcon = icon;
    }
    public String getItemName() {
        return itemName;
    }
    public String getItemMsg() {
        return itemMsg;
    }
    public int getItemIcon() {
        return itemIcon;
    }
    public void setItemMsg(String itemMsg) {
        this.itemMsg = itemMsg;
    }
    public void setItemName(String name) {
        this.itemName= name;
    }
    public void setItemIcon(int icon) {
        this.itemIcon = icon;
    }
}

LIstAdapter.java

package com.test.com.m3u8;

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.TextView;

import java.util.LinkedList;

public class ListAdapter extends BaseAdapter {

    private LinkedList<ListItem> mData;
    private Context mContext;

    public ListAdapter(LinkedList<ListItem> mData, Context mContext) {
        this.mData = mData;
        this.mContext = mContext;
    }

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

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

    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item,parent,false);
        ImageView img_icon = (ImageView) convertView.findViewById(R.id.item_icon);
        TextView txt_name = (TextView) convertView.findViewById(R.id.item_name);
        TextView txt_msg = (TextView) convertView.findViewById(R.id.item_msg);
        img_icon.setBackgroundResource(mData.get(position).getItemIcon());
        txt_name.setText(mData.get(position).getItemName());
        txt_msg.setText(mData.get(position).getItemMsg());
        return convertView;
    }
}

DirChooseActivity.Java

package com.test.com.m3u8;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.util.LinkedList;
import java.util.List;

public class DirChooseActivity extends Activity {
    TextView to_parent_dir,present_dir;
    ListView fileList;
    private List<ListItem> mData = null;
    private ListAdapter mAdapter = null;
    File presentDir;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.directory_choose_activity);
        {to_parent_dir=findViewById(R.id.to_parent_dir);
         present_dir=findViewById(R.id.tv_present_dir);
         fileList=findViewById(R.id.file_list);
        }
        
        fileList.setOnItemClickListener(onItemClick);
        fileList.setOnItemLongClickListener(onItemLongClick);
        to_parent_dir.setOnClickListener(onBackToParentDir);
        checkPermission();       
        //获取手机本身存储根目录Environment.getExternalStoragePublicDirectory("")
        //sd卡根目录Environment.getExternalStorageDirectory()
        presentDir=Environment.getExternalStoragePublicDirectory("");
        setList(presentDir);
    }
    private  void setList(File dir){
        File childFiles[]=dir.listFiles();
        mData=new LinkedList<ListItem>();
        File f;
        String msg;
        int icon;
        for(int i=0;i<childFiles.length;i++){
            f=childFiles[i];
            msg="-";
            if(f.isDirectory()){
                if(f.list()!=null){
                msg=childFiles[i].list().length+"";
               }else{ msg="0"; }
               icon=R.drawable.dir;
            }else{
                icon=R.drawable.file;
            }
        mData.add(new ListItem(f.getName,msg,icon));
        //或mData.add(new ListItem(f));
        }
        mAdapter=new ListAdapter((LinkedList<ListItem>)mData,DirChooseActivity.this);
        fileList.setAdapter(mAdapter);
        present_dir.setText(presentDir.getAbsolutePath());
    }
    private  void toParentDir(){
        if(!presentDir.getAbsolutePath().equals(Environment.getExternalStoragePublicDirectory("").getAbsolutePath())){
        presentDir=presentDir.getParentFile();
        setList(presentDir);
        }
    }
    View.OnClickListener onBackToParentDir=new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          if(v.getId()==R.id.to_parent_dir){
            toParentDir();
        }
    }
    };
    AdapterView.OnItemClickListener onItemClick=new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            File f=new File(presentDir.getAbsolutePath(),mData.get(position).getItemName());
            if(f.isDirectory()){
                presentDir=f;
                setList(presentDir);
            }
        }
    };
    AdapterView.OnItemLongClickListener onItemLongClick=new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            File f=new File(presentDir.getAbsolutePath(),mData.get(position).getItemName());
            if(f.isDirectory()){
                returnResult(f.getAbsolutePath());
            }
            return false;
        }
    };
    private void returnResult(String pathChosen){
        if(pathChosen!=null) {
            //对所选目录的操作
        }
    }
private void checkPermission() {
        //检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //用户已经拒绝过一次,再次弹出权限申请对话框需要给用户一个解释
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
                    .WRITE_EXTERNAL_STORAGE)) {
                Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();
            }
            //申请权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},0);
        }
    }
}

 

dir.png    file.png

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值