2017-06-22 98 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(); 
      } 
     }); 
    } 
} 

現在我想的是佈局添加到ListView一個按鈕,我試圖做的和失敗的代碼,我該怎麼辦呢?

+0

要添加哪種類型的佈局以及用法是什麼? – Meikiem

+0

相對佈局,這是否重要,爲什麼? –

回答

0

我寫了一個非常基本的例子,假設你想添加到你的ListView的佈局(行)有兩個TextView s,因爲我不知道你的問題在你的行中你想要什麼類型的對象/數據。首先,在佈局文件夾中定義佈局。這種佈局代表你要插入到您的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錯誤是無效的方法decleration,返回類型是必需的。在MyRowItems上,錯誤是無法解析符號。在調用超類型構造函數之前,錯誤所在的rowItems不能引用mycustomadapter.rowitems。 –

相關問題