Android自定义ListView布局问题

时间:2014-09-16 19:32:44

标签: android android-layout listview android-listview

大家好,我试着通过这个page

学习如何使用自定义ListView

它工作正常,但我有其他选项的问题。

  1. 无法将余量设置为listItems
  2. 无法设置背景
  3. 无法设置OnItemClickListener

  4. 1#Margin

    首先,我试图在列表项之间设置边距但没有任何效果。我尝试在rowlayout.xml中设置RelativeLayout的边距

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="75dp"
        android:background="@drawable/rounded"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        >
    

    2#Background

    我想在listView下的整个屏幕上设置背景。我想我在每个xml的每个View上都涂上了黑色,但没有任何影响背景。我可以更改单个列表项的背景,这就是全部。

    android:background="#000000"
    

    3#OnItemClickListener

    我的最后一个问题是我无法设置onItemClickListener。我不知道如果我没有简单的ListView,而是使用TextView等的RelativeLayout,如何设置它。 我想我必须使用

    setOnClickListener(new OnClickListener()
    

    之后

                    public void onClick(View arg0) {
    

    但我不知道我必须使用哪种视图。

    文件


    MyAdapter.java

    public class MyAdapter extends ArrayAdapter<Model> {
    
        private final Context context;
        private final ArrayList<Model> modelsArrayList;
    
        public MyAdapter(Context context, ArrayList<Model> modelsArrayList) {
    
            super(context, R.layout.rowlayout, modelsArrayList);
    
            this.context = context;
            this.modelsArrayList = modelsArrayList;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            // 1. Create inflater
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
            // 2. Get rowView from inflater
    
            View rowView = null;
            if(!modelsArrayList.get(position).isGroupHeader()){
                rowView = inflater.inflate(R.layout.rowlayout, parent, false);
    
                // 3. Get icon,title & counter views from the rowView
                ImageView imgView = (ImageView) rowView.findViewById(R.id.item_icon);
                TextView titleView = (TextView) rowView.findViewById(R.id.item_title);
                TextView counterView = (TextView) rowView.findViewById(R.id.item_counter);
    
                // 4. Set the text for textView
                imgView.setImageResource(modelsArrayList.get(position).getIcon());
                titleView.setText(modelsArrayList.get(position).getTitle());
                counterView.setText(modelsArrayList.get(position).getCounter());
            }
            else{
                //rowView = inflater.inflate(R.layout.group_header, parent, false);
               // TextView titleView = (TextView) rowView.findViewById(R.id.header);
               // titleView.setText(modelsArrayList.get(position).getTitle());
                }
    
    
            // 5. retrn rowView
            return rowView;
        }
    }
    

    Model.java

    package com.example.sunny.katan;
    
    /**
     * Created by Sunny on 15.09.14.
     */
    public class Model{
    
        private int icon;
        private String title;
        private String counter;
    
        private boolean isGroupHeader = false;
    
        public Model(String title) {
            this(-1,title,null);
            isGroupHeader = true;
        }
        public Model(int icon, String title, String counter) {
            super();
            this.icon = icon;
            this.title = title;
            this.counter = counter;
        }
    
        public String getCounter() {
            return counter;
        }
    
        public String getTitle() {
            return title;
        }
    
        public int getIcon() {
            return icon;
        }
    
        public boolean isGroupHeader() {
            return false;
        }
    
        public void setGroupHeader(boolean isGroupHeader) {
            this.isGroupHeader = isGroupHeader;
        }
    
    
    //gettters & setters...
    }
    

    main.java

    public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
    
            // if extending Activity
            //setContentView(R.layout.activity_main);
    
            // 1. pass context and data to the custom adapter
            MyAdapter adapter = new MyAdapter(this, generateData());
    
            // if extending Activity 2. Get ListView from activity_main.xml
            //ListView listView = (ListView) findViewById(R.id.listview);
    
            // 3. setListAdapter
            //listView.setAdapter(adapter); if extending Activity
            setListAdapter(adapter);
        }
    
        private ArrayList<Model> generateData(){
            ArrayList<Model> models = new ArrayList<Model>();
            models.add(new Model(R.raw.barbell,"Cviky","37"));
            models.add(new Model(R.raw.stretching,"Protahování","94"));
            models.add(new Model(R.raw.work,"Generování workoutu","293"));
    
            return models;
        }
    

    rowlayout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="75dp"
        android:background="@drawable/rounded"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        >
    
        <!-- icon -->
        <ImageView
            android:id="@+id/item_icon"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_centerVertical="true"
            android:src="@raw/barbell"
            />
    
        <!-- title -->
        <TextView
            android:id="@+id/item_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:layout_toRightOf="@+id/item_icon"
            android:layout_marginTop="30dp"
            android:layout_alignBaseline="@+id/item_counter"
            android:textSize="20dp"
            />
    
        <!-- counter -->
        <TextView
            android:id="@+id/item_counter"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_alignParentRight="true"
            android:layout_marginRight="8dp"
            android:layout_centerVertical="true"
            android:background="@drawable/rectangle"
            android:gravity="center"
            android:textColor="#FFFFFF"
            android:textSize="12sp"
            android:textStyle="bold" />
    
    </RelativeLayout>
    

    main.xml中

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:fillViewport="false"
        >
    
    
    <LinearLayout
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:context=".katan_lobby"
        android:orientation="vertical"
        >
    
        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/menu"
            android:layout_gravity="center_horizontal"
            android:background="#238CD4"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/prvniItemSeznamu"
            android:background="#238CD4"
            style="@style/listView"
            />
    
    </LinearLayout>
    </ScrollView>
    

2 个答案:

答案 0 :(得分:0)

看起来你在活动的一半。

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    MyAdapter adapter = new MyAdapter(this, generateData());
    ListView listView = (ListView) findViewById(R.id.menu);
    listView.setAdapter(adapter); if extending Activity

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
            //You now have the position but you will need to get your model list and use .get(position) and cast it to Model to get access to it.
        } 
    });
}

答案 1 :(得分:0)

//First define your list view item xml… something like this.

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/white"
    android:layout_marginTop="10dp"
    android:padding="10dp" >

    <TextView
        android:id="@+id/item1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/custom_blue"
        android:text="TextView" />

     <TextView
        android:id="@+id/item2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:textColor="@color/custom_grey"
        android:text="TextView" />

     </LinearLayout> 

//Then you define your list list adapter.


    public class MyListAdapter extends ArrayAdapter<MyModel> {

    private Context            context;
    private ArrayList<MyModel> myModel;

    public MyListAdapter(Context context, ArrayList<MyModel> myModelList) {
        super(context, R.id.icon, myModelList);

        this.context = context;
        this.myModelList = myModelList;
    }

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

       LayoutInflater inflater = null;
        View rowView = convertView;

            TextView myItemName = (TextView)rowView.findViewById(R.id.item1);
            TextView myItemTitle = (TextView)rowView.findViewById(R.id.item2);


           //use your models getters/setters
            myItemName.setText(myModelList.get(position).getItemTitle());
            myItemTitle.setText(myModelList.get(position).getItemName());
       return rowView
      }
    }

//Now use both the list adapter and list item in your ListFragment or ListActivity.

       ArrayList<MyModel> myModelList = new ArrayList<MyModel>();

        MyListAdapter myApt = new MyListAdapter(this, myModelList);
        setListAdapter(myApt);


     //For clicking on the items:
      @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // ListView Clicked item value
        String itemValue = l.getItemAtPosition(position).toString();

        doSomethingWihtMyItemMethod(position);
    }


 /* You can customize your list item anyway you like, just be aware of screen real estate  when doing so.Hope this helps.  */