需要帮助找出为什么我不能使用自定义ArrayAdapter更改TextView文本

时间:2017-11-06 15:59:51

标签: java android android-arrayadapter

我有一个非常简单的应用程序:

activity_main.xml中

<RelativeLayout>
    <ListView android:id="@+id/emoticon_listview" />
</RelativeLayout>

item.xml

<TextView />

MainActivity.java

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

    int start = 0x1F004;
    int end = 0x1F65C;

    ListView listView = (ListView)findViewById(R.id.emoticon_listview);
    Integer[] emoticon_array = new Integer[end - start]

    for(int codepoint=start, i=0; codepoint<end; codepoint++, i++){
        emoticon_array[i] = codepoint;
    }

    CustomArrayAdapter customArrayAdapter = new CustomArrayAdapter(this, R.layout.item, emoticon_array);
    listView.setAdapter(customArrayAdapter);
}

CustomArrayAdapter.java

public class CustomArrayAdapter extends ArrayAdapter {
    public customArrayAdapter(Context context, int resource, Object[] objects){
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        TextView textView = (TextView) convertView;

        if(textView != null){
            textView.setText(new String(Characters.toChars(Integer.parseInt(textView.getText().toString))));
            // -or-
            textView.setText("Hello, world!");
            // -or-
            textView.setText("whatever ...");
        }
    }

    return super.getView(position, convertView, parent);
}

问题在于,无论我放入textView.setText()覆盖getView() CustomArrayAdapter的{​​{1}},它都会显示原始emoticon_array中的内容。

我甚至试过这个:

return super.getView(position, textView, parent);

但这也没有做任何事情。

我做错了什么?

谢谢:)

2 个答案:

答案 0 :(得分:2)

您正在使用自定义布局R.layout.item所以

  • 您需要在getview中扩充该布局
  • 找到您的观点(TextView)并应用更改然后返回该视图

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
    
        TextView textView;
        if(convertView == null){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item,parent,false);
            // to reuse view next time
        }
        // find your text view
        textView = (TextView)convertView.findViewById(R.id.yourTextViewID);
        textView.setText(getItem(position).toString());
        //textView.setText("Hello, world!");
        // -or-
        //textView.setText("whatever ...");
    
        // return inflated view 
        return convertView;
    }
    

注意:不要使用Object数组并使用getItem使用position来获取项目以显示数组中的项目

答案 1 :(得分:2)

您应该在自己的super.getView()方法的开头致电getView()

@Override
public View getView(int position, View convertView, ViewGroup parent){
    TextView textView = (TextView) super.getView(position, convertView, parent);
    textView.setText("Hello, world!");
    // -or-
    textView.setText("whatever ...");

    return textView;
}

这使您可以利用逻辑来回收convertView,如果它不是null。然后,您可以进行任何您想要的更改并直接返回结果视图。

请注意,我已删除此行:

    textView.setText(new String(Characters.toChars(Integer.parseInt(textView.getText().toString))));

首先,它缺少一对括号,导致编译错误。更重要的是,这为不明显的好处做了很多工作。最终结果是错误,如果原始文本不是数字,或者将文本设置回原始值。