2017-06-22 21 views
0

私はAndroidスタジオを使ってアプリケーションを開発しています。ボタンを押すたびにリストビューにテキストを追加する小さなコードを書いています。これはコードです:ボタンでリストビューにレイアウトを追加する

public class MainActivity extends Activity { 
    EditText editText; 
    Button addButton; 
    ListView listView; 
    ArrayList<String> listItems; 
    ArrayAdapter<String> adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     editText = (EditText) findViewById(R.id.editText); 
     addButton = (Button) findViewById(R.id.addItem); 
     listView = (ListView) findViewById(R.id.listView); 
     listItems = new ArrayList<String>(); 
     listItems.add("First Item - added on Activity Create"); 
     adapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, listItems); 
     listView.setAdapter(adapter); 

     addButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       listItems.add(editText.getText().toString()); 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

     listView.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> a, View v, int position, 
       long id) { 
       Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_LONG) 
        .show(); 
      } 
     }); 
    } 
} 

は、今私はボタン、私はそれを実行しようとしましたし、失敗してリストビューにレイアウトを追加コードをしたい、私はそれをどのように行うのですか?

+0

どのタイプのレイアウトを追加したいのですか?使用方法は何ですか? – Meikiem

+0

Relativレイアウト、それは重要で、なぜですか? –

答えて

0

ここでは、ListViewに追加したいレイアウト(行)が2つのTextViewを持っていると仮定してここに非常に基本的な例を書いています。あなたの行からどのような種類のオブジェクト/データ。まず、レイアウトフォルダにレイアウトを定義します。このレイアウトは、あなたのListViewに挿入しようとしている行を表す:

my_row.xml

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

    <!-- add images or whatever content you want to your row --> 
    <TextView 
     android:id="@+id/my_text1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <TextView 
     android:layout_below="@id/my_text1" 
     android:id="@+id/my_text2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</RelativeLayout> 

次へ]を、あなたの行レイアウトのデータを表すオブジェクトを定義します。

public class MyRowItem 
{ 
    private String text1; 
    private String text2; 

    public MyRowItem(String text1, String text2) 
    { 
     this.text1 = text1; 
     this.text2 = text2; 
    } 

    public String getText1() 
    { 
     return text1; 
    } 

    public String getText2() 
    { 
     return text2; 
    } 
} 

さて、文字列の代わりに簡単なArrayAdapterを使用して、あなたは、このケースでは、あなたのアイテムのカスタムアダプタを作成するために、あなたのListViewに追加するつもり異なる行が必要になります。例えば:この特定の例では

public class MyCustomAdapter extends ArrayAdapter<MyRowItem> implements View.OnClickListener 
    { 

     private ArrayList<MyRowItem> rowItems; 

     private static class ViewHolder 
     { 
      TextView text1; 
      TextView text2; 
     } 

     public MyCustomAdapter(ArrayList<MyRowItems> items, Context context) 
     { 
      super(context, R.layout.my_row, rowItems); 
      this.rowItems = rowItems; 
     } 

     @Override 
     public void onClick(View v) 
     { 
      Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      MyRowItem rowItem = getItem(position); 
      ViewHolder viewHolder; 
      final View result; 
      if (convertView == null) 
      { 
       viewHolder = new ViewHolder(); 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.my_row, parent, false); 
       viewHolder.text1 = (TextView) convertView.findViewById(R.id.my_text1); 
       viewHolder.text2 = (TextView) convertView.findViewById(R.id.my_text2); 
       convertView.setTag(viewHolder); 
      } 
      else 
       viewHolder = (ViewHolder)convertView.getTag(); 

      viewHolder.text1.setText(rowItem.getText1()); 
      viewHolder.text2.setText(rowItem.getText1()); 
      return convertView; 
     } 
    } 

、我々はMyRowItem秒のリストを使用して、元のlistItemsを置き換えることができます。例えば、

listItems.add(new MyRowItem("hello", "world");

は、今すぐあなたのアクティビティまたはフラグメントにカスタムアダプタを使用することができます。だから、あなたとあなたのアダプタのインスタンスを置き換えます:

adapter = new MyCustomAdapter(listItems, this);

とのあなたのボタンのonClickListener

addButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     listItems.add(new MyRowItem("new item", editText.getText().toString()); 
     adapter.notifyDataSetChanged(); 
    } 
}); 

私は、この例では少し基本ですけど、うまくいけば、それはあなたが始めるのに役立ちます。

+0

私は間違って何をしているのかわかりませんが、カスタムアダプターのいくつかの項目でエラーが発生します:public CustomAdapter(ArrayList items、Context context) { super(context、R.layout.my_row、rowItems); this.rowItems = rowItems; } Customadapterがエラーで、MyRowItemがエラーでrowItemsがエラー+ v.getcontextがエラーです/何が間違っていますか? –

+0

エラーの上にマウスを置いて、エラーの内容を確認できますか?別のコンストラクタが必要なこともあります。 – Vinnie

+0

CustomAdapterで、エラーは無効です。メソッドの解読、戻り値の型が必要です。 MyRowItemsでは、エラーは解決できません。 rowItems上で、スーパータイプコンストラクターが呼び出される前にmycustomadapter.rowitemsを参照することはできません。 –

関連する問題