LIstView自定义布局

 这是我的第一篇在CSDN博客写的内容。是关于在ListView中如何使用自定义的布局的问题。(本笔脑瓜不太好用,所以花了两天的时间去大概的弄明白了ListView的工作原理)我做了一个简单的聊天界面工参考,先放效果图跟代码!

效果图(Back按钮是生成左边文字,Go生成右边文字):

这是主函数类:MainActivity

package com.example.chat;

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

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class MainActivity extends Activity {
    Button buttonleft,buttonright ;
    EditText edittext ;
    List<Message> messagelist = new ArrayList<Message>() ;;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonleft = (Button)findViewById(R.id.back) ;
        buttonright = (Button)findViewById(R.id.go) ;

        buttonleft.setOnClickListener(new View.OnClickListener() {          
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                edittext = (EditText)findViewById(R.id.edittext);
                String str = edittext.getText().toString();
                initMessageleft(1,str);             
                MyAdapter adapter = new MyAdapter(MainActivity.this,R.layout.leftitem,messagelist);
                ListView listview = (ListView)findViewById(R.id.listview) ;
                listview.setAdapter(adapter);
                edittext.setText("");
            }


        });
        buttonright.setOnClickListener(new View.OnClickListener() {         
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                edittext = (EditText)findViewById(R.id.edittext);
                String str = edittext.getText().toString();
                initMessageright(0,str);                
                MyAdapter adapter = new MyAdapter(MainActivity.this,R.layout.rightitem,messagelist);
                ListView listview = (ListView)findViewById(R.id.listview) ;
                listview.setAdapter(adapter);
                edittext.setText("");
            }


        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    private void initMessageleft(int type,String meg) {
        // TODO Auto-generated method stub
        Message leftmes = new Message(type,meg) ;
        messagelist.add(leftmes);
    }
    private void initMessageright(int type,String meg) {
        // TODO Auto-generated method stub
        Message rightmes = new Message(type,meg) ;
        messagelist.add(rightmes);
    }
}

适配器类MyAdapter(继承ArrayAdapter)

package com.example.chat;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter{
    int itemid ;
    public MyAdapter(Context context, int resource, List<Message> objects) {
        super(context, resource, objects);
        itemid = resource ;
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position,View convertVeiw,ViewGroup parent){
        Message mes =  (Message) getItem(position) ;
        View view = null ;
        if(mes.getType()==1){
            view  = LayoutInflater.from(getContext()).inflate(R.layout.leftitem, null);
            TextView leftview=(TextView)view.findViewById(R.id.leftview);
            String str = mes.getMessage();
            leftview.setText(str);
        }
        if(mes.getType()==0){
            view  = LayoutInflater.from(getContext()).inflate(R.layout.rightitem, null);
            TextView rightview=(TextView)view.findViewById(R.id.rightview);
            String str = mes.getMessage();
            rightview.setText(str);
        }
        return view ;

    }
}

一个实体类Message,作为适配器的适配类型

package com.example.chat;

public class Message {
    int type ;
    String message ;
    public Message(int type,String message){
        this.type = type ;
        this.message = message ;
    }
    public String getMessage(){
        return message ;
    }
    public int getType(){
        return type ;
    }
}

一下是一个左边文字的自定义布局(leftitem.xml)跟一个右边文字的自定义布局(rightitem.xml)(是分开定义的,我这里只是把代码放一块了):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="left"
    android:orientation="vertical" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/ooooooo"
        android:layout_margin="10dp"
        android:id="@+id/leftview"
        android:text="sjfsdfjisfhsoifd"
        />

</LinearLayout>

<?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" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/messagerightgg"
        android:id="@+id/rightview"
        android:layout_margin="10dp"
        android:layout_gravity="right"
        android:text="sjfsdfjisfhsoifd"
        />

</LinearLayout>

主活动布局layout_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
   <ListView
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="1"
       android:id="@+id/listview"
       android:divider="#0000"
       />
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
   <Button
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:id="@+id/back"
       android:text="Back"
       />
   <EditText
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="3"
       android:id="@+id/edittext"
       />
   <Button
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:id="@+id/go"
       android:text="Go"
       />
   </LinearLayout>

</LinearLayout>

ListView中主要是适配器的编写比较麻烦,他是把数据和视图转换的媒介吧。通过getView()方法可以将你自定义的view放进ListView中。
起初我在编写的过程中遇到这样一个问题,按下Back生成左边的文字,然后在按下Go生成右边的文字,结果他把左边的文字都变到右边。就是按下了哪边的按钮,那上面存在的字就会全部重生成到按钮那边。(特意画了张图,希望能帮你们理解我的意思)
这里写图片描述
发生这个问题的原因是我在Myadapter编写中还没有在Message类中使用type成员,在Myadapter中原来判断条件是(itemid==R.layout.leftitem)(itemid==R.layout.rightitem)
所以在加载我的listmessage进去适配器的时候就通过我按按钮的位置把我全部的message加载到了一边。
修改方法上面给出的代码:使用type成员来区分。

本人也是android路上的一只小菜鸟。希望能和喜欢这门的人一起进步一起交流。
半夜1:30把这篇写完就该睡了,舍友被我清脆的键盘声音吵到不能安心玩手机了 ,哈哈!(大三狗,汪汪)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值