带有适配器的 Android 列表视图仅显示第一项(多次)

Posted

技术标签:

【中文标题】带有适配器的 Android 列表视图仅显示第一项(多次)【英文标题】:Android list view with adapter displays only the first item (several times) 【发布时间】:2021-02-05 22:38:44 【问题描述】:

我创建了一个ListView 和一个自定义适配器以用于列表视图。出于某种原因,如果我在列表中添加多个项目,它会显示多个项目,但它们都与第一个相同。 起初我使用布局文件来创建每个项目,但后来我放弃并动态创建了一个文本视图来测试它。这两种方式都不起作用。

List with same item

这是我的代码:

ArtistAdapter.java

package com.example.list2;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class ArtistAdapter extends BaseAdapter


    private ArrayList<String> artists;
    private Context context;
    private LayoutInflater inflater;

    public ArtistAdapter(Context context, ArrayList<String> artists)
    
        super();
        this.context = context;
        this.artists = artists;
        this.inflater = LayoutInflater.from(context);
    

    public ArtistAdapter(Context context)
    
        this(context, new ArrayList<String>());
    

    @Override
    public int getCount() 
        return artists.size();
    

    @Override
    public String getItem(int i) 
        return artists.get(i);
    

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) 
        View v = view;
        if(v == null)
        
            //LayoutInflater li = ((Activity)context).getLayoutInflater();
            //v = inflater.inflate(R.layout.item,viewGroup,false);
            //((TextView)v.findViewById(R.id.name)).setText((String)getItem(i));
            v = new TextView(context);
            ((TextView)v).setText(getItem(i));
            ((TextView)v).setTextSize(50);
        
        return v;
    

    public void add(String name)
    
        artists.add(name);
        notifyDataSetChanged();
    

MainActivity.java

package com.example.list2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements View.OnClickListener 

    ListView l;
    EditText et;
    Button bt;

    //ArrayAdapter<String> aa;
    ArtistAdapter aa;

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


        l = findViewById(R.id.list);
        et = findViewById(R.id.input);
        bt = findViewById(R.id.submit);

        bt.setOnClickListener(this);

        //aa = new ArrayAdapter<String>(this,R.layout.item,new ArrayList<String>());

        aa = new ArtistAdapter(this);
        l.setAdapter(aa);

    

    @Override
    public void onClick(View v) 
        String inp = getInput();
        if(inp.length() == 0) return;
        aa.add(inp);
        //aa.notifyDataSetChanged();
        empty();
    

    private String getInput()
    
        return et.getText().toString();
    

    private void empty()
    
        et.setText("");
    


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".MainActivity"
    >
    
    <EditText
        android:layout_
        android:layout_
        android:id="@+id/input"
        android:hint="Something..."
        />
    
    <Button
        android:layout_
        android:layout_
        android:id="@+id/submit"
        android:text="Submit!"
        />
    
    <ListView
        android:layout_
        android:layout_
        android:id="@+id/list"
        android:animateLayoutChanges="true"
        ></ListView>

</LinearLayout>

【问题讨论】:

ArtistAdapter getView 第一个变体是可以的,第二个是错误的。 @Style-7 什么意思? LayoutInflater li = ((Activity)context).getLayoutInflater();和接下来的 3 行 - 好的 @Style-7 不,正如我所说,我检查了两个,但它们都没有工作 尝试将((TextView)v).setText(getItem(i));移动到if (v == null) ........之后。 【参考方案1】:

您需要使用自定义适配器吗?否则此代码使用ArrayAdapter 运行良好:

public class MainActivity extends AppCompatActivity implements View.OnClickListener 

ListView l;
EditText et;
Button bt;

ArrayAdapter<String> artistAdapter;
List<String> listItems = new ArrayList<String>();

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

    l = findViewById(R.id.list);
    et = findViewById(R.id.input);
    bt = findViewById(R.id.submit);

    bt.setOnClickListener(this);
    artistAdapter = new ArrayAdapter<String>(this,R.layout.item, R.id.textView,listItems);
    l.setAdapter(artistAdapter);



@Override
public void onClick(View v) 
    String inp = getInput();
    if(inp.length() == 0) return;
    listItems.add(inp);
    artistAdapter.notifyDataSetChanged();
    empty();


private String getInput()

    return et.getText().toString();


private void empty()

    et.setText("");

【讨论】:

是的,我需要一个自定义适配器,我只使用字符串,因为我希望它首先工作,然后我会添加更多的东西,比如图片...... @ShaniDahan 请查看我的其他答案【参考方案2】:

您需要更新arraylist,然后设置适配器。由于某种原因,通知适配器不工作。这是解决方案:

public class MainActivity extends AppCompatActivity implements View.OnClickListener 

ListView l;
EditText et;
Button bt;


ArtistAdapter artistAdapter;
ArrayList<String> arrayList = new ArrayList<>();

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

    l = findViewById(R.id.list);
    et = findViewById(R.id.input);
    bt = findViewById(R.id.submit);
    
    bt.setOnClickListener(this);

    artistAdapter = new ArtistAdapter(this, arrayList);
    l.setAdapter(artistAdapter);



@Override
public void onClick(View v) 
    String inp = getInput();

    if(inp.length() == 0) return;
    arrayList.add(inp);
    l.setAdapter(artistAdapter);

    empty();


private String getInput()

    return et.getText().toString();


private void empty()

    et.setText("");

====

public class ArtistAdapter extends BaseAdapter

私人 ArrayList 艺术家; 私有上下文上下文;

public ArtistAdapter(Context context, ArrayList<String> artists)

    super();
    this.context = context;
    this.artists = artists;


@Override
public int getCount() 
    return artists.size();


@Override
public String getItem(int i) 
    return artists.get(i);


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


@Override
public View getView(int i, View view, ViewGroup viewGroup) 
    View v = view;
    if(v == null)
    
        v = new TextView(context);
        ((TextView)v).setText(getItem(i));
        ((TextView)v).setTextSize(50);
    
    return v;

【讨论】:

以上是关于带有适配器的 Android 列表视图仅显示第一项(多次)的主要内容,如果未能解决你的问题,请参考以下文章

Android:自定义列表视图列表元素点击

ListFragment 仅在带有 ExpandableListadpater 的片段视图中显示第一项

仅显示一项的列表视图

Android:ListView 仅显示第一项。 (请参考提供的图片)

jquery ui自动完成仅显示数据库中的第一项

从listView中删除项目仅删除最后一项未选择的元素android