Подтвердить что ты не робот

Используйте адаптер массива с большим количеством просмотров в строке в списке

Я наткнулся на проблему, с которой я не могу оторваться, поэтому я надеялся, что, возможно, у кого-то здесь была такая же проблема или был хороший способ решить проблему.

Я создал представление, содержащее ListView. Этот ListView содержит два TextView. Проблема в том, что я не знаю, куда я отправляю значения, которые предназначены для перехода во второе текстовое представление с помощью ArrayAdapter. Есть ли способ отправить дополнительную информацию в ArrayAdapter, чтобы я мог подавать "todaysmenu" TextView?

Метод ArrayAdapter:

private void createList() {
    ListView lv = (ListView) findViewById(R.id.mylist);
    String[] values = new String[] { "Android", "Linux", "OSX", 
            "WebOS", "Windows7", "Ubuntu", "OS/2"
    };
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.rowlayout, R.id.restaurantname, values);
    lv.setAdapter(adapter);
}

Разметка строки:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/restaurantname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/restaurantname"
        android:textSize="23dp" >

    </TextView>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@+id/todaysmenu" />

</LinearLayout>

Схема действий:

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

    <ListView
    android:id="@+id/mylist"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    </ListView>


</LinearLayout>

В начале я получил все, чтобы работать, но когда я добавил, что возникают проблемы со вторым текстовым полем. Заранее благодарю вас за помощь!

4b9b3361

Ответ 1

Для этого вам нужно создать пользовательский адаптер и раздуть свой собственный макет строки. Использование ArrayAdapter не будет работать, потому что

По умолчанию этот класс ожидает, что ссылки на предоставленные идентификаторы ресурса один TextView. Если вы хотите использовать более сложный макет, используйте конструкторы, которые также принимают идентификатор поля. Этот идентификатор поля должен ссылаться на TextView в более крупном ресурсе макета.

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

public class CustomAdapter extends ArrayAdapter {
    private final Activity activity;
    private final List list;

    public CustomAdapter(Activity activity, ArrayList<Restaurants> list) {
        this.activity = activity;
        this.list = list;
    }

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

        if(rowView == null)
        {
            // Get a new instance of the row layout view
            LayoutInflater inflater = activity.getLayoutInflater();
            rowView = inflater.inflate(R.layout.rowlayout, null);

            // Hold the view objects in an object, that way the don't need to be "re-  finded"
            view = new ViewHolder();
            view.retaurant_name= (TextView) rowView.findViewById(R.id.restaurantname);
            view.restaurant_address= (TextView) rowView.findViewById(R.id.textView1);

            rowView.setTag(view);
        } else {
            view = (ViewHolder) rowView.getTag();
        }

        /** Set data to your Views. */
        Restaurants item = list.get(position);
        view.retaurant_name.setText(item.getTickerSymbol());
        view.restaurant_address.setText(item.getQuote().toString());

        return rowView;
    }

    protected static class ViewHolder{
        protected TextView retaurant_name;
        protected TextView restaurant_address;
    }
}

И ваш класс Restaurant.java может быть простым, как я описал ниже:

public class Restaurants {
    private String name;
    private String address;

    public Restaurants(String name, String address) {
        this.name = name;
        this.address = address;
    }
    public void setName(String name) {
        this.name= name;
    }
    public String getName() {
        return name;
    }
    public void setAddress(String address) {
        this.address= address;
    }
    public String getAddress() {
        return address;
    }
}

Теперь в вашей основной деятельности просто привяжите список к некоторым данным, например:

/** Declare and initialize list of Restaurants. */
ArrayList<Restaurants> list = new ArrayList<Restaurants>();

/** Add some restaurants to the list. */
list.add(new Restaurant("name1", "address1"));
list.add(new Restaurant("name2", "address2"));
list.add(new Restaurant("name3", "address3"));
list.add(new Restaurant("name4", "address4"));
list.add(new Restaurant("name5", "address5"));
list.add(new Restaurant("name6", "address6"));

На этом этапе вы можете установить пользовательский адаптер в свой список

ListView lv = (ListView) findViewById(R.id.mylist);

CustomAdapter adapter = new CustomAdapter(YourMainActivityName.this, list);
lv.setAdapter(adapter);

Это все, и он должен работать отлично, но я настоятельно рекомендую вам google для некоторых лучших альтернатив для реализации других Adapters.

Ответ 3

Я думаю, что ваша проблема здесь:

Вместо этого:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/restaurantname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/restaurantname"
        android:textSize="23dp" >

    </TextView>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@+id/todaysmenu" />

</LinearLayout>

Попробуйте что-то вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/restaurantname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test text"
        android:textSize="23dp" >

    </TextView>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="test text" />

</LinearLayout>

Если это сработает, поместите текст в папку /res/val/string так:

<string name="testText">Put your text here...</string>

а затем вызывайте так:

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/restaurantname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/testText"
        android:textSize="23dp" >

    </TextView>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/testText" />

</LinearLayout>

Затем вы должны установить динамические значения следующим образом:

TextView tv = (TextView)findViewById(R.id.restaurantname);
tv.setText(values);

Ответ 4

Мне пришлось решить ту же проблему и попытался использовать arrayadapter, как было сказано выше, но это не сработало.

Позже мне удалось сделать это с помощью baseadapter - это адаптер:

public class BusinessAdapter2 extends BaseAdapter {
    private final ArrayList<Business> myList;
    LayoutInflater inflater;
    Context context;


    public BusinessAdapter2(Context context, ArrayList<Business> myList) {
        this.myList = myList;
        this.context = context;
        inflater = LayoutInflater.from(this.context);
    }
    @Override
    public int getCount() {
        return myList.size();
    }

    @Override
    public Object getItem(int position) {
        return myList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView==null) convertView = inflater.inflate(R.layout.business_list_item_2, parent, false);
        // assign the view we are converting to a local variable
        View v = convertView;
        Business b = myList.get(position);
        if (b != null) {
            TextView name = (TextView) v.findViewById(R.id.textview_name);
            TextView address = (TextView) v.findViewById(R.id.textview_address);
            TextView description = (TextView) v.findViewById(R.id.textview_description);
            TextView discount = (TextView) v.findViewById(R.id.textview_discount);

            // check to see if each individual textview is null.
            // if not, assign some text!
            if (name != null){
                name.setText(b.name);
            }
            if (address != null){
                address.setText(b.address);
            }
            if (description != null){
                description.setText(b.description);
            }
            if (discount != null){
                discount.setText(b.discountRate);
            }
        }

        // the view must be returned to our activity
        return v;
    }
}

это класс объекта, который я использовал (бизнес):

public class Business {
    String name,address,description,discountRate;
    public Business(){}
    public Business(String name,String address,String description,String discountRate){
        this.name=name;
        this.address=address;
        this.description=description;
        this.discountRate=discountRate;
    }
}

и вот как я заполняю список в адаптер:

ArrayList<Business> businesses2=new ArrayList<Business>(Arrays.asList(for_listview_objects));
    adapter_objects =new BusinessAdapter2(
            context, // The current context (this activity)
            businesses2);

    listView.setAdapter(adapter_objects);