扩大中间元素的列表视图 - 机器人?视图、机器人、元素、列表

2023-09-05 07:58:55 作者:烂人

我试着去放大该中心最ListView项。 (最后,我希望扩大这一成一种简单的轻3D效果的元素时会出现放大在屏幕的中间和缩小的时候都向下跌破,全黑的背景和文字项的放大和缩小...)

所以,我做了一个虚拟列表视图,每一行是一个TextView元素。下面,我有一个自定义的适配器。

唯一相关的修改我所做的就是:

在OnCreate(),我通过以下变量对适配器:

  INT V =(listview.getLastVisiblePosition() -  listview.getFirstVisiblePosition())+ 1;
 

和在适配器的getView(),我有这样的:

 如果(位置== X / 2){
        textView.setHeight(100);
    }
 

反正这里的所有的code,我已经跳过了进口:(!这不是那么大......大部分是相当普遍的)

MainActivity.java:

 公共类MainActivity延伸活动{

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    最终的ListView列表视图=(ListView控件)findViewById(R.id.listview);
    的String []值=新的String [] {机器人,iPhone,WindowsMo​​bile的,
            黑莓,WebOS的,Ubuntu的,Windows7的,iPhone,WindowsMo​​bile的,
            黑莓,WebOS的,Ubuntu的,Windows7的,iPhone,WindowsMo​​bile的,
            黑莓,WebOS的,Ubuntu的,Windows7的,最大OS X};

    最后的ArrayList<字符串>名单=新的ArrayList<字符串>();
    的for(int i = 0; I< values​​.length ++我){
        list.add(值[I]);
    }
    INT V =(listview.getLastVisiblePosition() -  listview.getFirstVisiblePosition())+ 1;


    最后MySimpleArrayAdapter适配器=新MySimpleArrayAdapter(本,V,R.layout.row,清单);
    listview.setAdapter(适配器);

    listview.setOnItemClickListener(新AdapterView.OnItemClickListener(){
        @覆盖
        公共无效onItemClick(适配器视图<>母公司,最终视图中查看,
                INT位置,长的id){

        }

    });
}
 
MotoSimEG VRC软件 机器人仿真视频输出功能介绍

}

MySimpleArrayAdapter.java

 公共类MySimpleArrayAdapter扩展ArrayAdapter<字符串> {
私人最终上下文的背景下;
私人最终诠释X;

HashMap的<字符串,整数> mIdMap =新的HashMap<字符串,整数>();

公共MySimpleArrayAdapter(上下文的背景下,一个诠释,诠释textViewResourceId,
        名单<字符串>对象){
    超(背景下,textViewResourceId,对象);
    this.context =背景;
    this.x =一个;
    的for(int i = 0; I< objects.size(); ++ I){
        mIdMap.put(objects.get(ⅰ),ⅰ);
    }

}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    LayoutInflater充气=(LayoutInflater)上下文
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    查看rowView = inflater.inflate(R.layout.row,父母,假);
    TextView中的TextView =(TextView中)rowView.findViewById(R.id.textView1);

    如果(位置== X / 2){
        textView.setHeight(100);
    }

    返回rowView;
}

@覆盖
众长getItemId(INT位置){
    字符串项=的getItem(位置);
    返回mIdMap.get(项目);
}

@覆盖
公共布尔hasStableIds(){
    返回true;
}
 

}

另外,我activity_main.xml我只是有一个列表视图,并在row.xml我有一个TextView的。

问题:为什么没有文字出现?我清楚地添加列表值TextView的。

为什么是最上面的元素大,没有中间的一个,我专门将其设置为中间的一个?

下面是我目前的code给出的screenie:

http://i.stack.imgur.com/VqDyp.png

logcat的错误 - KMDev的解决方案

  10-06 17:54:02.529:E / AndroidRuntime(19596):致命异常:主要
