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を使用する必要がありますか?または私はそれを離れて得ることができますか?

助けてください。

+0

独自のカスタムアダプタを作成し、所望の行レイアウト – Houcine

答えて

4

次んが、要件に応じて、私の各リストビューの列は1つだけではありませんあなたのリストにすべての要素を追加します 文字列。代わりに、画像ビュー とtext.xmlがrow.xmlに格納されたビューのコレクションになります。

=>表示しているListViewは通常のアダプタを使用しています。アイテムにImageview、Textview、または任意のビューのような複数のビューが含まれるようにするには、またはArrayAdapterのいずれかを拡張してカスタムアダプタクラスを定義する必要があります。アダプター=新しい ArrayAdapter(これ、android.R.layout.simple_list_item_1、 のlistItems)に取って代わるだろう何

。 ?それはアダプター=新しいでしょうか ArrayAdapter(this、R.layout.row、listItems); ??

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

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

=>私は、カスタムアダプタクラスを定義したら、あなたはどんなデータ、あなたの行のXMLレイアウトファイルのいずれかのビューを見つけることができますgetViewメソッド()メソッド、それを参照し、設定/表示を無効にする必要がありますが、上記に述べたようにあなたは欲しい。

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

=>はい、アダプタなしでは、GridView、ListView、Spinner、Galleryなどのデータバインドウィジェットでは表示できません。カスタムアダプターを定義するため

例:

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

@GAMA歓迎を膨張させるgetViewメソッド()メソッドをオーバーライド!!クリックしたオブジェクト/アイテムを取得し、そのオブジェクトから必要な詳細を取得します。 –

1

これらは、基本的な手順は次のとおりです。

  • は(多分それでImageViewのとのTextViewで)あなたの行のためのカスタムレイアウトを作成します。あなたの例ではandroid.R.layout.simple_list_item_1を使っていましたが、Androidのソースを調べると、1つのTextViewだけのレイアウトになります。
  • BaseAdapterを拡張するクラスを作成します。これはあなたのリストアダプターになります。コンストラクタまたはメソッドを使用して、アダプタにデータを渡すことができます。データを格納するフィールドを作成します。

今のご質問にお答えします

  • はどうすればImageViewの各行のtextviewsを指していますか?
  • データを設定して取得するにはどうすればよいですか?
  • クリックイベントをどのように認識できますか?

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

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メソッドで初期化します

今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; 
    }   
} 

_outputArrayAdapter = new OutputStringArrayAdapter(getActivity(), _outputArrayList); 
_outputListView.setAdapter(_outputArrayAdapter); 

Definititionは

_outputArrayList.add(0, new QuesSolnInfo(string1.string2, bitmap0)); 
_outputArrayAdapter.notifyDataSetChanged(); 
関連する問題