从 EditText 更新的 ListView [英] ListView updated from EditText

查看:39
本文介绍了从 EditText 更新的 ListView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义列表视图,它是从对话框中的 EditText 组件更新的.我有自定义行、适配器类和自定义对话框都可以工作,但我似乎无法触发适配器类中的代码,该代码会将编辑文本控件中的文本添加到列表中.这是我的活动代码,如果您需要适配器代码,请告诉我.在我将自定义行和适配器添加到列表之前它起作用了:(

问题的症状:emailAdapter.notifyDataSetChanged();什么都不做

public class InvitePlayers_Activity extends Activity {ListViewAdapter emailAdapter = null;ImageView imgView_mail;ImageView imgView_confirm;@覆盖public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);//移除标题栏setContentView(R.layout.activity_inviteplayers);//从ArrayList生成列表视图显示列表视图();}私有无效 displayListView() {//分配控件final ListView listView = (ListView) findViewById(R.id.listView_invitePlayers);imgView_mail = (ImageView)findViewById(R.id.imgView_mail);//测试数据ArrayList邀请新 = 新 ArrayList();最终的 ArrayList>邀请列表 = 新的 ArrayList>();emailAdapter = new ListViewAdapter(this,inviteList);listView.setAdapter(emailAdapter);//将适配器分配给 ListViewlistView.setTextFilterEnabled(true);//编辑监听器imgView_mail.setOnClickListener(new View.OnClickListener() {public void onClick(查看视图){//变量final String enterMail = "testListViewEntry";最终的 ArrayList>邀请列表 = 新的 ArrayList>();ArrayList邀请 = 新的 ArrayList();邀请.add(0, enterMail);//添加第一封电子邮件邀请.添加(1,icon_invitestatussent.png");//添加第一个状态图标邀请列表.添加(邀请);emailAdapter.notifyDataSetChanged();listView.setAdapter(emailAdapter);}});}}

请求的适配器代码

public class ListViewAdapter extends BaseAdapter {私人活动上下文;ArrayList>邀请详细信息 = new ArrayList>();public ListViewAdapter(活动上下文,ArrayList>邀请详细信息){this.inviteDetails = 邀请详细信息;this.context = 上下文;}@覆盖公共 int getCount() {返回邀请详细信息.size();}@覆盖公共对象 getItem(int i) {返回邀请详细信息.get(i).get(0);}@覆盖公共长 getItemId(int i) {返回我;}public View getView(int position, View view, ViewGroup parent){//充气机LayoutInflater inflater = context.getLayoutInflater();//获取行视图如果(视图==空){LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);视图 = mInflater.inflate(R.layout.list_item_email, null);}//分配控件final TextView textView_playerEmail = (TextView) view.findViewById(R.id.textView_playerEmail);ImageView imgView_inviteStatus = (ImageView) view.findViewById(R.id.imgView_inviteStatus);//分配动态的控制值textView_playerEmail.setText(inviteDetails.get(position).get(0));imgView_inviteStatus.setImageResource(R.drawable.icon_invitestatussent);返回视图;}@覆盖public void notifyDataSetChanged() {super.notifyDataSetChanged();}}

自定义行xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"机器人:填充=10dp"android:textSize="16sp"android:id="@+id/textView_playerEmail"android:textColor="@color/white"android:text="item1"></TextView><图像视图android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/imgView_inviteStatus"/><图像视图android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/imgView_remove"android:src="@drawable/btn_cancel"/></LinearLayout>

活动布局

 <线性布局机器人:方向=水平"android:layout_width="fill_parent"android:layout_height="wrap_content"机器人:weightSum =1"机器人:重力=左|中心"><图像视图android:layout_width="45dp"android:layout_height="34dp"android:id="@+id/imgView_mail"android:src="@drawable/btn_mail"机器人:layout_weight="0.22"android:padding="3dp"/></LinearLayout><列表视图android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/listView_invitePlayers"android:layout_gravity="center_horizo​​ntal"/></LinearLayout><图像视图android:layout_width="80dp"android:layout_height="80dp"android:id="@+id/btn_confirm"android:src="@drawable/btn_confirm"机器人:可点击=假"android:adjustViewBounds="true"android:layout_gravity="center_horizo​​ntal"机器人:填充=2dp"android:layout_weight="1"/></LinearLayout></FrameLayout>

解决方案

好吧,对于我们讨论的内容,您想要的是这样的:

当你想自定义ListView时,你必须编写你自己的适配器.在这种特殊情况下,我将 BaseAdapter 类.

这个自定义适配器将控制我的数据模型,并将数据扩充到我的 ListView 行.

首先,我将创建自定义行的 XML.你可以看到下面的代码.

item_mail.xml

<文本视图android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="测试文本"android:id="@+id/tv_mail"android:layout_alignParentTop="true"机器人:layout_alignParentLeft =真"android:layout_alignParentStart="true"android:layout_centerVertical="true"/><图像视图android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/iv_icon"android:layout_alignParentTop="true"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"机器人:layout_centerVertical =真"android:src="@android:drawable/ic_menu_report_image"/></RelativeLayout>

这里我创建了一行显示文本和图像.

现在,我将创建我的自定义适配器来处理此 XML.如下所示.

MailAdapter.java

public class MailAdapter extends BaseAdapter {私有静态最终字符串LOG_TAG = MailAdapter.class.getSimpleName();私有上下文上下文_;私有 ArrayList>邮寄物品;公共邮件适配器(上下文上下文,ArrayList>mailitems){this.context_ = 上下文;this.mailitems = mailitems;}@覆盖公共 int getCount() {返回mailitems.size();}@覆盖公共对象 getItem(int position) {返回 mailitems.get(position).get(0);}@覆盖public long getItemId(int position) {返回位置;}@覆盖public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {LayoutInflater mInflater = (LayoutInflater)context_.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);convertView = mInflater.inflate(R.layout.item_mail, null);}TextView tv_mail = (TextView) convertView.findViewById(R.id.tv_mail);ImageView iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);String mail = mailitems.get(position).get(0);String icon = mailitems.get(position).get(1);Log.d(LOG_TAG,"邮件:" + 邮件 + " 邮件图标:" + 图标);tv_mail.setText(mail);//iv_icon.setImageURI();在这里,您可以使用 URI、ID 或其他内容来执行您想要更新图像的任何逻辑.返回转换视图;}}

好的.现在,我们拥有了使这项工作正常进行的一切.在您的 Activity 类中,执行以下操作:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizo​​ntal_margin"android:paddingRight="@dimen/activity_horizo​​ntal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin" 工具:context=".MainActivity"><文本视图android:text="@string/hello_world"android:id="@+id/tv_header"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizo​​ntal="true"/><线性布局机器人:方向=垂直"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@+id/tv_header"><按钮android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="添加邮件"android:id="@+id/按钮"android:layout_gravity="中心"/><列表视图android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/listView"/></LinearLayout></RelativeLayout>

MainActivity.java

公共类 MainActivity 扩展 ActionBarActivity {私人 int numMail = 1;//Dummy int 用不同的数字创建我的项目.私人邮件适配器邮件适配器;//您的自定义适配器.私有 ArrayList>邮件项目;//这将是您的数据结构,每次更改它时,调用 notifyDataSetChanged() 方法.@覆盖protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);按钮 bt = (Button) findViewById(R.id.button);ListView lv_mail = (ListView) findViewById(R.id.listView);mailItems = new ArrayList<>();mailAdapter = new MailAdapter(this,mailItems);lv_mail.setAdapter(mailAdapter);bt.setOnClickListener(new View.OnClickListener() {@覆盖public void onClick(View v) {新增项目();//我用来插入项目的方法.在下面寻找它.}});}//这里我正在创建一个新的 ArrayList,并将其附加到我的 'mailItems' 数组中.之后,我会通知适配器我的数据已更改.私有无效 addItem() {ArrayList邮件 = 新的 ArrayList<>();mail.add(0,"mail" + numMail++);mail.add(1,"path_to_image");//根据您要执行的操作,输入您的路径、URI 或您想要存储该图像数据的任何其他方式.mailItems.add(mail);//在 ArrayList 上插入数据.mailAdapter.notifyDataSetChanged();//通知适配器我的 ArrayList 已被修改.}}

这应该可以解决问题.

我猜您的问题是您没有更新自定义适配器中的同一个 ArrayList.这就是为什么当您调用 notifyDataSetChanged() 时什么也没发生,我的意思是.您正在创建一个新的 ArrayList,它与您的适配器中的不同.所以这就是我所做的......我已经将 ArrayList 设为全局,然后在我的自定义适配器构造函数中使用它.之后,当用户触发我的按钮的 onClick() 方法时,我会在我的全局数组中插入一些新数据,然后我会通知适配器数据已更改.>

您可以在此处阅读更多相关信息,我发现了一个类似的问题此处,您也可以阅读.

另一个相关问题,这可能是一个有趣的问题阅读.

I have a Custom Listview that it is updated from a EditText component in a dialog. I have the custom row, the adapter class and the custom dialog all working but I can't seem to trigger the code in the adatper class that would add the text from the edit text control to the list. Here is my activity code, let me know if you want the adapter code. It worked before I added the custom row and adapter to the list :(

Symptom of problem: emailAdapter.notifyDataSetChanged(); does nothing

public class InvitePlayers_Activity extends Activity {
    ListViewAdapter emailAdapter = null;
    ImageView imgView_mail;
    ImageView imgView_confirm;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE); //remove title bar
        setContentView(R.layout.activity_inviteplayers);

        //Generate list View from ArrayList
        displayListView();
    }

    private void displayListView() {
        //assign controls
        final ListView listView = (ListView) findViewById(R.id.listView_invitePlayers);
        imgView_mail = (ImageView)findViewById(R.id.imgView_mail);

        //Test data
        ArrayList<String> inviteNew = new ArrayList<String>();
        final ArrayList<ArrayList<String>> inviteList = new ArrayList<ArrayList<String>>();

        emailAdapter = new ListViewAdapter(this,inviteList);
        listView.setAdapter(emailAdapter);

        // Assign adapter to ListView
        listView.setTextFilterEnabled(true);

        //Edit listeners
        imgView_mail.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view)
            {
                        //variables
                        final String enteredMail = "testListViewEntry";
                        final ArrayList<ArrayList<String>> inviteList = new ArrayList<ArrayList<String>>();
                        ArrayList<String> invite = new ArrayList<String>();
                        invite.add(0, enteredMail);//add first email
                        invite.add(1,"icon_invitestatussent.png"); //add first status icon
                        inviteList.add(invite);
                        emailAdapter.notifyDataSetChanged();
                        listView.setAdapter(emailAdapter);
            }
        });
    }
}

