简体   繁体   English

CustomAdapter会覆盖ListView中的项目-Android

[英]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 这是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. 这就是ListView不保留旧行的原因。

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): 首先,在创建ListView时立即设置适配器(您不需要第二个适配器,这可能会引起混乱,因此只需完全删除adapter2 ):

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. 其中addItem()添加到适配器的数据收集中。

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. 如果适配器是ArrayAdapter 并且使用List<T>而不是array进行初始化 ,则不必实现addItem() ,而只需使用内置的add()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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