10-06 17:54:02.529:E / AndroidRuntime(19596):java.lang.RuntimeException的:无法启动的活动ComponentInfo {mple.finala / mple.finala.MainActivity}:显示java.lang.NullPointerException
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.ActivityThread.access $ 600(ActivityThread.java:134)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1247)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.os.Handler.dispatchMessage(Handler.java:99)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.os.Looper.loop(Looper.java:154)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.ActivityThread.main(ActivityThread.java:4624)
10-06 17:54:02.529:E / AndroidRuntime(19596):在java.lang.reflect.Method.invokeNative(本机方法)
10-06 17:54:02.529:E / AndroidRuntime(19596):在java.lang.reflect.Method.invoke(Method.java:511)
10-06 17:54:02.529:E / AndroidRuntime(19596):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:809)
10-06 17:54:02.529:E / AndroidRuntime(19596):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
10-06 17:54:02.529:E / AndroidRuntime(19596):在dalvik.system.NativeStart.main(本机方法)
10-06 17:54:02.529:E / AndroidRuntime(19596):由:显示java.lang.NullPointerException
10-06 17:54:02.529:E / AndroidRuntime(19596):在mple.finala.MainActivity $ 2.onScroll(MainActivity.java:79)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1297)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.widget.AbsListView.setOnScrollListener(AbsListView.java:1286)
10-06 17:54:02.529:E / AndroidRuntime(19596):在mple.finala.MainActivity.onCreate(MainActivity.java:58)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.Activity.performCreate(Activity.java:4479)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
10-06 17:54:02.529:E / AndroidRuntime(19596):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
10-06 17:54:02.529:E / AndroidRuntime(19596):11 ...更多
 

编辑2:

完成code ,仍然给空例外。

HTTP://$c$cviewer.org/view/$c$ C:373D

解决方案

有几件事情需要解决。

您需要使用ViewHolder模式。那你真的需要了解的ListView的东西都在 GoogleIO 2010 - 的ListView的视频世界。

这不是一个真正的好主意,调整项目布局在getView因为这将是ListView控件使用视图回收产生负面影响。这也是在视频。我真的鼓励你去尝试,找到一个不同的方式来显示你要显示的内容。

设置文本

您正在传递的是提供一个实际的项目资源ID,你要在x方向的一个项目到您的适配器的构造来代替。 ArrayAdapter将设置你的文字你,如果你在正确的参数传递。对于使用字符串的资源和所提供的默认列表项的布局一个简单的例子:

 的String [] MDATA = getResources()getStringArray(R.array.list_examples)。
ArrayAdapter<字符串> mBaseAdapter =
            新的ArrayAdapter<字符串>(背景下,
                                     android.R.layout.simple_list_item_1,
                                     android.R.id.text1,
                                     mListData);
 

如果我是你,我只是让设置文本的适配器,抓住项目布局,通过调用超级像这样:

  @覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中的ViewGroup){
    convertView = super.getView(位置,convertView,ViewGroup中);
    //其他code在这里
}
 

如果你真的想自己做,在这里它与ViewHolder模式

  //这是ViewHolder
    静态类持有人{
        TextView的多行文字;
    }


    @覆盖
    公共查看getView(INT位置,查看convertView,ViewGroup中的ViewGroup){

         convertView = super.getView(位置,convertView,ViewGroup中);

         如果(convertView == NULL){
              //如果达不到这一点,就极有可能意味着你没有提供的
              //适配器的布局和它需要的TextView资源。您可以
              //注释掉的getView覆盖,看看你的文字变得
              //显示。
         }

         持有人mHolder;
         如果(convertView.getTag()== NULL){
            mHolder =新的持有人();
            mHolder.mText =(TextView中)convertView.findViewById(android.R.id.text1);
            convertView.setTag(mHolder);
         } 其他 {
            mHolder =(座)convertView.getTag();
         }

         mHolder.mText.setText(的getItem(位置)的ToString());
    }
 

关于getXVisibleItem方法

  //这些都在适配器视图来实现,这意味着
//它们是平的列表中的位置
INT firstVis = mList.getFirstVisiblePosition();
INT lastVis = mList.getLastVisiblePosition();

/ *这是军转民从平面列表中的位置,以孩子的ViewGroup位置* /
诠释计数= lastVis  -  firstVis;

 / * getChildAt(POS)在的ViewGroup实现,具有不同的含义
 *它的位置值。跟踪的ViewGroup可见的项目为儿童和为0索引。
 *这意味着你将有0  -  X位置,其中X是它采取然而,许多项目
 *以填补屏幕的可视面积;通常小于10 * /
 查看的listItem = mList.getChildAt(计数 - ((int)的数/ 2)); //这将让中间
                                                        //为你调整为项目
                                                        // 你想。
 

