web-dev-qa-db-ja.com

Arrayadapterにカスタムレイアウトを追加する方法は?

カスタマイズされたレイアウトでListViewを作成しようとしています。 listViewの各アイテムは、以下に投稿されているitem.xmlのようになります。

コードでは、私は使用しました

adapter = new ArrayAdapter<T>(getApplicationContext(), R.layout.listi_tems_layout, topicsList);

しかし、ArrayAdapter<T>のコンストラクターが2番目のパラメーターをintとして受け入れるため、機能していません。

Android.R.layout.simple_list_item_1

、そして私の場合、それはカスタマイズされたレイアウトです

R.layout.listi_tems_layout

どのアダプターを使用するか、またはこれを解決する方法。ありがとう

アイテム

<?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="horizontal"
Android:weightSum="3">

<TextView 
    Android:id="@+id/tvlist_topic"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_weight="1"/>
<ImageView 
    Android:id="@+id/ivList_delete"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:clickable="true"
    Android:src="@drawable/delete_icon"
    Android:contentDescription="icon to delete item from the Listview"
    Android:layout_weight="1"/>
<CheckBox 
    Android:id="@+id/cbList_hook"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:checked="false"
    Android:layout_weight="1"/>

mainlayout

<RelativeLayout 
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"
tools:context="${relativePackage}.${activityClass}" >
....
....
....

<ListView 
    Android:id="@+id/lvEco_topics"
    Android:layout_width="match_parent"
    Android:layout_height="470dp"
    Android:layout_below="@id/tvEco_topic"
    Android:layout_marginTop="30dp"
    Android:scrollbars="vertical"
    Android:divider="@Android:drawable/alert_light_frame"></ListView>
<Button 
    Android:id="@+id/btEco_save"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@id/lvEco_topics"
    Android:gravity="center"
    Android:text="Save"/>

コード

public class MainActivity extends Activity {

private ArrayList<String> topicsList;
private ListAdapter adapter;

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

    topicsList = new ArrayList<String>();
    topicsList.add("topic1");
    topicsList.add("topic2");
    topicsList.add("topic3");
    topicsList.add("topic4");
    topicsList.add("topic5");
    topicsList.add("topic6");

    adapter = new ArrayAdapter<T>(getApplicationContext(), R.layout.listi_tems_layout, topicsList);
8
rmaik

ArrayAdapterは、2番目のパラメーターをAndroid.R.layout.simple_list_item_1のようなintとして受け入れます。

getViewArrayAdapterメソッドをカスタマイズしない場合、カスタムレイアウトには、Android:id="@Android:id/text1" idを持つ1つのTextViewが必要であり、1つのTextViewに値を表示します。

現在のコードでアプリケーションを実行するには、Android:id="@Android:id/text1"レイアウトのTextViewR.layout.listi_tems_layoutを追加します。

R.layout.listi_tems_layoutレイアウトにはTextViewを含む他のビューも含まれているため、ArrayAdapterクラスを拡張して他のビューにもアクセスすることにより、カスタムアダプタを作成します。

次の例を参照してください: ListView(Android)のカスタムArrayAdapter

6

それがまだ関連しているかどうかはわかりません。ソースから、ArrayAdapterには3番目のパラメーターでtextviewリソースを受け入れるコンストラクターがあるようですが、2017年に新しく追加された突き出しかどうかはわかりません:D、

ArrayAdapter adapter = new ArrayAdapter<>(context,YourCustomLayoutID,TextViewIDinYourLayout,ListData);

ソースから、textviewレイアウトIDを指定しなかった場合、ビュー全体がtextviewであると想定されるため、新しいアダプターを拡張/作成せずにカスタムビューを使用できると思います(私はそれを作成するのが嫌いです)私自身)、しかしあなたはテキストに使用されるtextviewを提供する必要があります

2
user5962153

クラスを作成し、このようなベースアダプターで拡張してから、このアダプターを設定します

import Java.util.ArrayList;

import Android.content.Context;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseAdapter;
import Android.widget.TextView;

import com.example.test.R;
import com.itoks.model.ClientDetails;

public class ClientListAdapter extends BaseAdapter {
    // ArrayList<String> name, company, email, id, status;
    ArrayList<ClientDetails> clientArrayList;
    Context c;

    public ClientListAdapter(Context c, ArrayList<ClientDetails> list) {
        clientArrayList = list;
        this.c = c;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return clientArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return clientArrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View row = null;
        LayoutInflater inflater = (LayoutInflater) c
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            row = inflater.inflate(R.layout.listview_item_clients, parent,
                    false);
        } else {
            row = convertView;
        }
        ClientDetails detail = clientArrayList.get(position);
        TextView name = (TextView) row.findViewById(R.id.tvClientFullName);
        name.setText(detail.name);
        TextView email = (TextView) row.findViewById(R.id.tvClientEmail);
        email.setText(detail.email);
        TextView id = (TextView) row.findViewById(R.id.tvClientID);
        id.setText("ID : " + detail.id);
        TextView company = (TextView) row
                .findViewById(R.id.tvClientCompanyName);
        company.setText(detail.company);
        TextView status = (TextView) row.findViewById(R.id.tvClientStatus);
        status.setText("Status:" + detail.status);
        return row;
    }

}
2

私があなたを理解しているように。 ArrayAdapterでカスタムレイアウトを作成しようとしています。不可能です。あなたはあなたのtopicsListを使用してあなたのカスタムレイアウトを扱う方法を定義するarrayAdapterクラスを拡張するあなた自身のカスタムアダプターを書く必要はありません。このようなもの:

public class ChatUserAdapter extends ArrayAdapter<UserChat> {

private Activity context;
private List<UserChat> userList;
private int ilayout;

public ChatUserAdapter(Activity context, int layout, List<UserChat> userList) {
    super(context, layout, userList);
    this.context = context;
    this.userList = userList;
    this.ilayout = layout;
}

public long getItemId(int position) {
    return position;
}

static class ViewHolder {
    public TextView tvEmail;
}

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

        LayoutInflater layoutInflater = context.getLayoutInflater();
        rowView = layoutInflater.inflate(ilayout, null, true);
        viewHolder = new ViewHolder();
        viewHolder.tvEmail = (TextView) rowView.findViewById(R.id.tv_email);
        rowView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) rowView.getTag();
    }

    UserChat item = userList.get(position);
    viewHolder.tvEmail.setText(item.getName() + " " + item.getSurname());
    return rowView;
}
}
1

ArrayAdapter <>を拡張する独自のItemAdapterを作成してください。

public class ItemAdapter extends ArrayAdapter<Item> {
private int resource;
private List<Item> items;

public ItemAdapter(Context context, int resource, List<Item> items) {
    super(context, resource, items);
    this.resource = resource;
    this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout itemView;
    final Item item = getItem(position);

    if (convertView == null) {
        itemView = new LinearLayout(getContext());

        LayoutInflater layoutInflater = LayoutInflater.from(getContext());
        layoutInflater.inflate(resource, itemView, true);
    }
    else {
        itemView = (LinearLayout) convertView;
    }

そして、MainActivity onCreate()にitem.xmlをロードします

public class MainActivity{
    private List<Item> items;
    private ItemAdapter itemAdapter;
    @Override
      protected void onCreate(Bundle savedInstanceState) {
      itemAdapter = new ItemAdapter(this, R.layout.item, items);
0
ChihWei