Adapter code as requested

public class ListViewAdapter extends BaseAdapter {
    private Activity context;
    ArrayList<ArrayList<String>> inviteDetails = new ArrayList<ArrayList<String>>();
    public ListViewAdapter(Activity context, ArrayList<ArrayList<String>> inviteDetails ) {
        this.inviteDetails = inviteDetails;
        this.context = context;
    }

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

    @Override
    public Object getItem(int i) {
        return inviteDetails.get(i).get(0);
    }

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

    public View getView(int position, View view, ViewGroup parent){
        //Inflater
        LayoutInflater inflater = context.getLayoutInflater();

        //get row view
        if (view == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            view = mInflater.inflate(R.layout.list_item_email, null);
        }

        //assign controls
        final TextView textView_playerEmail = (TextView) view.findViewById(R.id.textView_playerEmail);
        ImageView imgView_inviteStatus = (ImageView) view.findViewById(R.id.imgView_inviteStatus);

        //Assign control values that are dynamic
        textView_playerEmail.setText(inviteDetails.get(position).get(0));
        imgView_inviteStatus.setImageResource(R.drawable.icon_invitestatussent);

        return view;
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }
}

Custom row xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="10dp"
        android:textSize="16sp"
        android:id="@+id/textView_playerEmail"
        android:textColor="@color/white"
        android:text="item1">
    </TextView>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imgView_inviteStatus" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imgView_remove"
        android:src="@drawable/btn_cancel" />
