`
yidongkaifa
  • 浏览: 4052077 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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. publicclassListViewTestActivityextendsActivityimplementsOnItemClickListener{
  2. privateListViewmListView;
  3. privateListAdaptermAdapter;
  4. @Override
  5. publicvoidonCreate(BundlesavedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. mListView=(ListView)findViewById(R.id.list);
  9. mAdapter=newListAdapter(this);
  10. mListView.setAdapter(mAdapter);
  11. mListView.setOnItemClickListener(this);
  12. }
  13. @Override
  14. publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){
  15. mAdapter.changeImageVisable(view,position);
  16. }
  17. }


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

看ListAdapter:

  1. publicclassListAdapterextendsBaseAdapter{
  2. privateContextmContext;
  3. privateViewmLastView;
  4. privateintmLastPosition;
  5. publicListAdapter(Contextcontext){
  6. this.mContext=context;
  7. }
  8. @Override
  9. publicintgetCount(){
  10. return8;
  11. }
  12. @Override
  13. publicObjectgetItem(intposition){
  14. returnnull;
  15. }
  16. @Override
  17. publiclonggetItemId(intposition){
  18. return0;
  19. }
  20. @Override
  21. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  22. Holderholder;
  23. if(convertView==null){
  24. LayoutInflaterinflater=LayoutInflater.from(mContext);
  25. convertView=inflater.inflate(R.layout.list_item,null);
  26. holder=newHolder();
  27. holder.textView=(TextView)convertView.findViewById(R.id.textView);
  28. holder.UEFAView=(ImageView)convertView.findViewById(R.id.image_uefa);
  29. holder.mascotView=(ImageView)convertView.findViewById(R.id.image_mascot);
  30. holder.hint=convertView.findViewById(R.id.hint_image);
  31. convertView.setTag(holder);
  32. }else{
  33. holder=(Holder)convertView.getTag();
  34. }
  35. holder.textView.setText("Hello,Itis"+position);
  36. returnconvertView;
  37. }
  38. classHolder{
  39. TextViewtextView;
  40. ImageViewUEFAView;
  41. ImageViewmascotView;
  42. Viewhint;
  43. }
  44. publicvoidchangeImageVisable(Viewview,intposition){
  45. if(mLastView!=null&&mLastPosition!=position){
  46. Holderholder=(Holder)mLastView.getTag();
  47. switch(holder.hint.getVisibility()){
  48. caseView.VISIBLE:
  49. holder.hint.setVisibility(View.GONE);
  50. break;
  51. default:
  52. break;
  53. }
  54. }
  55. mLastPosition=position;
  56. mLastView=view;
  57. Holderholder=(Holder)view.getTag();
  58. switch(holder.hint.getVisibility()){
  59. caseView.GONE:
  60. holder.hint.setVisibility(View.VISIBLE);
  61. break;
  62. caseView.VISIBLE:
  63. holder.hint.setVisibility(View.GONE);
  64. break;
  65. }
  66. }
  67. }


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

布局文件:

main.xml:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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. <TextView
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="ListViewTest"/>
  10. <ListView
  11. android:id="@+id/list"
  12. android:layout_width="wrap_content"
  13. android:layout_height="fill_parent"
  14. ></ListView>
  15. </LinearLayout>


list_item.xml:

  1. <?xmlversion="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. </LinearLayout>
  36. </LinearLayout>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics