2015-06-10 8 views
1

Я попытался создать простой пользовательский список ListView, чтобы помочь мне понять, как это работает, но это не сработает.Элемент пользовательского списка Android в ListView

Когда я использую прокомментированную строку в моей MainActivity.java, все работает (используется встроенный макет). Но когда я пытаюсь использовать собственный макет row_layout вместо simple_list_item_1, я получаю ANR при запуске программы.

MainActivity.java

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    String[] colors = {"blue", "red", "yellow", "green", "purple", "orange"}; 

    //ListAdapter listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, colors); 
    ListAdapter listAdapter = new ArrayAdapter<String>(this, R.layout.row_layout, colors); 

    ListView listView = (ListView)findViewById(R.id.theListView); 

    listView.setAdapter(listAdapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      String auswahl = "Auswahl:" + String.valueOf(parent.getItemAtPosition(position)); 

      Toast.makeText(MainActivity.this, auswahl, Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MainActivity"> 

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/theListView"></ListView></LinearLayout> 

row_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
tools:context=".MainActivity"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/textView1" 
    android:textSize="30sp" 
    android:textStyle="bold" 
    android:padding="15dp"/></LinearLayout> 

ответ

2

При вызове адаптера необходимо указать идентификатор TextView внутри вашей настраиваемой строки.

ListAdapter listAdapter = new ArrayAdapter<String>(this, R.layout.row_layout, R.id.textView1, colors); 
0

Изменить вид текста идентификатор

android:id="@android:id/text1" 
+0

Не мог он использовать этот конструктор вместо: новый ArrayAdapter (это, R.layout.row_layout, R.id.textView1, цвета); ? – theMfromA

0

Ваш адаптер списка не может знать, как ваш текст должен быть помещен в ваш собственный макет.

Показать либо вы должны создать собственный адаптер, который будет рисовать ваши ListView строки или вы можете заменить row_layout.xml с

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:paddingStart="?android:attr/listPreferredItemPaddingStart" 
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" 
    android:minHeight="?android:attr/listPreferredItemHeightSmall" /> 

и внесите изменения в этой TextView.

(это код simple_list_item_1 на самом деле)

0

Наиболее эффективный способ сделать это, чтобы создать свой собственный адаптер

public class YourAdapter extends BaseAdapter { 

    private final Context context; 
    private TextView mTextView 
    private LayoutInflater inflater; 
    private String[] colors; 

    public YourAdapter(Context context, String[] colors) { 
     this.context = context; 
     this.colors = colors; 

    } 

    /** 
    * How many items are in the data set represented by this Adapter. 
    */ 
    @Override 
    public int getCount() { 
     return colors.length; 
    } 

    /** 
    * Get the data item associated with the specified position in the data set. 
    * 
    * @param position Position of the item whose data we want within the adapter's 
    *     data set. 
    * @return The data at the specified position. 
    */ 
    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    /** 
    * Get the row id associated with the specified position in the list. 
    * 
    * @param position The position of the item within the adapter's data set whose row id we want. 
    * @return The id of the item at the specified position. 
    */ 
    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 



     if (inflater == null) 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (view == null) view = inflater.inflate(R.layout.row_layout,    null); 
     mTextView = view.findItemById(R.id.textview1); 
     String color = colors[position]; 
     mTextView.setText(color); 

     return view; 
    } 




    } 
+0

mTextView = view.findItemById (R.id.textview1); Эта строка дает мне ошибку «Нескопимые типы: Обязательно: android.widget.TextView Найдено: android.view.View« Любая идея, что я сделал неправильно? – TSchieck

 Смежные вопросы

  • Нет связанных вопросов^_^