</LinearLayout>

The activity layout

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:background="@color/yellow"
            android:layout_margin="20dp"
            android:padding="5dp">

            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:weightSum="1"
                android:gravity="left|center">


                <ImageView
                    android:layout_width="45dp"
                    android:layout_height="34dp"
                    android:id="@+id/imgView_mail"
                    android:src="@drawable/btn_mail"
                    android:layout_weight="0.22"
                    android:padding="3dp" />
            </LinearLayout>

            <ListView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/listView_invitePlayers"
                android:layout_gravity="center_horizontal" />
        </LinearLayout>

        <ImageView
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:id="@+id/btn_confirm"
            android:src="@drawable/btn_confirm"
            android:clickable="false"
            android:adjustViewBounds="true"
            android:layout_gravity="center_horizontal"
            android:padding="2dp"
            android:layout_weight="1" />
    </LinearLayout>

</FrameLayout>

解决方案

Well, for what we discussed, you wanted something like this:

When you want to make a custom ListView, you have to write your own adapter. In this particular case I'm subclassing the BaseAdapter class.

This custom adapter will take hold of my data model, and will inflate the data to my ListView rows.

First, I'll create the XML of my custom row. You can see the code below.

item_mail.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test text"
        android:id="@+id/tv_mail"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/iv_icon"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@android:drawable/ic_menu_report_image" />
