现在的位置: 首页 > 综合 > 正文

android gridview 滑动后选项错误处理的两种方法

2013年04月20日 ⁄ 综合 ⁄ 共 8223字 ⁄ 字号 评论关闭

1.先上main布局(main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
  
<GridView android:layout_width="wrap_content"
    android:layout_height="150dip"
    android:id="@+id/gridview"
        android:gravity="center_horizontal"
        android:horizontalSpacing="5px"
   
    />
</LinearLayout>

2.组成Gridview的子布局(gridview.xml)

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

 <TextView
  android:id="@+id/gridtext"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
</LinearLayout>

3.具体实现代码

public class OtherActivity extends Activity {
 private String str = "A15B3456183CS";
 private GridView gv;
 private TextView textview;
 private GridAdapter adapter;
 int result;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  gv = (GridView) findViewById(R.id.gridview);
  adapter=new GridAdapter();
  gv.setAdapter(adapter);
  gv.setNumColumns(str.length());
 }

 private class GridAdapter extends BaseAdapter {

  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   return str.length();
  }

  @Override
  public Object getItem(int pos) {
   // TODO Auto-generated method stub
   return pos;
  }

  @Override
  public long getItemId(int pos) {
   // TODO Auto-generated method stub
   return pos;
  }

  Object tvPos;

  @Override
  public View getView(int pos, View convertView, ViewGroup arg2) {
   if (convertView == null) {// 第一屏
    convertView = LayoutInflater.from(OtherActivity.this).inflate(
      R.layout.gridview_child, null);
   }
   LinearLayout linear = (LinearLayout) convertView
     .findViewById(R.id.linear);
   textview = (TextView) convertView
     .findViewById(R.id.gridtext);
   textview.setText(str.charAt(pos) + "");
   linear.setOnClickListener(new OnClick(pos, textview));
   // 以position标记
   linear.setTag(pos);
   return convertView;
  }

  class OnClick implements OnClickListener {
   public int pos;
   private TextView tview;

   public OnClick(int pos, TextView tview) {
    this.pos = pos;
    this.tview = tview;
   }

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    if (tvPos != null) {
     LinearLayout tv = (LinearLayout) gv.findViewWithTag(tvPos);
     TextView tt = (TextView) tv.getChildAt(0);// 从Layout中获得子view
     tt.setTextColor(Color.WHITE);
    }
    tview.setTextColor(Color.RED);
    tvPos = pos;
   }
  }

 }

}

 

 

 

 

另一种方法:

 

在Android应用开发中,很多时候都会遇到这样的需求,一个listView,含有N项,当点击某项时,该项展开,显示该项中隐藏的某些控件,再点击,该项收回,重新隐藏部分控件,当一项打开状态,点击另一项,另一项展开,该项关闭。(说的有点绕,看下图) 

        在去年的时候,自己的一篇文章http://blog.csdn.net/aomandeshangxiao/article/details/6643831),里面有Item的选择问题,用的方法比较笨,要遍历一遍,把所有的item全部都设置一下,应该是很浪费资源的。还有一个问题就是,当listview的item多于一个屏幕的时候,会出现重复选择问题,就是当你选中一项滑动的时候,可能会发现滑动后出现的某项也是在选中状态,这个问题令人十分抓狂。见网上有个方法是:在adapter的getView里面不使用convertview。每一个view都是重新创建一个。能够解决问题,但是还是有点浪费资源。

        

        先看下效果图:第二项被选中


第四项被选中:



        这个方法也是在他人的帮助下,努力得来,分享一下!

  1. public class ListViewTestActivity extends Activity implements OnItemClickListener{  
  2.     private ListView mListView;  
  3.     private ListAdapter mAdapter;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.           
  9.         mListView = (ListView)findViewById(R.id.list);  
  10.         mAdapter = new  ListAdapter(this);  
  11.         mListView.setAdapter(mAdapter);  
  12.         mListView.setOnItemClickListener(this);  
  13.     }  
  14.       
  15.     @Override  
  16.     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  17.         mAdapter.changeImageVisable(view, position);  
  18.     }  
  19. }  

        这里应该注意到与平常的不同,onItemClick方法里面调用了自定义ListAdapter里面的自定义changeImageViewVisable方法。

