【问题标题】:Android custom ListView layout problemsAndroid自定义ListView布局问题
【发布时间】:2014-09-16 19:32:44
【问题描述】:

大家好,我尝试通过page 学习如何使用自定义 ListView

效果很好,但我在使用其他选项时遇到了问题。

  1. 无法为 listItems 设置边距
  2. 无法设置背景
  3. 无法设置 OnItemClickListener

1#边距

首先,我试图在列表项之间设置边距,但没有任何效果。我尝试在 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#背景

我想在 listView 下设置整个屏幕的背景。我想我在找到的每个 xml 中的每个视图上都涂了黑色,但没有任何影响背景。我可以更改单个列表项的背景,仅此而已。

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>

【问题讨论】:

  • XML 上的列表视图在哪里?你是在代码中的某处添加它吗?
  • 我将 main.xml 添加到我的问题中。我在哪里声明 ListView。

标签: android android-layout listview android-listview


【解决方案1】:

看来您的活动已经完成了一半。

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

【讨论】:

    【解决方案2】:
    //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.  */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多