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

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

问题描述

我有一个自定义列表视图,它是从一个对话框中的EditText 组件更新。我有自定义行,适配器类和自定义对话框中的所有工作,但我似乎无法触发code在adatper类,将在编辑文本控件列表中添加文本。这是我的活动code,让我知道,如果你想适配器code。它的工作之前,我添加的自定义行和适配器列表:(

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 :(

症状的问题: emailAdapter.notifyDataSetChanged(); 无助

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);
            }
        });
    }
}

根据要求

适配器code

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();
    }
}

自定义行XML

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:

当你想自定义的的ListView ,你必须写自己的适配器。在这种特殊情况下,我继承了 BaseAdapter 类。

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.

这个自定义适配器将抓住我的数据模型,并将该数据夸大我的的ListView 行。

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

首先,我要创造我的自定义行的XML。你可以看到下面的code。

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.

现在,我将创建我的自定义适配器来处理此XML。正如你可以看到下面。

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.
    }
}

这应该可以解决问题。

我猜你的问题是,你不更新,这是你的自定义适配器相同的ArrayList。这就是为什么当你叫 notifyDataSetChanged()什么都没有发生,我的意思。你正在创建一个新的的ArrayList ,这是不是在你的适配器相同。因此,这里就是我所做的。我所做的的ArrayList 全球性的,然后我在我的自定义适配器构造函数中使用它。此后,当用户触发我的按钮的的onClick()的方法,我插入我的全球阵列​​的一些新的数据,然后我通知适配器数据改变了。

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.

您可以阅读多一点关于这里 我发现一个类似的问题<一href="http://stackoverflow.com/questions/4540754/dynamically-add-elements-to-a-listview-android">here,你可以理解为好。

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

编辑:另一个<一href="http://stackoverflow.com/questions/4799380/understanding-baseadapters-and-how-to-use-them">related问题,这可能是一个有趣的阅读。

Another related question, which might be an interesting read.

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

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