【问题标题】:custom Listview is not displaying as it should自定义 Listview 未按应有的方式显示
【发布时间】:2012-01-31 05:14:41
【问题描述】:

我已经为我的列表项和我的自定义列表适配器创建了格式。问题是我的列表视图没有按我设计的那样显示。

这是每个列表项的 XML。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip" >
    <ImageView
        android:id="@+id/icon1"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="6dip"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/secondLine"
        android:layout_width="fill_parent"
        android:layout_height="26dip"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@id/icon1"
        android:ellipsize="marquee"
        android:singleLine="true"
        android:text="Some more information" />

    <TextView
        android:id="@+id/firstLine"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/secondLine"
        android:layout_alignParentTop="true"
        android:layout_alignWithParentIfMissing="true"
        android:layout_toRightOf="@id/icon1"
        android:gravity="center_vertical"
        android:text="Some Information" />

    <ImageView
        android:id="@+id/icon2"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="6dip"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

这是我的代码,你可以看到我正在尝试使用视图持有者,因为我听说这是最有效的方式:

public class FirstLoginActivity extends ListActivity {
        Context mContext;
        List mList;
        String[] testcontacts;

        MessageView aa = null;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            testcontacts = getResources()
                    .getStringArray(R.array.testcontacts_array);

            aa = new MessageView();
            // setContentView(R.layout.firstList);
            ListView lv = getListView();
            lv.setAdapter(aa);
            lv.setTextFilterEnabled(true);

            lv.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    // When clicked, show a toast with the TextView text
                    Toast.makeText(getApplicationContext(),
                            ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
                }
            });
        }
        class MessageView extends ArrayAdapter<String> {
            MessageView() {
                super(FirstLoginActivity.this, android.R.layout.activity_list_item,
                        testcontacts);
                // TODO Auto-generated constructor stub
            }

            public View getView(int position, View convertview, ViewGroup parent) {
                Log.d("Ebz", "inside getView method");
                ViewHolder holder;
                View v = convertview;
                if (v == null) {
                    Log.d("Ebz", "if v == null");
                    LayoutInflater inflater = getLayoutInflater();
                    v = inflater.inflate(R.layout.list_items, null);
                    holder = new ViewHolder();
                    holder.firstLine = (TextView) v.findViewById(R.id.firstLine);
                    holder.secondLine = (TextView) v.findViewById(R.id.secondLine);
                    holder.icon1 = (ImageView) v.findViewById(R.id.icon1);
                    holder.icon2 = (ImageView) v.findViewById(R.id.icon2);
                    v.setTag(holder);
                } else {
                    holder = (ViewHolder) v.getTag();
                }
                holder.firstLine.setText(testcontacts[position]);
                holder.secondLine.setText(testcontacts[position]);
                holder.icon1.setImageBitmap(null);
                holder.icon2.setImageBitmap(null);
                // call the images directly?
                return v;
            }

            class ViewHolder {
                TextView firstLine;
                TextView secondLine;
                ImageView icon1;
                ImageView icon2;

            }
        }
    }

这是我想在调用活动时显示的 xml,列表项的格式是我之前创建的。

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >


    <RelativeLayout
        android:id="@+id/top_control_bar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:layout_weight="1"
            android:background="@drawable/titlebar"
            android:gravity="center"
            android:paddingBottom="10dp"
            android:paddingLeft="10dp"
            android:paddingTop="10dp"
            android:text="Messages"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#fff" />
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/bottom_control_bar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >
    </LinearLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_above="@id/bottom_control_bar"
        android:layout_below="@id/top_control_bar"
        android:choiceMode="multipleChoice"
        android:divider="#FFFFFF"
        android:dividerHeight="14.5dp" >
    </ListView>

</RelativeLayout>

【问题讨论】:

  • 当我在我的赏金信息中说另一种方式时,我的意思是另一种更有效的方式,谢谢
  • 如果不使用 ViewHolder 是否显示项目。 ?并在适配器的getView 回调中使用getitem 而不是testcontacts[position]
  • 那么应该怎么显示,实际是怎么显示的呢?屏幕截图可能会有所帮助。
  • 是的,请把你显示的屏幕截图。 . .

标签: android listview arraylist android-arrayadapter listadapter


【解决方案1】:

首先,这在图像视图中不起作用:

android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"

从列表视图中删除 android:layout_height="0dip" 并将其更改为 fill_parent。两者不能一起工作。使用android:layout_alignparent="center_vertical"。为了获得更好的答案,您应该粘贴所需设计的图片。

