5

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

主要的.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();
    }
}

它运行良好。但根据要求,我的每个列表视图行将不仅仅是一个字符串。相反,它将是由存储在row.xml中的 imageview 和 textviews 组成的视图集合。

现在我的查询是:

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

  • 如何引用每一行的 imageview 和 textviews?如何设置并从中获取数据?我如何识别他们的点击事件?

  • 使用Adapter必须吗?还是我可以逃脱惩罚?

任何帮助表示赞赏。

4

3 回答 3

4

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

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

什么将取代 adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, listItems); ? 会不会是 adapter = new ArrayAdapter(this,R.layout.row, listItems); ??

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

如何引用每一行的 imageview 和 textviews?如何设置并从中获取数据?我如何识别他们的点击事件?

=> 正如我上面所说,一旦定义了自定义适配器类,您将必须覆盖 getView() 方法,您可以在其中找到行 xml 布局文件的任何视图,引用它并设置/显示您想要的任何数据。

是必须使用Adapter吗?还是我可以逃脱惩罚?

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

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

  1. 我在 ListView 上的演讲
  2. http://www.vogella.com/articles/AndroidListView/article.html
于 2013-06-06T10:13:07.257 回答
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(); 
于 2013-06-06T09:50:18.577 回答
1

这些是基本步骤:

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

现在回答你的问题:

  • 如何引用每一行的 imageview 和 textviews?
  • 如何设置并从中获取数据?
  • 我如何识别他们的点击事件?

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

于 2013-06-06T08:49:13.997 回答