カスタマイズされたレイアウトで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);
ArrayAdapterは、2番目のパラメーターをAndroid.R.layout.simple_list_item_1のようなintとして受け入れます。
getView
のArrayAdapter
メソッドをカスタマイズしない場合、カスタムレイアウトには、Android:id="@Android:id/text1"
idを持つ1つのTextViewが必要であり、1つのTextViewに値を表示します。
現在のコードでアプリケーションを実行するには、Android:id="@Android:id/text1"
レイアウトのTextView
にR.layout.listi_tems_layout
を追加します。
R.layout.listi_tems_layout
レイアウトにはTextViewを含む他のビューも含まれているため、ArrayAdapterクラスを拡張して他のビューにもアクセスすることにより、カスタムアダプタを作成します。
次の例を参照してください: ListView(Android)のカスタムArrayAdapter
それがまだ関連しているかどうかはわかりません。ソースから、ArrayAdapterには3番目のパラメーターでtextviewリソースを受け入れるコンストラクターがあるようですが、2017年に新しく追加された突き出しかどうかはわかりません:D、
ArrayAdapter adapter = new ArrayAdapter<>(context,YourCustomLayoutID,TextViewIDinYourLayout,ListData);
ソースから、textviewレイアウトIDを指定しなかった場合、ビュー全体がtextviewであると想定されるため、新しいアダプターを拡張/作成せずにカスタムビューを使用できると思います(私はそれを作成するのが嫌いです)私自身)、しかしあなたはテキストに使用されるtextviewを提供する必要があります
クラスを作成し、このようなベースアダプターで拡張してから、このアダプターを設定します
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;
}
}
私があなたを理解しているように。 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;
}
}
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);