GVKun编程网logo

更新单个ListViewItem的文本时,如何防止ListView中出现闪烁?(listview更新某个item)

22

在本文中,您将会了解到关于更新单个ListViewItem的文本时,如何防止ListView中出现闪烁?的新资讯,同时我们还将为您解释listview更新某个item的相关在本文中,我们将带你探索更新

在本文中,您将会了解到关于更新单个ListViewItem的文本时,如何防止ListView中出现闪烁?的新资讯,同时我们还将为您解释listview更新某个item的相关在本文中,我们将带你探索更新单个ListViewItem的文本时,如何防止ListView中出现闪烁?的奥秘,分析listview更新某个item的特点,并给出一些关于.net – Metro应用程序 – ListView – 如何替换ListViewItems的背景颜色、Android ListView 长度自适应item的内容 计算listview的高度、android – ListView.setFooterView(v)页脚更改不可见在VIewPager显示的ListView中、android – ListView与TextView autoLink没有接收OnItemClickListener的实用技巧。

本文目录一览:

更新单个ListViewItem的文本时,如何防止ListView中出现闪烁?(listview更新某个item)

更新单个ListViewItem的文本时,如何防止ListView中出现闪烁?(listview更新某个item)

我想要的是更新ListViewItem的文本,而不会看到任何闪烁。

这是我的更新代码(多次调用):

listView.BeginUpdate();listViewItem.SubItems[0].Text = state.ToString();    // update the statelistViewItem.SubItems[1].Text = progress.ToString(); // update the progresslistView.EndUpdate();

我看过一些解决方案,其中涉及覆盖组件的 WndProc():

protected override void WndProc(ref Message m){    if (m.Msg == (int)WM.WM_ERASEBKGND)    {        m.Msg = (int)IntPtr.Zero;    }    base.WndProc(ref m);}

他们说这解决了问题,但就我而言,没有 。我相信这是因为我在每个项目上都使用了图标。

答案1

小编典典

要结束这个问题,这里是一个帮助程序类,当为表单中的每个ListView或任何其他ListView的派生控件加载表单时,应调用该类。感谢“ Brian
Gillespie”提供的解决方案。