看ListAdapter:

  1. public class ListAdapter extends BaseAdapter {  
  2.     private Context mContext;  
  3.     private View mLastView;  
  4.     private int mLastPosition;  
  5.       
  6.     public ListAdapter(Context context) {  
  7.         this.mContext = context;  
  8.     }  
  9.   
  10.     @Override  
  11.     public int getCount() {  
  12.         return 8;  
  13.     }  
  14.   
  15.     @Override  
  16.     public Object getItem(int position) {  
  17.         return null;  
  18.     }  
  19.   
  20.     @Override  
  21.     public long getItemId(int position) {  
  22.         return 0;  
  23.     }  
  24.   
  25.     @Override  
  26.     public View getView(int position, View convertView, ViewGroup parent) {  
  27.         Holder holder;  
  28.         if(convertView == null ) {  
  29.             LayoutInflater inflater = LayoutInflater.from(mContext);  
  30.             convertView = inflater.inflate(R.layout.list_item, null);  
  31.             holder =new Holder();  
  32.             holder.textView = (TextView)convertView.findViewById(R.id.textView);  
  33.             holder.UEFAView = (ImageView)convertView.findViewById(R.id.image_uefa);  
  34.             holder.mascotView = (ImageView)convertView.findViewById(R.id.image_mascot);  
  35.             holder.hint = convertView.findViewById(R.id.hint_image);  
  36.             convertView.setTag(holder);  
  37.         } else {  
  38.             holder = (Holder) convertView.getTag();  
  39.         }  
  40.         holder.textView.setText("Hello,It is " + position);  
  41.         return convertView;  
  42.     }  
  43.       
  44.     class Holder {  
  45.         TextView textView;  
  46.         ImageView UEFAView;  
  47.         ImageView mascotView;  
  48.         View hint;  
  49.     }  
  50.       
  51.     public void changeImageVisable(View view,int position) {  
  52.         if(mLastView != null && mLastPosition != position ) {  
  53.             Holder holder = (Holder) mLastView.getTag();  
  54.             switch(holder.hint.getVisibility()) {  
  55.             case View.VISIBLE:  
  56.                 holder.hint.setVisibility(View.GONE);  
  57.                 break;  
  58.             default :  
  59.                 break;  
  60.             }  
  61.         }  
  62.         mLastPosition = position;  
  63.         mLastView = view;  
  64.         Holder holder = (Holder) view.getTag();  
  65.         switch(holder.hint.getVisibility()) {  
  66.         case View.GONE:  
  67.             holder.hint.setVisibility(View.VISIBLE);  
  68.             break;  
  69.         case View.VISIBLE:  
  70.             holder.hint.setVisibility(View.GONE);  
  71.             break;  
  72.         }  
  73.     }  
  74.   
  75. }  

          代码的最下端是changeImageVisable方法。(注意:在这个方法中,博客代码版本和提供下载代码版本中有细微差异,博客代码较下载代码性能更优,这也体现了Holder类的优越性,一定要好好用好Holder,应好好思考下,为什么这样写性能就更好些呢?欢迎留言讨论)。

        布局文件:

main.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="ListView Test" />  
  11.     <ListView   
  12.         android:id="@+id/list"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="fill_parent"  
  15.         ></ListView>  
  16.   
  17. </LinearLayout>  

list_item.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="wrap_content"  
  6.     android:orientation="vertical"  
  7.     >  
  8.     <TextView   
  9.         android:id="@+id/textView"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="Test"  
  13.         android:textSize="20sp"  
  14.         />  
  15.     <LinearLayout  
  16.         android:id="@+id/hint_image"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:orientation="horizontal"  
  20.         android:visibility="gone">  
  21.         <ImageView   
  22.             android:id="@+id/image_uefa"  
  23.             android:layout_width="0dp"  
  24.             android:layout_height="60dp"  
  25.             android:layout_weight="1"  
  26.             android:src="@drawable/uefa"  
  27.             />  
  28.         <ImageView   
  29.             android:id="@+id/image_mascot"  
  30.             android:layout_width="0dp"  
  31.             android:layout_height="60dp"  
  32.             android:layout_weight="1"  
  33.             android:src="@drawable/mascot"  
  34.             />  
  35.           
  36.     </LinearLayout>  
  37.       
  38. </LinearLayout>  

 

抱歉!评论已关闭.