带有适配器的 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 列表视图仅显示第一项(多次)的主要内容,如果未能解决你的问题,请参考以下文章
ListFragment 仅在带有 ExpandableListadpater 的片段视图中显示第一项