动态添加自定义行到listview

时间:2013-06-06 08:14:59

标签: android android-layout android-listview android-arrayadapter

通过引用这个,我创建了以下内容:

main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/addBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="addItems"
        android:text="Add New Item" />

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false" />

</LinearLayout>

MainActivity.java

public class MainActivity extends Activity {
    ListView list;   
    ArrayList<String> listItems = new ArrayList<String>();    
    ArrayAdapter<String> adapter;   
    int clickCounter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        list = (ListView) findViewById(R.id.list);
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, listItems);
        list.setAdapter(adapter);

        list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String item = list.getItemAtPosition(position).toString();
                Log.i("MainActivity", "Selected = " + item);
            }
        });
    }

    public void addItems(View v) {
        listItems.add("Clicked : " + clickCounter++);
        adapter.notifyDataSetChanged();
    }
}

它完美无缺。但是根据要求,我的每个 listview行不仅仅是一个字符串。相反,它将是由存储在 row.xml 中的imageview和textview组成的视图集合。

现在我的疑问是:

  • 什么会取代adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, listItems);?它会是adapter = new ArrayAdapter<String>(this,R.layout.row, listItems); ??

  • 如何参考每行的imageview和textview?如何设置和获取数据?如何识别他们的点击事件?

  • 是否必须使用Adapter?或者我能逃脱吗?

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:4)

  

但是根据要求,我的每个listview行不仅仅是一个   串。相反,它将是由imageview组成的视图集合   和textview存储在row.xml中。

=&GT;您正在显示的ListView正在使用普通适配器。如果您希望您的项目包含多个视图,例如Imageview,Textview或任何视图,那么您必须通过扩展BaseAdapterArrayAdapter定义自定义适配器类

  

什么将取代adapter = new   ArrayAdapter(这一点,android.R.layout.simple_list_item_1,   listItems中); ?它是适配器=新的   ArrayAdapter(this,R.layout.row,listItems); ??

=&GT;这里ArrayAdapter不起作用,因为你的行xml布局可能包含不同的视图,如ImageView,TextView,Button或任何其他小部件。所以我建议你定义自己的适配器类,你必须覆盖getView()方法。

  

如何参考每行的imageview和textview?我该怎么设置   并从他们那里获取数据?如何识别他们的点击事件?

=&GT;如上所述,一旦定义了自定义适配器类,就必须覆盖getView()方法,在其中可以找到行xml布局文件的任何视图,引用它并设置/显示所需的任何数据。

  

是否必须使用适配器?或者我能逃脱它吗?

=&GT;是的必须,如果没有适配器,您将无法在GridView,ListView,Spinner,Gallery等数据绑定小部件中显示。

定义自定义适配器的示例:

  1. My talk on ListView
  2. http://www.vogella.com/articles/AndroidListView/article.html

答案 1 :(得分:1)

这些是基本步骤:

  • 为您的行创建自定义布局(可能包含ImageView和TextView)。您在示例中使用了android.R.layout.simple_list_item_1,如果您查看Android源代码只是一个带有单个TextView的布局。
  • 创建一个扩展BaseAdapter的类。这将是您的列表适配器。您可以通过构造函数或方法将数据传递给适配器。创建一个存储数据的字段。

现在回答你的问题:

  • 如何参考每行的imageview和textview?
  • 如何设置和获取数据?
  • 如何识别他们的点击事件?

扩展BaseAdapter时,您将实现方法public View getView (int position, View convertView, ViewGroup parent)。在此方法中,您必须膨胀自定义行布局以创建视图。然后使用findViewById方法找到ImageView和TextView。当您拥有ImageView和TextView时,您可以调用setText或setImageSource来设置数据,并为click事件设置setOnClickListener。

答案 2 :(得分:1)

以下是我项目的代码

考虑您的列表有两个文本字段和一个ImageView,如下面的“row.xml”文件。将其复制到您的res文件夹

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

    <TextView
        android:id="@+id/row_q"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:text="Solve[{x^2==4,x+y^2==6},{x,y}]"
        android:textAppearance="@android:style/TextAppearance.Small"
        android:textStyle="bold|italic" />

<TextView
    android:id="@+id/row_a"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/AliceBlue"
    android:gravity="center_vertical"
    android:paddingLeft="10dp"
    android:textAppearance="@android:style/TextAppearance.Small" />

<ImageView
    android:id="@+id/row_a_math"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"/>

<LinearLayout
android:id="@+id/graph_layout"
android:layout_width="match_parent"
android:layout_height="200dp"
android:visibility="gone" >        
</LinearLayout>

在您的活动中创建以下类来存储此数据

private class QuesSolnInfo { 
    public String ques; 
    public String ans; 
    public Bitmap ans_b; 

    public QuesSolnInfo(String ques, String ans, Bitmap ans_b) { 
        this.ques = ques;  
        this.ans = ans; 
        this.ans_b = ans_b; 
    } 
}

//将以下作为班级成员

OutputStringArrayAdapter _outputArrayAdapter = null; 
ArrayList<QuesSolnInfo> _outputArrayList = null; 

//在onCreate方法

中初始化它们
_outputArrayAdapter = new OutputStringArrayAdapter(getActivity(), _outputArrayList); 
_outputListView.setAdapter(_outputArrayAdapter); 

ArrayAdapter的定义

 protected class OutputStringArrayAdapter extends ArrayAdapter<QuesSolnInfo> { 
    OutputStringArrayAdapter(Context context, ArrayList<QuesSolnInfo> stringArrayList) { 
        super(context, R.layout.list, stringArrayList); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
        if (convertView == null) { 
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.row, null); 
        } 

        TextView t_ques = (TextView) convertView.findViewById(R.id.row_q); 
        t_ques.setText(getItem(position).ques); 

        boolean debug = true; 
        TextView t_ans = (TextView) convertView.findViewById(R.id.row_a); 

        String texx = getItem(position).ans;
        t_ans.setText(texx);       

        final ImageView w = (ImageView) convertView.findViewById(R.id.row_a_math); 
        w.setImageBitmap(getItem(position).ans_b); 
        // Show answer in webview               
        return convertView; 
    }        
} 

现在要在列表中添加任何元素,请执行以下操作

_outputArrayList.add(0, new QuesSolnInfo(string1.string2, bitmap0)); 
_outputArrayAdapter.notifyDataSetChanged();