5

これを参考に、以下を作成しました。

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();
    }
}

そして、それは完璧に機能しています。しかし、要件に従って、リストビューの各行は単なる文字列ではありません。代わりに、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);か??

  • 各行のイメージビューとテキストビューを参照するにはどうすればよいですか? それらからデータを設定して取得するにはどうすればよいですか? クリック イベントを認識するにはどうすればよいですか?

  • Adapterマストの使用ですか?または私はそれで逃げることができますか?

どんな助けでも感謝します。

4

3 に答える 3

4

しかし、要件に従って、リストビューの各行は単なる文字列ではありません。代わりに、row.xml に格納された imageview と textviews で構成されるビューのコレクションになります。

=>表示しているListViewは通常のアダプターを使用しています。アイテムに Imageview、Textview、または任意のビューなどの複数のビューを含める場合は、またはを拡張してカスタム アダプター クラスを定義する必要があります。BaseAdapterArrayAdapter

アダプタを置き換えるもの = new ArrayAdapter(this,android.R.layout.simple_list_item_1, listItems); ? adapter = new ArrayAdapter(this,R.layout.row, listItems); でしょうか。??

=> 行 xml レイアウトに ImageView、TextView、Button、またはその他のウィジェットなどのさまざまなビューが含まれている可能性があるため、ArrayAdapter は機能しません。したがって、getView()メソッドをオーバーライドする必要がある独自のアダプター クラスを定義することをお勧めします。

各行のイメージビューとテキストビューを参照するにはどうすればよいですか? それらからデータを設定して取得するにはどうすればよいですか? クリック イベントを認識するにはどうすればよいですか?

=> 上で述べたように、カスタム アダプター クラスを定義したら、行 xml レイアウト ファイルの任意のビューを見つけて参照し、必要なデータを設定/表示できる getView() メソッドをオーバーライドする必要があります。

アダプターの使用は必須ですか? または私はそれで逃げることができますか?

=> はい、必須です。アダプターがないと、GridView、ListView、Spinner、Gallery などのデータバインドされたウィジェットに表示できません。

カスタム アダプタを定義する例:

  1. ListView についての私の話
  2. http://www.vogella.com/articles/AndroidListView/article.html
于 2013-06-06T10:13:07.257 に答える
1

これが私のプロジェクトのコードです

次の「row.xml」ファイルのように、リストに 2 つのテキスト フィールドと 1 つの ImageView があるとします。これを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を拡張するクラスを作成します。これがリスト アダプターになります。コンストラクターまたはメソッドを介してアダプターにデータを渡すことができます。データを格納するフィールドを作成します。

あなたの質問に答えるために:

  • 各行のイメージビューとテキストビューを参照するにはどうすればよいですか?
  • それらからデータを設定して取得するにはどうすればよいですか?
  • クリック イベントを認識するにはどうすればよいですか?

BaseAdapter を拡張すると、メソッドが実装されますpublic View getView (int position, View convertView, ViewGroup parent)。この方法では、ビューを作成するためにカスタムの行レイアウトを拡張する必要があります。次に、findViewById メソッドを使用して ImageView と TextView を見つけます。ImageView と TextView がある場合は、setText または setImageSource を呼び出してデータを設定し、クリック イベントの setOnClickListener を呼び出します。

于 2013-06-06T08:49:13.997 に答える