要发现在屏幕中间的项目,你只需要把你的可视项目数和减去一半算作上述评论。

设置高度实施

您将要设置的AbsListView.OnScrollListener在您的ListView和当滚动停止时,应用您调整中间项。例如:

  mList.setOnScrollListener(新OnScrollListener(){
    @覆盖
    公共无效onScrollStateChanged(AbsListView观点,诠释scrollState){

    }

    @覆盖
    公共无效onScroll(AbsListView来看,
                         INT firstVisibleItem,
                         INT visibleItemCount,
                         INT totalItemCount){

        //注意滚动完成时此被调用。
        //它给我们的立场,我们希望这样才算
        //中间的元素,抓住它,并直接调节高度
        //或增加利润,如果该项目layout_height是
        // WRAP_CONTENT。我不是正面的边缘做你
        //需要,而是直接设置高度应。
        LinearLayout中的listItem = mList //<  - 更换的LinearLayout与布局
                      .getChildAt(visibleItemCount  - ((int)的visibleItemCount / 2));

        //确保你使用了正确的LayoutParams为的listItem布局
        //如果你的listItem是一个RelativeLayout的,例如,你可以使用:
        // listItem.setLayoutParams(
        //新RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
        // theHeightYouWantHere));
        listItem.setLayoutParams(
                新LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
                                              theHeightYouWantHere));

        }
});
 

我做了一些切向相关博客文章有关ListView和ExpandableListView具有全如何刷新可见项目code例子(这个例子code只是改变了项目的文本/背景颜色),它使用了childAt策略。请原谅我的个人博客链接,它的风格(这是新的,需要更多的工作:),但code效果很好。

编辑2:对于android.R.simple_list_item_1

这不正是你想要的,只要你使用的项目布局一个TextView(android.R.simple_list_item_1是一个TextView)的东西。如果你决定使用的ViewGroup布局,你需要item.setHeight用的LayoutParams方法代替。

  mList.setOnScrollListener(新OnScrollListener(){
    @覆盖
    公共无效onScrollStateChanged(最终AbsListView认为,最终诠释scrollState){

    }

    @覆盖
    公共无效onScroll(最终AbsListView来看,
                         最终诠释firstVisibleItem,
                         最终诠释visibleItemCount,
                         最终诠释totalItemCount){
        如果(visibleItemCount!= 0){

             Log.i(TAG,firstVisibleItem:
                         + firstVisibleItem
                         +\ nvisibleItemCount:
                         + visibleItemCount);

             最终诠释midPosition = visibleItemCount  - (visibleItemCount / 2);
             最后的TextView的listItem =(TextView中)mList.getChildAt(midPosition);
             listItem.setHeight(500); //只有当你使用的作品
                                      //android.R.simple_list_item_1因为它是
                                      //不是一个ViewGroup中,而是一个TextView

             诠释计数= visibleItemCount;
             而(计数> = 0){//这里我们通过需要循环,并确保
                                 //所有回收的项目都返回到
                                 //原来的高度。
                 最后的TextView项目=(TextView中)mList.getChildAt(计数);
                 如果(项目= NULL和放大器;!&安培;!数= midPosition){
                     item.setHeight(100);
                 }
                 计数 - ;
              }
        }
    }
});
 

Im trying to Enlarge the Centre most listview item. (Eventually, I hope to expand this into a sort of simple and light 3D effect that elements will appear to zoom in when in the middle of the screen and zoom out when they are down below, Total black background and text items zooming in and out... )

So, I've made a dummy listview, Each row is a textview element. Below, I have a custom Adapter.

The only relevant modification I've done is:

In the OnCreate(), I pass the following variable to the adapter:

int v = (listview.getLastVisiblePosition() - listview.getFirstVisiblePosition()) + 1;

And in the Adapter's getView(), I've got this :

if (position == x/2) {
        textView.setHeight(100);
    }

