Android 自定义视图适配器

Android 自定义视图适配器,android,Android,我看了纽伯顿的教程,有些东西我不明白 我不明白主操作如何知道要使用什么CustomListView,我们没有传递任何有关它的信息。 唯一的信息是我们在MainActivty设置的上下文和字符串数组。 (9:01)看起来他从自定义行中获取了数组的名称,但我检查了它,这是主活动 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceStat

我看了纽伯顿的教程,有些东西我不明白

我不明白主操作如何知道要使用什么CustomListView,我们没有传递任何有关它的信息。 唯一的信息是我们在MainActivty设置的上下文和字符串数组。 (9:01)看起来他从自定义行中获取了数组的名称,但我检查了它,这是主活动

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String [] names = {"a"," b","c", "d", "e"};


        ListAdapter elichaiAdapter = new CustomAdapter(this , names);
        ListView elichaiListView = (ListView) findViewById(R.id.elichaiListView);

        elichaiListView.setAdapter(elichaiAdapter);


        elichaiListView.setOnItemClickListener(
                new AdapterView.OnItemClickListener(){
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        //get the the value as string
                        String food = String.valueOf(parent.getItemAtPosition(position));
                        Toast.makeText(MainActivity.this , food , Toast.LENGTH_SHORT).show();
                    }
                }
        );
    }
}
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
字符串[]名称={“a”、“b”、“c”、“d”、“e”};
ListAdapter Elichaadapter=新的CustomAdapter(此,名称);
ListView elichaiListView=(ListView)findViewById(R.id.elichaiListView);
elichaiListView.setAdapter(Elichaidapter);
elichaiListView.setOnItemClickListener(
新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//将值作为字符串获取
String food=String.valueOf(parent.getItemAtPosition(position));
Toast.makeText(MainActivity.this,food,Toast.LENGTH_SHORT).show();
}
}
);
}
}
自定义行类

    class CustomAdapter extends ArrayAdapter<String> {

    CustomAdapter(Context context, String [] names) {

         super(context, R.layout.coustem_raw,  names );
     }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater elichaiInflater = LayoutInflater.from(getContext());

        View customView = elichaiInflater.inflate(R.layout.coustem_raw, parent, false);
        String nameItem = getItem(position);
        TextView elichaiText = (TextView) customView.findViewById(R.id.elichaiTextView);
        ImageView elichaiImage = (ImageView) customView.findViewById(R.id.elichaiImageView);

        elichaiText.setText(nameItem);
        elichaiImage.setImageResource(R.drawable.noname);
        return customView;
    }
}
class CustomAdapter扩展了ArrayAdapter{
CustomAdapter(上下文上下文,字符串[]名称){
super(上下文、R.layout.coustem_raw、名称);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutInflater elichaiInflater=LayoutInflater.from(getContext());
View customView=elichaiInflater.充气(R.layout.coustem_raw,parent,false);
字符串nameItem=getItem(位置);
TextView-elichaiText=(TextView)customView.findViewById(R.id.elichaiTextView);
ImageView elichaiImage=(ImageView)customView.findViewById(R.id.elichaiImage视图);
elichaiText.setText(名称项);
elichaiImage.setImageResource(R.drawable.noname);
返回自定义视图;
}
}
什么是混淆

重要的一点是:

ListAdapter elichaiAdapter = new CustomAdapter(this , names);
因此,您告诉MainActivity使用您的CustomAdapter。您为它提供了一个上下文和一个数组,该数组将填充列表视图

因为它是CustomAdapter的新实例,所以对它所做的任何更改都将仅针对该实例

然后,您将在此处告诉listView使用此自定义适配器:

elichaiListView.setAdapter(elichaiAdapter);
如果要更改自定义适配器。您必须编辑或创建一个新实例,或者创建一个新适配器,并在该适配器上运行上述代码行。然后,您将通知列表视图已进行了更改

因此,我们:

(CustomAdapter)    (new CustomAdapter)      (findViewById)      .inflate(R.layout)

Adapter Class   ->   Adapter instance    ->    List View     ->  Layout (design) 
将它们全部连接在一起,您就可以看到一个正常工作的列表视图

什么是混淆

重要的一点是:

ListAdapter elichaiAdapter = new CustomAdapter(this , names);
因此,您告诉MainActivity使用您的CustomAdapter。您为它提供了一个上下文和一个数组,该数组将填充列表视图

因为它是CustomAdapter的新实例,所以对它所做的任何更改都将仅针对该实例

然后,您将在此处告诉listView使用此自定义适配器:

elichaiListView.setAdapter(elichaiAdapter);
如果要更改自定义适配器。您必须编辑或创建一个新实例,或者创建一个新适配器,并在该适配器上运行上述代码行。然后,您将通知列表视图已进行了更改

因此,我们:

(CustomAdapter)    (new CustomAdapter)      (findViewById)      .inflate(R.layout)

Adapter Class   ->   Adapter instance    ->    List View     ->  Layout (design) 

将它们连接在一起,您将看到一个功能列表视图

您好,谢谢您的回答。我知道最重要的一行是什么,但我不明白我设置的上下文是MainActivty上下文(这个),数组是我之前在MainActivty设置的数组,自定义行的信息在哪里?如果我有另一个自定义列表视图,他怎么知道该使用哪一个呢?
View customView=elichaiInflater.inflate(R.layout.coustem_raw,parent,false)。。。在
getView()
方法中,您将单个行连接到数组中的数据对象(通过),并且还将该行连接到布局文件,这样我们就知道它看起来是什么样子了。您的列表视图是在
activity\u main
xml文件中创建的。您可以使用
findViewById
MainActivity.java
文件中引用它。创建CustomAdapter的实例,通过数据对象数组连接到此ListView。在适配器类
getView()
方法中,您使用数据来操作行,并使用布局xml来查看此数据。有意义吗?如何获取自定义的原始类数据?从数组还是从上下文?嗯。。我想我明白你的困惑了。所有数据都来自字符串数组,
names
。您的适配器引用您的
自定义_行
布局xml文件,因此我们知道这些行应该是什么样子。Newboston的所有数据都在食品中。但是他的适配器类有点不同。他正在使用一种默认的列表布局,这种布局在android中很容易找到,叫做
simple\u list\u item\u 1
。这种布局适合只需要为每行显示简单文本的人,在您的情况下,您有一个自定义布局。所以你不用和他一样的方法。嗨,谢谢你的回答。我知道最重要的一行是什么,但我不明白我设置的上下文是MainActivty上下文(此),数组是我之前在MainActivty设置的数组,其中是来自自定义的信息_