public enum ListViewExtendedStyles{    /// <summary>    /// LVS_EX_GRIDLINES    /// </summary>    GridLines = 0x00000001,    /// <summary>    /// LVS_EX_SUBITEMIMAGES    /// </summary>    SubItemImages = 0x00000002,    /// <summary>    /// LVS_EX_CHECKBOXES    /// </summary>    CheckBoxes = 0x00000004,    /// <summary>    /// LVS_EX_TRACKSELECT    /// </summary>    TrackSelect = 0x00000008,    /// <summary>    /// LVS_EX_HEADERDRAGDROP    /// </summary>    HeaderDragDrop = 0x00000010,    /// <summary>    /// LVS_EX_FULLROWSELECT    /// </summary>    FullRowSelect = 0x00000020,    /// <summary>    /// LVS_EX_ONECLICKACTIVATE    /// </summary>    OneClickActivate = 0x00000040,    /// <summary>    /// LVS_EX_TWOCLICKACTIVATE    /// </summary>    TwoClickActivate = 0x00000080,    /// <summary>    /// LVS_EX_FLATSB    /// </summary>    FlatsB = 0x00000100,    /// <summary>    /// LVS_EX_REGIONAL    /// </summary>    Regional = 0x00000200,    /// <summary>    /// LVS_EX_INFOTIP    /// </summary>    InfoTip = 0x00000400,    /// <summary>    /// LVS_EX_UNDERLINEHOT    /// </summary>    UnderlineHot = 0x00000800,    /// <summary>    /// LVS_EX_UNDERLINECOLD    /// </summary>    UnderlineCold = 0x00001000,    /// <summary>    /// LVS_EX_MULTIWORKAREAS    /// </summary>    MultilWorkAreas = 0x00002000,    /// <summary>    /// LVS_EX_LABELTIP    /// </summary>    LabelTip = 0x00004000,    /// <summary>    /// LVS_EX_BORDERSELECT    /// </summary>    BorderSelect = 0x00008000,    /// <summary>    /// LVS_EX_DOUBLEBUFFER    /// </summary>    DoubleBuffer = 0x00010000,    /// <summary>    /// LVS_EX_HIDELABELS    /// </summary>    HideLabels = 0x00020000,    /// <summary>    /// LVS_EX_SINGLEROW    /// </summary>    SingleRow = 0x00040000,    /// <summary>    /// LVS_EX_SNAPTOGRID    /// </summary>    SnapToGrid = 0x00080000,    /// <summary>    /// LVS_EX_SIMPLESELECT    /// </summary>    SimpleSelect = 0x00100000}public enum ListViewMessages{    First = 0x1000,    SetExtendedStyle = (First + 54),    GetExtendedStyle = (First + 55),}/// <summary>/// Contains helper methods to change extended styles on ListView, including enabling double buffering./// Based on Giovanni Montrone''s article on <see cref="http://www.codeproject.com/KB/list/listviewxp.aspx"/>/// </summary>public class ListViewHelper{    private ListViewHelper()    {    }    [DllImport("user32.dll", CharSet = CharSet.Auto)]    private static extern int SendMessage(IntPtr handle, int messg, int wparam, int lparam);    public static void SetExtendedStyle(Control control, ListViewExtendedStyles exStyle)    {        ListViewExtendedStyles styles;        styles = (ListViewExtendedStyles)SendMessage(control.Handle, (int)ListViewMessages.GetExtendedStyle, 0, 0);        styles |= exStyle;        SendMessage(control.Handle, (int)ListViewMessages.SetExtendedStyle, 0, (int)styles);    }    public static void EnableDoubleBuffer(Control control)    {        ListViewExtendedStyles styles;        // read current style        styles = (ListViewExtendedStyles)SendMessage(control.Handle, (int)ListViewMessages.GetExtendedStyle, 0, 0);        // enable double buffer and border select        styles |= ListViewExtendedStyles.DoubleBuffer | ListViewExtendedStyles.BorderSelect;        // write new style        SendMessage(control.Handle, (int)ListViewMessages.SetExtendedStyle, 0, (int)styles);    }    public static void DisableDoubleBuffer(Control control)    {        ListViewExtendedStyles styles;        // read current style        styles = (ListViewExtendedStyles)SendMessage(control.Handle, (int)ListViewMessages.GetExtendedStyle, 0, 0);        // disable double buffer and border select        styles -= styles & ListViewExtendedStyles.DoubleBuffer;        styles -= styles & ListViewExtendedStyles.BorderSelect;        // write new style        SendMessage(control.Handle, (int)ListViewMessages.SetExtendedStyle, 0, (int)styles);    }}

.net – Metro应用程序 – ListView – 如何替换ListViewItems的背景颜色

.net – Metro应用程序 – ListView – 如何替换ListViewItems的背景颜色

在我的Windows 8 Metro风格应用程序中,我将Listview绑定到ObservableCollection,我希望每个ListViewItem的背景颜色交替(白色,灰色,白色等)
<ListView x:Name="stopsListView" ItemsSource="{Binding}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Height="66" >
                    <TextBlock Text="{Binding Title}" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>

在WPF中,这是使用带触发器的样式完成的 – 请参阅this page.

你如何在Metro应用程序中实现这一目标?

更新:

在下面给出了正确的答案后,我离开并实际编码了它.以下是需要它的人的一些代码:

值转换器类代码:

public class AltBackgroundConverter : IValueConverter
{
    public object Convert(object value,Type targettype,object parameter,string language)
    {
        if (!(value is int)) return null;
        int index = (int)value;

        if (index % 2 == 0)
            return Colors.White;
        else
            return Colors.LightGray;
    }

    // No need to implement converting back on a one-way binding
    public object ConvertBack(object value,string language)
    {
        throw new NotImplementedException();
    }
}

XAML列表视图的代码:



<ListView x:Name="stopsListView" ItemsSource="{Binding}">

        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Width="250" Height="66" Margin="5">
                    <Grid.Background>
                        <SolidColorBrush Color="{Binding IndexWithinParentCollection,Mode=OneWay,Converter={StaticResource AltBGConverter}}" />
                    </Grid.Background>

…并且,在向集合中添加项目或修改集合时,请记住在集合中设置其索引:

myCollection.add(item);
item.IndexWithinParentCollection = myCollection.Count;

当然,如果您的集合经常更改,这种方法维护成本很高,因为您必须重新索引您的项目,因此我发现在每个项目中存储对父集合的引用更容易,然后计算索引使用.IndexOf()飞行以避免每次集合更改时不断更新索引值.

您可以使用转换器 – 从项目中获取行索引并将其转换为画笔.另外 – 如果ItemTemplate没有给你足够的控制 – 使用ItemContainerStyle修改ListViewItem模板级别的画笔.

另一个选项可能是指定一个ItemTemplateSelector,它根据项目为您提供具有不同画笔的不同模板.您仍然需要生成行索引,或者以某种方式启用选择器以确定项目是处于偶数位置还是奇数位置.

Android ListView 长度自适应item的内容 计算listview的高度

Android ListView 长度自适应item的内容 计算listview的高度

Android 原生的ListView的长度是不会根据里面内容项的多少而改变你之前定义的长度的(wrap_content或者是fill_parent)

但是有些时候就想, 我里面有一个Item, 它就显示一个item.   但是如果里面有2个Item, List的长度就增加一倍, 显示两个, OK这篇博文就是要说明一下如何实现, 之所以写, 是为了记录一下, 难免自己以后就忘记了.

OK, 首先,自己定义一个LIstView, 继承字ListView

package com.abc.pet.common.view;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
/**
 * 计算listview的高度加载到scrollview中
 * 
 */
public class MyDetailsListView extends ListView
{
 public MyDetailsListView(Context context)
 {
  super(context);
 }
 public MyDetailsListView(Context context, AttributeSet attrs)
 {
  super(context, attrs);
 }
 public MyDetailsListView(Context context, AttributeSet attrs, int defStyle)
 {
  super(context, attrs, defStyle);
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
 {
  // TODO Auto-generated method stub
  int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    MeasureSpec.AT_MOST);
  super.onMeasure(widthMeasureSpec, expandSpec);
 }
}

OK, 这样就可以在XML中用这个自定义的LIstView了, 来替换掉系统的LIstView

 <LinearLayout 
                android:orientation="vertical" 
                android:id="@+id/layout_added_pet_profile" 
                android:background="@drawable/layout_white_background" 
                android:layout_width="fill_parent" 
                android:layout_height="match_parent" 
                android:layout_marginTop="5.0dip">
               
                <com.abc.pet.common.view.MyDetailsListView
                 android:id="@+id/added_pet_list"
                 android:layout_width="fill_parent"
                 android:layout_height="wrap_content"
                 android:scrollbars="none"
                 android:layout_marginLeft="5dip"
                 android:layout_marginRight="5dip"
                 />
            </LinearLayout>

OK, 虽然我们的ListView是wrap_content, 但是它已经可以根据里面内容的多少, 自己计算ListView的高度了,来适应scrollview.

如何添加项目到ListView中呢, 就要用到adapter了, 接下来定义一个adapter.

public class AddedPetProfileItemAdapter extends BaseAdapter
{
 private Context mContext;
 private List<String> list;
 public AddedPetProfileItemAdapter()
 {
 }
 public AddedPetProfileItemAdapter(Context context, List<String> list)
 {
  this.mContext = context;
  this.list = list;
 }
 @Override
 public int getCount()
 {
  // TODO Auto-generated method stub
  return list.size();
 }
 @Override
 public Object getItem(int position)
 {
  // TODO Auto-generated method stub
  return position;
 }
 @Override
 public long getItemId(int position)
 {
  // TODO Auto-generated method stub
  return position;
 }
 @SuppressLint("NewApi")
 @Override
 public View getView(int position, View view, ViewGroup parent)
 {
  // TODO Auto-generated method stub
  final Holder hold;
  if (view == null)
  {
   hold = new Holder();
   view = View.inflate(mContext, R.layout.list_added_pet_profile_item,
     null);
   hold.added_pet_avatar = (ImageView) view
     .findViewById(R.id.added_pet_avatar);
     .
    .//等等一下东西
   .
   view.setTag(hold);
  }
  else
  {
   hold = (Holder) view.getTag();
  }
  //这里去设置hold里面的项目
  return view;
 }
 static class Holder
 {
  ImageView added_pet_avatar;// 添加了的宠物的照片
  EmojiconTextView added_pet_name;// 添加了的宠物的名字
  LinearLayout layoutadded_pet_gender_species;// 添加了的宠物的性别的背景
  ImageView added_pet_gender;// 性别图片
  TextView added_pet_species;// 种类名字
  TextView added_pet_age;// 年龄
  RelativeLayout layout_added_pet_profile;
 }
}

然后activity中去调用这个adapter 就可以了

AddedPetProfileItemAdapter addedPetAdapter = new AddedPetProfileItemAdapter(mContext, petPiclist);
MyDetailsListView added_pet_listView = (MyDetailsListView)findViewById(R.id.added_pet_list);
  added_pet_listView.setAdapter(addedPetAdapter);

OK, 这里就完了,

文章写的很急, 很烂, 希望看的童鞋们谅解, 主要也是用来记录的, 以后看到直接就拿来用了,  见谅.....

android – ListView.setFooterView(v)页脚更改不可见在VIewPager显示的ListView中

android – ListView.setFooterView(v)页脚更改不可见在VIewPager显示的ListView中

我打电话

listView.setFooterView(v)

但没有看到任何变化.现在我应该补充一点,listView位于一个添加到ViewPager中的视图(不是一个框架)中.

因此,包含listView的View位于视图分页器内.如果我在视图之间来回切换,那么我会看到更改,但不是.到目前为止,我已经尝试使包括整个ViewPager在内的大多数内容无效,但仍然没有显示.

内部活动布局我有:

 <android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_weight="1"
/>

然后我有三个页面,每个看起来像这样:

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/listListdisplayer1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
    android:id="@+id/listMyList1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="#00000000"
    android:fastScrollEnabled="true" />

<include layout="@layout/advertisement" />

</FrameLayout>

所以我有上面的观点,并立即在主要活动的onCreate()中创建它们.

 MyPageAdapter extends ViewPagerAdapter{

      int getCount() {
           return 3;
      }

       public Object instantiateItem(View collection, int position) {

        View view=null;

        switch (position) {
            case 0:
                view = getMyView1();
                break;
            case 1:
                view = getMyView2();
                break;
            case 2:
                view = getMyView2();
                break;
        }

        if ((view != null) && ((ViewPager) collection).findViewById(view.getId()) == null)
        {

          ((ViewPager) collection).addView(view, 0);
        }

        return view;
    }


    private View getMyView1()
    {   
        return mMyView1;
    }


    private View getMyView2()
    {
        return  mMyView2;
    }



    private View getMyView3()
    {
        return mMyView3;
    }


    @Override
    public void destroyItem(View view, int arg1, Object arg2) {
        ((ViewPager) view).removeView((View) arg2);

    }

    @Override
    public void finishUpdate(View view) {


    }

    @Override
    public boolean isViewFromObject(View view, Object arg1) {
        return view == ((View) arg1);

    }

    @Override
    public void restoreState(Parcelable parcel, ClassLoader classLoader) {
    }

    @Override
    public Parcelable saveState() {

        return null;
    }

    @Override
    public void startUpdate(View view) {


    }


}

我会更新几行……

     private class Pagechangelistener implements OnPagechangelistener {

    @Override
    public void onPageScrollStateChanged(int scrollState) {
        // Todo Auto-generated method stub

    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // Todo Auto-generated method stub

    }

    @Override
    public void onPageSelected(int pageNum) {
        logout.debug("pageSelected :"+pageNum); 
        if (pageNum == 0)
        {
            prepareMyView1();
        }
        else if (pageNum == 2)
        {
           prepareMyView2();
        }
        else if (pageNum == 3)
        {
            prepareMyView3();
        }
    }

}

    private void prepareMyView1()   // each is like this setting adapter on ListView
{   
    setMyList1Adapter();
}

     private void prepareMyView2()   // each is like this setting adapter on ListView
{   
    setMyList2Adapter();
}

所以我想要改变addFooterView的影响立即可见.

解决方法:

解决方法是首先添加页脚视图,然后设置适配器.如果首先设置适配器然后添加页脚视图,它现在会显示.但是,可以在不重置适配器的情况下使用removeFooterView(v).

android – ListView与TextView autoLink没有接收OnItemClickListener

android – ListView与TextView autoLink没有接收OnItemClickListener

我的PostFragment. java实现了AbsListView.OnItemClickListener,我得到了
onItemClick事件在每个项目上都没有问题,除非TextView上有一个链接:lblListItem.
可以毫无问题地单击TextView上的链接并打开网站,但无法单击列表的背景,因此永远不会调用onItemClick.

链接字符串示例:http://www.google.com

我在list_item.xml上有这个TextView:

<TextView
        android:id="@+id/lblListItem"android:text="Text."
        android:layout_below="@+id/imgUser"
        android:layout_marginBottom="@dimen/margin_small"
        android:autoLink="all"
        android:linksClickable="true"
        />

我认为这是相关的,在我的适配器上我有一些收到的项目:

view.setonClickListener()...

如何在点击网站链接的同时使列表项可以点击?

解决方法

尝试将android:descendantFocusability =“blocksDescendants”添加到行布局的根视图中.我已经做了一些测试,它似乎工作.

关于更新单个ListViewItem的文本时,如何防止ListView中出现闪烁?listview更新某个item的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.net – Metro应用程序 – ListView – 如何替换ListViewItems的背景颜色、Android ListView 长度自适应item的内容 计算listview的高度、android – ListView.setFooterView(v)页脚更改不可见在VIewPager显示的ListView中、android – ListView与TextView autoLink没有接收OnItemClickListener的相关知识,请在本站寻找。

本文标签: