how to add customised layout to Arrayadapter?

前端 未结 5 1073
-上瘾入骨i
-上瘾入骨i 2020-12-09 06:35

I am trying to create a ListView with customized layout. each item in the listView should look like as shown in the item.xml posted be

相关标签:
5条回答
  • 2020-12-09 07:05

    create a class and extends with base adapter like this and then set this adapter

    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;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-09 07:10

    As I understand you. You are trying to have custom layout in ArrayAdapter. It's not possible. Yout need to write your own custom adapter extending arrayAdapter class where you define how to deal with your custom layout using your topicsList. Something like this:

    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;
    }
    }
    
    0 讨论(0)
  • 2020-12-09 07:15

    I'm not sure if it's still relevant, from the source ArrayAdapter seem to have constructor that accept textview resource in 3rd parameter, not sure if it's juts newly added in 2017 :D,

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

    and from the source, if you didn't supply textview layout id, it will assume that the whole view is a textview, so I think it's possible to use custom view without extending/creating new adapter (I know, I hate to create one myself), but you need to provide textview used for the text

    0 讨论(0)
  • 2020-12-09 07:15

    Please create your own ItemAdapter which extends ArrayAdapter<>.

    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;
        }
    

    And load your item.xml in MainActivity onCreate()

    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 讨论(0)
  • 2020-12-09 07:17

    ArrayAdapter accepts the second parameter as int something like android.R.layout.simple_list_item_1

    When not customizing getView method of ArrayAdapter then custom layout require one TextView with android:id="@android:id/text1" id and show value in one TextView.

    To run application with current code add android:id="@android:id/text1" for TextView in R.layout.listi_tems_layout layout.

    Because R.layout.listi_tems_layout layout contains other views also with TextView so create custom Adapter by extending ArrayAdapter class to access other views also.

    See following example:Custom ArrayAdapter for a ListView (Android)

    0 讨论(0)
提交回复
热议问题