带有自定义适配器的字符串数组
String Array With Custom Adapters
我们可以将字符串数组与自定义适配器一起使用并且数据应该显示在列表视图中吗?
我的意思是这样的
String [] s= {"cars","bike","train"};
现在这个字符串数组将如何附加到自定义适配器以及数据将如何在 ListView
中显示。
我知道 ArrayList
这很容易。
但我想用简单的字符串数组来完成。
好吧,您可以为此使用自定义适配器。但如果您只想在 ListView
.
上显示文字,您也可以使用 ArrayAdapter
class
但是,如果您出于某种原因想要创建自定义适配器,请尝试以下操作...
在这种特殊情况下,我将 class 设为 BaseAdapter
class。
这个自定义适配器将控制我的数据模型,并将数据膨胀到我的 ListView
行。
首先,我将创建自定义行的 XML。你可以看下面的代码。
item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test text"
android:id="@+id/tv"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"/>
</RelativeLayout>
我在这里创建了一个显示文本的行。
现在,我将创建我的自定义适配器来处理这个 XML。如下所示。
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private static final String LOG_TAG = MyAdapter.class.getSimpleName();
private Context context_;
private ArrayList<String> items;
public MyAdapter(Context context, ArrayList<String> items) {
this.context_ = context;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
context_.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.item_mail, null);
}
TextView tv = (TextView) convertView.findViewById(R.id.tv);
String text = items.get(position);
Log.d(LOG_TAG,"Text: " + text);
tv.setText(text);
return convertView;
}
}
好的。现在我们拥有一切来完成这项工作。在你的 Activity
class 中,做这样的事情:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:text="@string/hello_world"
android:id="@+id/tv_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tv_header">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add item"
android:id="@+id/button"
android:layout_gravity="center" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView" />
</LinearLayout>
</RelativeLayout>
MainActivity.java
public class MainActivity extends ActionBarActivity {
private int numItem = 1; // Dummy int to create my items with different numbers.
private MyAdapter myAdapter; // Your custom adapter.
private ArrayList<String> items; // This is going to be your data structure, every time you change it, call the notifyDataSetChanged() method.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.button);
ListView lv = (ListView) findViewById(R.id.listView);
items = new ArrayList<>();
myAdapter = new MyAdapter(this,items);
lv.setAdapter(myAdapter);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addItem(); // The method I'm using to insert the item. Look for it below.
}
});
}
private void addItem() {
items.add("Text " + numItem++);
mailAdapter.notifyDataSetChanged(); // Notifying the adapter that my ArrayList was modified.
}
}
这应该可以解决问题。
根据你告诉我的情况,你想使用 String
数组而不是 ArrayList<String>
。嗯,把adapter改成下面的样子
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private static final String LOG_TAG = MyAdapter.class.getSimpleName();
private Context context_;
private String[] items;
public MyAdapter(Context context, String[] items) {
this.context_ = context;
this.items = items;
}
@Override
public int getCount() {
return items.length;
}
@Override
public Object getItem(int position) {
return items[position];
}
@Override
public long getItemId(int position) {
return position;
}
// Rest of the code... Same as before.
}
MainActivity.java
public class MainActivity extends ActionBarActivity {
private MyAdapter myAdapter; // Your custom adapter.
private String[] items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.button);
ListView lv = (ListView) findViewById(R.id.listView);
items = {"Whatever","String","You","Like"};
myAdapter = new MyAdapter(this,items);
lv.setAdapter(myAdapter);
}
}
此方法的问题:您的适配器将具有固定大小,这将是您创建字符串数组后的大小。除非您使用不同的 String
数组创建另一个适配器,否则您将无法将其变大。
This question讨论此事。
我们可以将字符串数组与自定义适配器一起使用并且数据应该显示在列表视图中吗?
我的意思是这样的
String [] s= {"cars","bike","train"};
现在这个字符串数组将如何附加到自定义适配器以及数据将如何在 ListView
中显示。
我知道 ArrayList
这很容易。
但我想用简单的字符串数组来完成。
好吧,您可以为此使用自定义适配器。但如果您只想在 ListView
.
ArrayAdapter
class
但是,如果您出于某种原因想要创建自定义适配器,请尝试以下操作...
在这种特殊情况下,我将 class 设为 BaseAdapter
class。
这个自定义适配器将控制我的数据模型,并将数据膨胀到我的 ListView
行。
首先,我将创建自定义行的 XML。你可以看下面的代码。
item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test text"
android:id="@+id/tv"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"/>
</RelativeLayout>
我在这里创建了一个显示文本的行。
现在,我将创建我的自定义适配器来处理这个 XML。如下所示。
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private static final String LOG_TAG = MyAdapter.class.getSimpleName();
private Context context_;
private ArrayList<String> items;
public MyAdapter(Context context, ArrayList<String> items) {
this.context_ = context;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
context_.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.item_mail, null);
}
TextView tv = (TextView) convertView.findViewById(R.id.tv);
String text = items.get(position);
Log.d(LOG_TAG,"Text: " + text);
tv.setText(text);
return convertView;
}
}
好的。现在我们拥有一切来完成这项工作。在你的 Activity
class 中,做这样的事情:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:text="@string/hello_world"
android:id="@+id/tv_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tv_header">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add item"
android:id="@+id/button"
android:layout_gravity="center" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView" />
</LinearLayout>
</RelativeLayout>
MainActivity.java
public class MainActivity extends ActionBarActivity {
private int numItem = 1; // Dummy int to create my items with different numbers.
private MyAdapter myAdapter; // Your custom adapter.
private ArrayList<String> items; // This is going to be your data structure, every time you change it, call the notifyDataSetChanged() method.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.button);
ListView lv = (ListView) findViewById(R.id.listView);
items = new ArrayList<>();
myAdapter = new MyAdapter(this,items);
lv.setAdapter(myAdapter);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addItem(); // The method I'm using to insert the item. Look for it below.
}
});
}
private void addItem() {
items.add("Text " + numItem++);
mailAdapter.notifyDataSetChanged(); // Notifying the adapter that my ArrayList was modified.
}
}
这应该可以解决问题。
根据你告诉我的情况,你想使用 String
数组而不是 ArrayList<String>
。嗯,把adapter改成下面的样子
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private static final String LOG_TAG = MyAdapter.class.getSimpleName();
private Context context_;
private String[] items;
public MyAdapter(Context context, String[] items) {
this.context_ = context;
this.items = items;
}
@Override
public int getCount() {
return items.length;
}
@Override
public Object getItem(int position) {
return items[position];
}
@Override
public long getItemId(int position) {
return position;
}
// Rest of the code... Same as before.
}
MainActivity.java
public class MainActivity extends ActionBarActivity {
private MyAdapter myAdapter; // Your custom adapter.
private String[] items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.button);
ListView lv = (ListView) findViewById(R.id.listView);
items = {"Whatever","String","You","Like"};
myAdapter = new MyAdapter(this,items);
lv.setAdapter(myAdapter);
}
}
此方法的问题:您的适配器将具有固定大小,这将是您创建字符串数组后的大小。除非您使用不同的 String
数组创建另一个适配器,否则您将无法将其变大。
This question讨论此事。