Java Listview只反复显示最后一项
我是android开发新手。我参加了Udacity课程,我必须使用服装阵列适配器来显示数据(文本)的列表视图。我确定了大部分内容,但我对显示的数据有一个问题,即:当我启动活动时,列表视图显示五月阵列列表上的最后一项 我几乎什么都试过了他们什么都不管用 我的数据Java Listview只反复显示最后一项,java,android,arraylist,android-listview,custom-arrayadapter,Java,Android,Arraylist,Android Listview,Custom Arrayadapter,我是android开发新手。我参加了Udacity课程,我必须使用服装阵列适配器来显示数据(文本)的列表视图。我确定了大部分内容,但我对显示的数据有一个问题,即:当我启动活动时,列表视图显示五月阵列列表上的最后一项 我几乎什么都试过了他们什么都不管用 我的数据 /** * Displays text to the user. */ public class Numbers { //First we Set the Stat of our Class : // Engli
/**
* Displays text to the user.
*/
public class Numbers {
//First we Set the Stat of our Class :
// English Translation
public static String englishTranslation;
//Tamazight Translation
public static String tamazightTranslation;
/**
* Create a new Numbers Object :
*
* @param englishTranslation is for ENGLISH NUMBERS
* @param tamazightTranslation is for TAMAZIGHT NUMBERS
*/
//Constructor
public Numbers(String englishTranslation, String tamazightTranslation) {
this.englishTranslation = englishTranslation;
this.tamazightTranslation = tamazightTranslation;
}
//Getter
public static String getEnglishTranslation() {
return englishTranslation;
}
public static String getTamazightTranslation() {
return tamazightTranslation;
}
}
我的ArrayList:
public class ActivityNumbers extends AppCompatActivity {
//Add English numbers to The ARRAYList
ArrayList<Numbers> englishNumbers = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_numbers);
englishNumbers.add(new Numbers("One", "Yan"));
englishNumbers.add(new Numbers("Two", "Sin"));
englishNumbers.add(new Numbers("Three", "Krad"));
englishNumbers.add(new Numbers("Four", "Koz"));
englishNumbers.add(new Numbers("Five", "Smos"));
englishNumbers.add(new Numbers("Six", "Sdis"));
englishNumbers.add(new Numbers("Seven", "Sa"));
englishNumbers.add(new Numbers("Eight", "Tam"));
englishNumbers.add(new Numbers("Nine", "Tza"));
englishNumbers.add(new Numbers("Ten", "Mraw"));
//EnglishNumbers.remove(0);
//EnglishNumbers.size();
// EnglishNumbers.get(1);
//Create a NEW TV object
/**Creating an ArrayAdapter (DATA HOLDER)
@param Context / the ACTIVITY concerned
@param Android.R.layout : an XML layout file contains TextView predefined by Android
@param Items to display */
NumbersAdapter itemsAdapter = new NumbersAdapter (this, englishNumbers);
// Linking the ListView object to a Variable
ListView numbersListView = (ListView) findViewById(R.id.list);
//Calling setAdapter Method on numbersListView with "itemsAdapter
numbersListView.setAdapter(itemsAdapter);
}
}
公共类ActivityNumber扩展了AppCompatActivity{
//将英文数字添加到ARRAYList
ArrayList EnglishNumber=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_编号);
增加(新的数字(“一”,“延”);
英文数字。加上(新的数字(“2”,“Sin”);
增加(新的数字(“三”,“克拉”);
增加(新的数字(“四”,“科兹”);
增加(新的数字(“五”、“SMO”);
增加(新的数字(“六”、“特殊数字”);
增加(新的数字(“七”,“Sa”);
增加(新的数字(“八”,“Tam”));
增加(新的数字(“九”,“Tza”);
英文编号。添加(新编号(“十”、“Mraw”);
//删除(0);
//英文数字。大小();
//英语数字。get(1);
//创建新的电视对象
/**创建ArrayAdapter(数据保持器)
@参数上下文/相关活动
@param Android.R.layout:XML布局文件包含Android预定义的TextView
@要显示的参数项*/
NumberAdapter itemsAdapter=新的NumberAdapter(这是英文数字);
//将ListView对象链接到变量
ListView numberListView=(ListView)findViewById(R.id.list);
//使用“itemsAdapter”在NumberListView上调用setAdapter方法
numbersListView.setAdapter(itemsAdapter);
}
}
我的适配器:
public class NumbersAdapter extends ArrayAdapter<Numbers> {
public NumbersAdapter(Context context, ArrayList<Numbers> englishNumbers) {
super(context, 0, englishNumbers);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(R.layout.listitem, parent, false);
}
Numbers numbers = getItem(position);
System.out.println(position);
TextView tamazight_item = (TextView) listItemView.findViewById(R.id.tamazight_item);
TextView english_item = (TextView) listItemView.findViewById(R.id.english_item);
tamazight_item.setText(numbers.getEnglishTranslation());
System.out.println(numbers.getEnglishTranslation());
english_item.setText(numbers.getTamazightTranslation());
System.out.println(numbers.getTamazightTranslation());
return listItemView;
}
}
public class NumbersAdapter扩展了ArrayAdapter{
公共数字适配器(上下文,数组列表英文数字){
超级(上下文,0,英文编号);
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
View listItemView=convertView;
如果(listItemView==null){
listItemView=LayoutInflater.from(getContext()).flate(R.layout.listitem,父项,false);
}
编号=获取项目(位置);
系统输出打印项次(位置);
TextView tamazight_item=(TextView)listItemView.findViewById(R.id.tamazight_item);
TextView英语项目=(TextView)listItemView.findViewById(R.id.english项目);
tamazight_item.setText(number.getEnglishTranslation());
System.out.println(numbers.getEnglishTranslation());
english_item.setText(numbers.getAmazightTranslation());
System.out.println(numbers.getAmazightTranslation());
返回listItemView;
}
}
您的tamazightTranslation
和englishTranslation
属性在数字上是静态的,这意味着,这些都是类属性。从变量和getter中删除静态的
,您应该不会有问题。请在此处查看类属性和实例属性之间的差异 这样试试
Context context;
ArrayList<Numbers> englishNumbers;
public NumbersAdapter(Context context, ArrayList<Numbers> englishNumbers)
{
this.context=context;
this.englishNumbers=englishNumbers;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
convertView= LayoutInflater.from(context).inflate(R.layout.listitem,parent,false);
TextView tamazight_item = (TextView) listItemView.findViewById(R.id.tamazight_item);
TextView english_item = (TextView) listItemView.findViewById(R.id.english_item);
tamazight_item.setText(englishNumbers.get(position).getEnglishTranslation());
english_item.setText(englishNumbers.get(position).getTamazightTranslation());
return convertView;
}
语境;
ArrayList英语编号;
公共数字适配器(上下文,数组列表英文数字)
{
this.context=context;
这个。EnglishNumber=EnglishNumber;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
convertView=LayoutFlater.from(上下文)。充气(R.layout.listitem,父项,false);
TextView tamazight_item=(TextView)listItemView.findViewById(R.id.tamazight_item);
TextView英语项目=(TextView)listItemView.findViewById(R.id.english项目);
tamazight_item.setText(英语编号.get(位置).getEnglishTranslation());
english_item.setText(englishNumbers.get(position.getAmazightTranslation());
返回视图;
}
不要忘了制作NumberAdapter extends BaseAdapter我已经更改了您的模型类和适配器类,请按照此操作,它将起作用
public class Numbers {
//First we Set the Stat of our Class :
// English Translation
private String englishTranslation;
//Tamazight Translation
private String tamazightTranslation;
public String getEnglishTranslation() {
return englishTranslation;
}
public void setEnglishTranslation(String englishTranslation) {
this.englishTranslation = englishTranslation;
}
public String getTamazightTranslation() {
return tamazightTranslation;
}
public void setTamazightTranslation(String tamazightTranslation) {
this.tamazightTranslation = tamazightTranslation;
}
}
适配器类
public class NumbersAdapter extends ArrayAdapter<Numbers> {
private Context mContext;
private ArrayList<Numbers>list;
public NumbersAdapter(Context context, ArrayList<Numbers> englishNumbers) {
super(context, 0, englishNumbers);
this.mContext=context;
this.list = englishNumbers;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(mContext).inflate(R.layout.listitem, parent, false);
}
Numbers numbers = list.get(position);
System.out.println(position);
TextView tamazight_item = (TextView) listItemView.findViewById(R.id.tamazight_item);
TextView english_item = (TextView) listItemView.findViewById(R.id.english_item);
tamazight_item.setText(numbers.getEnglishTranslation());
System.out.println(numbers.getEnglishTranslation());
english_item.setText(numbers.getTamazightTranslation());
System.out.println(numbers.getTamazightTranslation());
return listItemView;
}
}
public class NumbersAdapter扩展了ArrayAdapter{
私有上下文;
私人审裁专家;
公共数字适配器(上下文,数组列表英文数字){
超级(上下文,0,英文编号);
this.mContext=上下文;
this.list=英文编号;
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
View listItemView=convertView;
如果(listItemView==null){
listItemView=LayoutFlater.from(mContext).充气(R.layout.listitem,父项,false);
}
number=list.get(位置);
系统输出打印项次(位置);
TextView tamazight_item=(TextView)listItemView.findViewById(R.id.tamazight_item);
TextView英语项目=(TextView)listItemView.findViewById(R.id.english项目);
tamazight_item.setText(number.getEnglishTranslation());
System.out.println(numbers.getEnglishTranslation());
english_item.setText(numbers.getAmazightTranslation());
System.out.println(numbers.getAmazightTranslation());
返回listItemView;
}
}
如果它在listview中显示最后一项,可能有几个原因
您需要在ArrayAdapter中重写getCount()
,以获得列表的大小。这可能会解决此问题
确保列表视图未在xml布局的scrollview中声明。如果是,请使用nestedscrollview或其他方法正确处理它
如果它在所有行中显示相同的数据