【讨论】:

    【解决方案2】:

    好的。没有人给你一个正确的答案。好吧,我已经解决了你的问题。 您没有获得该布局,因为在 getView 方法中您正在传递 String[] 但您正在扩展 ArrayAdapter。

    您应该为 ArrayAdapter 传递 ArrayList。

    见下面解决的代码:

    package com.exmple.helperStackOverflow;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    
    
    import android.app.ListActivity;
    import android.app.LocalActivityManager;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class FirstLoginActivity extends ListActivity {         
        private ArrayList<String> m_orders = null;
        private MessageView aa;
        private String[] testcontacts = new String[] {"A","B","C","D","E","F","G","H"};
        protected static LocalActivityManager mLocalActivityManager;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.firstlist);
    
            m_orders = new ArrayList<String>();
            this.aa = new MessageView(this, R.layout.list_items, m_orders);
            setListAdapter(this.aa);
    
            getOrders();
        }
    
        private Runnable returnRes = new Runnable() {
            @Override
            public void run() {
                if(m_orders != null && m_orders.size() > 0){
                    aa.notifyDataSetChanged();
                    for(int i=0;i<m_orders.size();i++)
                    aa.add(m_orders.get(i));
                }
                aa.notifyDataSetChanged();
            }
        };
        private void getOrders(){
              try{
                  m_orders = new ArrayList<String>();
                  for (int i = 0; i < testcontacts.length; i++){
                    m_orders.add(testcontacts[i]);
                  }
                  Thread.sleep(100);
                  Log.i("ARRAY", ""+ m_orders.size());
                } catch (Exception e) { 
                  Log.e("BACKGROUND_PROC", e.getMessage());
                }
                runOnUiThread(returnRes);
            }
        private class MessageView extends ArrayAdapter<String> {
    
            private ArrayList<String> items;
    
            public MessageView(Context context, int textViewResourceId, ArrayList<String> items) {
                    super(context, textViewResourceId, items);
                    this.items = items;
            }
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                    View v = convertView;
                    if (v == null) {
                        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        v = vi.inflate(R.layout.list_items, null);
                    }
                    String o = items.get(position);
                    if (o != null) {
                            TextView tt = (TextView) v.findViewById(R.id.secondLine);
                            //ImageView im = (ImageView)v.findViewById(R.id.icon);
                            if (tt != null) {
                                  tt.setText(testcontacts[position]);  
                            }
    //                      
                    }
                    return v;
            }
        }
     }
    

    如果你还是不明白,请告诉我,因为我已经完全解决了你的问题。

    更新

    如果您想为此 ListView 实现 ViewHolder,请参见下文:

    首先创建ViewHolder的类:

    public static class ViewHolder
    {
        public TextView tt;
        public TextView bt;
        public ImageView leftImage;
        public ImageView rightImage;
    }
    

    现在只需将您的 getView 方法替换为以下方法:

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                ViewHolder holder = null;
                if (v == null) {
                    holder=new ViewHolder();
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.list_items, null);
    
                    holder.tt= (TextView) v.findViewById(R.id.firstLine);
                    holder.bt= (TextView) v.findViewById(R.id.secondLine);
                    holder.leftImage = (ImageView) v.findViewById(R.id.icon1); // For ImageView
                    holder.rightImage = (ImageView) v.findViewById(R.id.icon2); // For ImageView
    
                    v.setTag(holder);
                }
                else
                    holder=(ViewHolder)v.getTag();
                String o = items.get(position);
                holder.tt.setText(testcontacts[position]);
                holder.bt.setText("First Line");
    
                if (o != null) {                        
                }
    
          return v;
        }
    

    享受。 :)

    【讨论】:

    • 嘿伙计,您的代码确实有帮助,非常感谢,但它仍然没有像我设计的那样显示我的 xml。具有 2 个图像视图和两个文本字段。
    • 好的,然后让我检查您的 xml 代码。 . .我会尽快回复你。 . .
    • @TheObliviator:请复制粘贴我的代码并尝试使用您的数据。因为它对我来说很完美。 . .
    • 请把你使用这个java代码后得到的截图放上去。 . .因为我刚刚复制粘贴您的 xml 并使用我的 java 代码,它工作正常。 . .
    • 查看更新的答案。我已经为你实现了 ViewHolder。
    【解决方案3】:
     <ListView        
       android:id="@android:id/list"         
       android:layout_width="fill_parent"        
       android:layout_height="0dip"       
       android:layout_above="@id/bottom_control_bar" 
       android:layout_below="@id/top_control_bar"
       android:choiceMode="multipleChoice"        
       android:divider="#FFFFFF"         
       android:dividerHeight="14.5dp" >    
     </ListView> 
    

    在这段代码中,您给出了android:layout_height="0dip",这导致了您的问题。要么设为wrap_contentfill_parent,要么给它一些固定值,例如200dip

    请注意,最后一个选项会将列表高度设置为200dip,因此如果您想要精确的大小,使其适合top_control_barbottom_control_bar 之间的大小

    尝试从java文件生成你的ui:

     ListView list = new ListView(this);
     list.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,getScreenHeight()-(top_control_bar_height + bottom_control_bar_height));
     this.addView(list);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多