</RelativeLayout>

Here I've created a row that displays a text and an image.

Now, I'll create my custom adapter to handle this XML. As you can see below.

MailAdapter.java

public class MailAdapter extends BaseAdapter {

    private static final String LOG_TAG = MailAdapter.class.getSimpleName();

    private Context context_;
    private ArrayList<ArrayList<String>> mailitems;

    public MailAdapter(Context context, ArrayList<ArrayList<String>> mailitems) {
        this.context_ = context;
        this.mailitems = mailitems;
    }

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

    @Override
    public Object getItem(int position) {
        return mailitems.get(position).get(0);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context_.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            convertView = mInflater.inflate(R.layout.item_mail, null);
        }

        TextView tv_mail = (TextView) convertView.findViewById(R.id.tv_mail);
        ImageView iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);

        String mail = mailitems.get(position).get(0);
        String icon = mailitems.get(position).get(1);

        Log.d(LOG_TAG,"Mail: " + mail + " mail_icon: " + icon);

        tv_mail.setText(mail);
        // iv_icon.setImageURI(); Here you can do whatever logic you want to update your image, using URI's, ID's, or something else.

        return convertView;
    }
}

Ok. Now we have everything to make this work. In your Activity class, do something like that:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView
        android:text="@string/hello_world"
        android:id="@+id/tv_header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tv_header">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add mail"
            android:id="@+id/button"
            android:layout_gravity="center" />

        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listView" />
    </LinearLayout>

</RelativeLayout>

MainActivity.java

public class MainActivity extends ActionBarActivity {

    private int numMail = 1; // Dummy int to create my items with different numbers.

    private MailAdapter mailAdapter; // Your custom adapter.

    private ArrayList<ArrayList<String>> mailItems; // This is going to be your data structure, everytime you change it, call the notifyDataSetChanged() method.

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

        Button bt = (Button) findViewById(R.id.button);
        ListView lv_mail = (ListView) findViewById(R.id.listView);
        mailItems = new ArrayList<>();
        mailAdapter = new MailAdapter(this,mailItems);
        lv_mail.setAdapter(mailAdapter);

        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addItem(); // The method I'm using to insert the item. Look for it below.
            }
        });
    }

    // Here I'm creating a new ArrayList, and appending it to my 'mailItems' Array. After that, I'm notifying the adapter that my data changed.
    private void addItem() {
        ArrayList<String> mail = new ArrayList<>();

        mail.add(0,"mail " + numMail++);
        mail.add(1,"path_to_image"); // Depending on what you want to do, put your path, URI, or whatever other way you want to store that image data.

        mailItems.add(mail); // Inserting the data on the ArrayList.
        mailAdapter.notifyDataSetChanged(); // Notifying the adapter that my ArrayList was modified.
    }
}

This should do the trick.

I guess your problem was that you weren't updating the same ArrayList that was in your custom adapter. That's why when you called notifyDataSetChanged()nothing happened, I mean. You were creating a new ArrayList, which wasn't the same that was in your adapter. So here's what I did... I've made the ArrayList global, and then I've used it in my custom adapter constructor. After that, when the user triggers the onClick() method of my button, I'm inserting some new data on my global Array, and then I'm notifying the adapter that the data changed.

You can read a little more about that here and I've found a similar question here, which you can read as well.

Edit: Another related question, which might be an interesting read.

这篇关于从 EditText 更新的 ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