简体   繁体   中英

CustomAdapter Overwrites Items in ListView - Android

This code works, but every time the button is clicked, it overwrites the items in List View instead of adding the items to the bottom of the list. Tried a lot but nothing has solved that issue.

  public static final class ChatRoom2 extends Activity {

    Button addButton;
    ListView listView;
    EditText editText;
    TextView values;
    ImageView userimage;
    ChatRow adapter;
    ChatRow adapter2;
    ChatRow listItems;
    String message;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        String sText = intent.getExtras().getString("textFromList");
        getActionBar().setTitle(sText);
        setContentView(R.layout.chatlayout2);


        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        final int[] images = {R.drawable.image01, R.drawable.image02, R.drawable.image03};



        final int imageId = (int)(Math.random() * images.length);
        userimage = (ImageView) findViewById(R.id.img);
        addButton = (Button) findViewById(R.id.button2);

        editText = (EditText) findViewById(R.id.editText);
        values = (TextView) findViewById(R.id.txt);


        final RowItems weather_data[] = new RowItems[]
                {
                        new RowItems(images[imageId],message)
                };

        adapter = new ChatRow(this,
                R.layout.chatmessage, weather_data);


        listView = (ListView) findViewById(R.id.listView);



         listView.setAdapter(adapter);


        addButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {


                message = editText.getText().toString();
                RowItems item = new RowItems(images[imageId], message);
                adapter.add(item);
                adapter.notifyDataSetChanged();

                editText.setText("");

                //minimize keyboard 
                InputMethodManager imm = (InputMethodManager)getSystemService(Context.
                        INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

            }
        });
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position,
                                    long id) {


                Toast.makeText(ChatRoom2.this, "clicked", Toast.LENGTH_LONG)
                        .show();




            }
        });

    }


}

This is updated, and it crashes now. Here is logcat

07-06 18:56:40.953  17949-17949/com.example.jason.testlist E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(AbstractList.java:404)
        at java.util.AbstractList.add(AbstractList.java:425)
        at android.widget.ArrayAdapter.add(ArrayAdapter.java:179)
        at com.example.jason.testlist.ListViewAndroidExample$ChatRoom2$1.onClick(ListViewAndroidExample.java:213)
        at android.view.View.performClick(View.java:4475)
        at android.view.View$PerformClick.run(View.java:18784)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5450)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
        at dalvik.system.NativeStart.main(Native Method)

You're setting a new (one-item) adapter instead of updating the current one. That's why the ListView doesn't keep the old rows.

First, set up the adapter as soon as you create the ListView (you don't need a second one, and it's probably causing confusion, so just remove adapter2 altogether):

adapter = new ChatRow(this, R.layout.chatmessage, new ArrayList<RowItems>());
adapter.add(new RowItems(images[imageId],message));
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);

Then, change this code:

message = editText.getText().toString();
RowItems messagedata[] = new RowItems[]{ new RowItems(images[imageId], message) };
adapter2 = new ChatRow(ChatRoom2.this, R.layout.chatmessage, messagedata);
listView.setAdapter(adapter2);
adapter2.notifyDataSetChanged();

into something more or less like:

message = editText.getText().toString();
RowItems item = new RowItems(images[imageId], message);
adapter.addItem(item);
adapter.notifyDataSetChanged();

where addItem() adds to the Adapter's data colllection.

If the adapter is an ArrayAdapter and you initialize it with a List<T> , not an array , then you don't have to implement addItem() , just use the built-in add() instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM