Android开发实现ListView和adapter配合显示图片和文字列表功能示例

本文实例讲述了Android开发实现ListView和adapter配合显示图片和文字列表功能。分享给大家供大家参考,具体如下:

实际效果:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity"
  android:orientation="vertical">
    <!--使用红色得分割条-->
    <ListView
      android:id="@+id/list1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:divider="#f00"
      android:dividerHeight="2px"
      android:headerDividersEnabled="false">
    </ListView>
    <!--用于存放和发送新的信息-->
    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_marginBottom="0dp"
      android:background="#66ffffff"
      android:orientation="vertical">
        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical">
            <!--设置最大行数-->
            <EditText
              android:id="@+id/ifo_edit"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:hint="请输入内容"
              android:maxLines="6"
              android:textColorHint="#c0c0c0" />
            <!--存放新的图片-->
            <ImageView
              android:id="@+id/ifo_image"
              android:layout_width="130dp"
              android:layout_height="110dp"
              android:src="@drawable/addphoto" />
        </LinearLayout>
        <RelativeLayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content">
            <!--点击取消发送消息-->
            <Button
              android:id="@+id/delete"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentLeft="true"
              android:layout_gravity="left"
              android:text="取消"
              android:textSize="16sp" />
            <!--点击发送消息-->
            <Button
              android:id="@+id/send"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentRight="true"
              android:text="发送"
              android:textSize="16sp" />
        </RelativeLayout>
    </LinearLayout>
</RelativeLayout>

代码实现部分:

public class MainActivity extends AppCompatActivity {
  //list表
  private List<Informations> informationsList01 = new ArrayList<>();
  //当前消息列表
  ListView list01 ;
  //消息发送栏
  EditText editText01 ;
  //存放图片
  ImageView imageView01;
  //消息发送按钮
  Button button01_send ;
  //记录数组长度
  int arr_num = 0;
  //定义一个数组
  String[] arr1 = new String[arr_num];
  //从相册获得图片
  Bitmap bitmap;
  //判断返回到的Activity
  private static final int IMAGE_REQUEST_CODE = 0;
  //图片路径
  private String path ;
  private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
      if((Integer)msg.obj==0){
        imageView01.setImageBitmap(bitmap);
      }
      super.handleMessage(msg);
    }
  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    list01 = (ListView) findViewById(R.id.list1);
    editText01 = (EditText) findViewById(R.id.ifo_edit);
    imageView01 = (ImageView) findViewById(R.id.ifo_image);
    button01_send = (Button) findViewById(R.id.send);
    imageView01.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if(ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
          ActivityCompat.requestPermissions(MainActivity.this,new String[]{
              Manifest.permission.WRITE_EXTERNAL_STORAGE
          },1);
        }
        Intent intent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, IMAGE_REQUEST_CODE);
      }
    });
    button01_send.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if(((BitmapDrawable) ((ImageView) imageView01).getDrawable()).getBitmap() != null
            || editText01.getText().toString() != null){
          Informations xiaochouyu = new Informations(
              ((BitmapDrawable) ((ImageView) imageView01).getDrawable()).getBitmap(),
              editText01.getText().toString());
          informationsList01.add(xiaochouyu);
          EssayAdapter adapter = new EssayAdapter(MainActivity.this,
              R.layout.array_list,informationsList01);
          list01.setAdapter(adapter);
          editText01.setText("");
          imageView01.setImageBitmap(null);
          imageView01.setImageResource(R.drawable.addphoto);
        }
      }
    });
  }
  /*定义一个Handler,定义延时执行的行为*/
  public void chnage(){
    new Thread(){
      @Override
      public void run() {
        while ( bitmap == null ){
          bitmap = BitmapFactory.decodeFile(path);
          Log.v("qwe","123");
        }
        Message message = handler.obtainMessage();
        message.obj = 0;
        handler.sendMessage(message);
      }
    }.start();
  }
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //在相册里面选择好相片之后调回到现在的这个activity中
    switch (requestCode) {
      case IMAGE_REQUEST_CODE://这里的requestCode是我自己设置的,就是确定返回到那个Activity的标志
        if (resultCode == RESULT_OK) {//resultcode是setResult里面设置的code值
          try {
            Uri selectedImage = data.getData(); //获取系统返回的照片的Uri
            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);//从系统表中查询指定Uri对应的照片
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            path = cursor.getString(columnIndex); //获取照片路径
            cursor.close();
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 1;
            bitmap = BitmapFactory.decodeFile(path,options);
            imageView01.setImageBitmap(bitmap);
            chnage();
            Toast.makeText(MainActivity.this,path,Toast.LENGTH_SHORT).show();
          } catch (Exception e) {
            // TODO Auto-generatedcatch block
            e.printStackTrace();
          }
        }
        break;
    }
  }
  @TargetApi(19)
  private void handleImageOmKitKat(Intent data){
    String imagePath = null;
    Uri uri = data.getData();
    if (DocumentsContract.isDocumentUri(this,uri)){
      //如果document类型是U日,则通过document id处理
      String docId = DocumentsContract.getDocumentId(uri);
      if ("com.android.providers.media.documents".equals(uri.getAuthority())){
        String id = docId.split(":")[1];//解析出数字格式id
        String selection = MediaStore.Images.Media._ID + "=" + id;
        imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
      }else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())){
        Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
        imagePath = getImagePath(contentUri,null);
      }
    }else if ("content".equalsIgnoreCase(uri.getScheme())){
      //如果是普通类型 用普通方法处理
      imagePath = getImagePath(uri,null);
    }else if ("file".equalsIgnoreCase(uri.getScheme())){
      //如果file类型位uri直街获取图片路径即可
      imagePath = uri.getPath();
    }
    displayImage(imagePath);
  }
  private void handleImageBeforeKitKat(Intent data){
    Uri uri = data.getData();
    String imagePath = getImagePath(uri,null);
    displayImage(imagePath);
  }
  private String getImagePath(Uri uri, String selection){
    String path = null;
    //通过Uri和selection来获取真实图片路径
    Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
    if (cursor != null){
      if (cursor.moveToFirst()){
        path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
      }
      cursor.close();
    }
    return path;
  }
  private void displayImage(String imagePath){
    if (imagePath != null){
      Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
      imageView01.setImageBitmap(bitmap);
    }else {
      Toast.makeText(MainActivity.this,"fail to get image",Toast.LENGTH_SHORT).show();
    }
  }
}

Adapter 配试器:

public class EssayAdapter extends ArrayAdapter<Informations> {
  private int resourceId;
  public EssayAdapter(Context context, int textViewResourceId,
            List<Informations> objects){
    super(context, textViewResourceId, objects);
    resourceId = textViewResourceId;
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    Informations informations = getItem(position);
    View view = LayoutInflater.from(getContext()).inflate(resourceId,parent, false);
    ImageView informationImage = (ImageView) view.findViewById(R.id.image);
    TextView informationEssay = (TextView) view.findViewById(R.id.essay);
    informationImage.setImageBitmap(informations.getImageBitmap());
    informationEssay.setText(informations.getEssay());
    return view;
  }
}

Information类:

包括 Bitmap 和 Essay 两个私有变量

public class Informations {
  //文体
  private String essay;
  //图片
  private Bitmap imageId;
  Informations(Bitmap imageId, String essay){
    this.imageId = imageId;
    this.essay = essay;
  }
  Informations(){
    this.essay = null;
    this.imageId = null;
  }
  public String getEssay() {
    return essay;
  }
  public void setEssay(String essay) {
    this.essay = essay;
  }
  public Bitmap getImageBitmap() {
    return imageId;
  }
  public void setImageBitmap(Bitmap imageId) {
    this.imageId = imageId;
  }
}

权限:

<!--获取照片权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • 史上最全Android build.gradle配置详解(小结)

    Android Studio是采用gradle来构建项目的,gradle是基于groovy语言的,如果只是用它构建普通Android项目的话,是可以不去学groovy的.当我们创建一个Android项目时会包含两个Android build.gradle配置详解文件,如下图: 一.Project的build.gradle文件: 对应的build.gradle代码如下: // Top-level build file where you can add configuration options

  • android分享纯图片到QQ空间实现方式

    最新开发新项目的时候,要做分享项目,要求分享有微信,微信朋友圈,QQ,QQ空间,新浪微博这五个,所分享内容包括,分享纯图片,纯文字,图文类型等,要求分享出去的内容不能带有当前app的logo,而无论使用微信分享sdk,还是qq分享sdk,图文类型的分享都会带有当前app的logo和名称,所以笔者最终只能使用android原生实现分享功能了. 一.分享微信,分享微信单独分享一张图片时,可以使用原生分享,也可以使用微信分享sdk,sdk实现方式,笔者不再多述,网上太多,可以看官方说明: (1)  微

  • Android开发实现的计时器功能示例

    本文实例讲述了Android开发实现的计时器功能.分享给大家供大家参考,具体如下: 效果图: 布局: 三个按钮 加上一个Chronometer <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.a

  • Android开发实现Switch控件修改样式功能示例【附源码下载】

    本文实例讲述了Android开发实现Switch控件修改样式功能.分享给大家供大家参考,具体如下: Android中自带的Switch控件在很多时候总觉得和整体系统风格不符,很多时候,自定义Switch是一种方法. 但其实不用这么麻烦,安卓自带的Switch通过修改一些属性,也可以达到和自定义Switch差不多的一个效果. 个人感觉,Switch的属性设置和其他控件还是有挺大区别的.因此,写下此文,方便有需要的同学参考. 先上效果图: 以上便是修改后效果 与 原生Switch的效果对比.代码在文

  • Android权限如何禁止以及友好提示用户开通必要权限详解

    Android权限 Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用.操作系统或用户有不利影响的任何操作.这包括读写用户的私有数据(联系人,短信,相册,位置).读写其他应用的文件.执行网络访问.使设备保持唤醒状态等等. 如果是一些正常的权限(非高危权限),比如网络访问等在应用清单文件(AndroidManifest.xml)中配置,系统会自动授予, 但是如果有一些高危权限,位置,文件存储,短信等这个时候系统会要求用户授予权限,Android 发出权限请求的方式取决于系统版

  • Android开发实现的圆角按钮、文字阴影按钮效果示例

    本文实例讲述了Android开发实现的圆角按钮.文字阴影按钮效果.分享给大家供大家参考,具体如下: 效果图: 如果要实现圆角图片,并变色须在drawable中配置背景文件如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item andro

  • Android开发中TextView各种常见使用方法小结

    本文实例讲述了Android开发中TextView各种常见使用方法.分享给大家供大家参考,具体如下: 效果图: XML布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/root" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:

  • Android开发之获取单选与复选框的值操作示例

    本文实例讲述了Android开发之获取单选与复选框的值操作.分享给大家供大家参考,具体如下: 效果图: 布局文件: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout

  • Android开发之ListView的简单用法及定制ListView界面操作示例

    本文实例讲述了Android开发之ListView的简单用法及定制ListView界面操作.分享给大家供大家参考,具体如下: 效果: 如何从获得listview上item的内容 详见:https://www.jb51.net/article/158000.htm 中遇到的问题部分. 布局实现: 有个listview显示 一个edit和button发送 <?xml version="1.0" encoding="utf-8"?> <RelativeL

  • Android文字基线Baseline算法的使用讲解

    引言 Baseline是文字绘制时所参照的基准线,只有先确定了Baseline的位置,我们才能准确的将文字绘制在我们想要的位置上.Baseline的概念在我们使用TextView等系统控件直接设置文字内容时是用不到的,但是如果我们想要在Canvas画布上面绘制文字时,Baseline的概念就必不可少了. 我们先了解一下Android中Canvas画布绘制文字的方法,如下图: 参数示意: text,文字内容 x,文字从画布上开始绘制的x坐标(Canvas是一个原点在左上角的平面坐标系) y,Bas

随机推荐