Anyways here's all of the code, I've skipped the imports: (It's not that big !... most of it is quite general)

MainActivity.java :

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ListView listview = (ListView) findViewById(R.id.listview);
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
            "Blackberry", "WebOS", "Ubuntu", "Windows7","iPhone", "WindowsMobile",
            "Blackberry", "WebOS", "Ubuntu", "Windows7","iPhone", "WindowsMobile",
            "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X" };

    final ArrayList<String> list = new ArrayList<String>();
    for (int i = 0; i < values.length; ++i) {
        list.add(values[i]);
    }
    int v = (listview.getLastVisiblePosition() - listview.getFirstVisiblePosition()) + 1;


    final MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, v, R.layout.row, list);
    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, final View view,
                int position, long id) {

        }

    });
}

}

MySimpleArrayAdapter.java

public class MySimpleArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final int x;

HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

public MySimpleArrayAdapter(Context context, int a, int textViewResourceId,
        List<String> objects) {
    super(context, textViewResourceId, objects);
    this.context = context;
    this.x = a;
    for (int i = 0; i < objects.size(); ++i) {
        mIdMap.put(objects.get(i), i);
    }

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.row, parent, false);
    TextView textView = (TextView) rowView.findViewById(R.id.textView1);

    if (position == x/2) {
        textView.setHeight(100);
    }

    return rowView;
}

@Override
public long getItemId(int position) {
    String item = getItem(position);
    return mIdMap.get(item);
}

@Override
public boolean hasStableIds() {
    return true;
}

}

Further, in my activity_main.xml I just have a single listview, and in "row.xml" I have a single textview..

Problems: Why is no text appearing? I clearly added the list values to the textview .

Why is the top most element big and not the middle one, I specifically set it to the middle one ?

Here's the screenie that my current code gives:

http://i.stack.imgur.com/VqDyp.png

LOGCAT Error - KMDev's solution

10-06 17:54:02.529: E/AndroidRuntime(19596): FATAL EXCEPTION: main
10-06 17:54:02.529: E/AndroidRuntime(19596): java.lang.RuntimeException: Unable to start activity ComponentInfo{mple.finala/mple.finala.MainActivity}: java.lang.NullPointerException
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.ActivityThread.access$600(ActivityThread.java:134)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.os.Looper.loop(Looper.java:154)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.ActivityThread.main(ActivityThread.java:4624)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at java.lang.reflect.Method.invokeNative(Native Method)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at java.lang.reflect.Method.invoke(Method.java:511)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at dalvik.system.NativeStart.main(Native Method)
10-06 17:54:02.529: E/AndroidRuntime(19596): Caused by: java.lang.NullPointerException
10-06 17:54:02.529: E/AndroidRuntime(19596):    at mple.finala.MainActivity$2.onScroll(MainActivity.java:79)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1297)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.widget.AbsListView.setOnScrollListener(AbsListView.java:1286)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at mple.finala.MainActivity.onCreate(MainActivity.java:58)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.Activity.performCreate(Activity.java:4479)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
10-06 17:54:02.529: E/AndroidRuntime(19596):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
10-06 17:54:02.529: E/AndroidRuntime(19596):    ... 11 more

EDIT 2:

Complete Code, still giving null exception.

http://codeviewer.org/view/code:373d

解决方案

A few things need to be addressed.

You need to use the ViewHolder pattern. That and the things you really need to know about ListView are in the GoogleIO 2010 - The World of ListView video.

It's not really a good idea to adjust the layout of an item in getView as that will negatively impact the view recycler that ListView uses. That is also in the video. I would really encourage you to try and find a different way to display what you want to display.

Setting your text

You're passing the x-dimension you want for an item in to your Adapter's constructor instead of supplying it an actual item resource id. ArrayAdapter will set your text for you if you pass in the right arguments. For a simple example using a string resource and the default provided list item layouts:

String[] mData = getResources().getStringArray(R.array.list_examples);
ArrayAdapter<String> mBaseAdapter = 
            new ArrayAdapter<String>(context, 
                                     android.R.layout.simple_list_item_1,
                                     android.R.id.text1,
                                     mListData);

If I were you, I'd just let the adapter set the text and grab that item layout by calling super like so:

@Override
public View getView(int position, View convertView, ViewGroup viewGroup){
    convertView = super.getView(position,convertView, viewGroup);
    //other code here
}

If you really want to do it yourself, here it is with the ViewHolder pattern

    //This is the ViewHolder
    static class Holder{
        TextView mText;
    }


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

         convertView = super.getView(position, convertView, viewGroup);

         if (convertView == null){
              // If you reach this, it most likely means you're not supplying the
              // adapter the layout and textview resource it needs. You can
              // just comment out your getView override and see if your text gets
              // displayed.
         }

         Holder mHolder;
         if(convertView.getTag() == null){
            mHolder = new Holder();
            mHolder.mText = (TextView)convertView.findViewById(android.R.id.text1);
            convertView.setTag(mHolder);
         } else {
            mHolder = (Holder) convertView.getTag();
         }

         mHolder.mText.setText(getItem(position).toString());
    }

About getXVisibleItem methods

// These are both implemented in AdapterView which means
// they're flat list positions
int firstVis = mList.getFirstVisiblePosition(); 
int lastVis = mList.getLastVisiblePosition();

/* This is the "conversion" from flat list positions to ViewGroup child positions */
int count = lastVis - firstVis; 

 /*  getChildAt(pos) is implemented in ViewGroup and has a different meaning for 
 *  its position values. ViewGroup tracks visible items as children and is 0 indexed. 
 *  This means you'll have 0 - X positions where X is however many items it takes 
 *  to fill the visible area of your screen; usually less than 10. */
 View listItem = mList.getChildAt(count - ((int)count/2)); // This will get the middle 
                                                        // item for you to adjust as 
                                                        // you want.

To find the item in the middle of the screen, you just need to take your visible item count and subtract half of that count as commented above.

Set Height Implementation

You will want to set an AbsListView.OnScrollListener on your ListView and when the scroll stops, apply your adjustments to the middle item. Ex:

mList.setOnScrollListener(new OnScrollListener(){
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState){

    }       

    @Override
    public void onScroll(AbsListView view, 
                         int firstVisibleItem, 
                         int visibleItemCount,
                         int totalItemCount){

        //Note that this is called when the scroll completes. 
        //It gives us the positions we want so just calculate
        //the middle item, grab it and adjust the height directly
        //or by increasing margins if the item layout_height is 
        //wrap_content. I'm not positive the margins do what you
        // need, but setting the height directly should.
        LinearLayout listItem = mList // <-- Replace LinearLayout with your layout
                      .getChildAt(visibleItemCount - ((int)visibleItemCount/2));

        //Make sure you use the right LayoutParams for the listItem Layout
        //If your listItem is a RelativeLayout for instance, you would use:
        // listItem.setLayoutParams(
        //      new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
        //                                      theHeightYouWantHere));
        listItem.setLayoutParams(
                new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
                                              theHeightYouWantHere)); 

        }
});

I've made a few tangentially related blog posts about ListView and ExpandableListView which have full code examples on how to refresh visible items (the example code just changes the text/background color of the item) which uses the childAt strategy. Pardon the personal blog link and the styling of it (it's new and needs more work :), but the code works well.

Edit 2: For android.R.simple_list_item_1

This does exactly what you want as long as you're using a TextView for the item layout (android.R.simple_list_item_1 is a TextView). If you decide to use a ViewGroup layout, you'll need to replace item.setHeight with the LayoutParams method.

mList.setOnScrollListener(new OnScrollListener(){
    @Override
    public void onScrollStateChanged(final AbsListView view, final int scrollState){

    }

    @Override
    public void onScroll(final AbsListView view, 
                         final int firstVisibleItem,
                         final int visibleItemCount,
                         final int totalItemCount){
        if (visibleItemCount != 0){

             Log.i( TAG, "firstVisibleItem: "
                         + firstVisibleItem
                         + "\nvisibleItemCount: "
                         + visibleItemCount);

             final int midPosition = visibleItemCount - (visibleItemCount / 2); 
             final TextView listItem = (TextView) mList.getChildAt(midPosition);
             listItem.setHeight(500); //Only works if you're using
                                      //android.R.simple_list_item_1 since it's
                                      //not a ViewGroup, but rather a TextView

             int count = visibleItemCount;
             while (count >= 0){ // Here we need to loop through and make sure
                                 // all recycled items are returned to their 
                                 // original height. 
                 final TextView item = (TextView) mList.getChildAt(count);
                 if (item != null && count != midPosition){
                     item.setHeight(100);
                 }
                 count--;
              }
        }
    }
});