android listView 根据字母排序和定位 (http://www.apkbus.com/android-69999-1-1.html)

第一步是实现字母的a-z的控件的显示:
import
android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;
 
public class SideBar extends View {
     private char [] l;
     private SectionIndexer sectionIndexter = null ;
     private ListView list;
     private TextView mDialogText;
     Bitmap mbitmap;
     private int type = 1 ;
     private int color = 0xff858c94 ;
 
     public SideBar(Context context) {
         super (context);
         init();
     }
 
     public SideBar(Context context, AttributeSet attrs) {
         super (context, attrs);
         init();
     }
 
     private void init() {
 
         l = new char [] { '!' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' ,
          'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' ,
           'W' , 'X' , 'Y' , 'Z' , '#' };
         mbitmap = BitmapFactory.decodeResource(getResources(),
                 R.drawable.scroll_bar_search_icon);
     }
 
     public SideBar(Context context, AttributeSet attrs, int defStyle) {
         super (context, attrs, defStyle);
         init();
     }
 
 
     public void setListView(ListView _list) {
         list = _list;
         HeaderViewListAdapter ha = (HeaderViewListAdapter) _list
                 .getAdapter();
         MyAdapter ad = (MyAdapter)ha.getWrappedAdapter();
         sectionIndexter = (SectionIndexer) ad;
         
     }
 
     public void setTextView(TextView mDialogText) {
         this .mDialogText = mDialogText;
     }
 
     public boolean onTouchEvent(MotionEvent event) {
 
         super .onTouchEvent(event);
         int i = ( int ) event.getY();
 
         int idx = i / (getMeasuredHeight() / l.length);
         if (idx >= l.length) {
             idx = l.length - 1 ;
         } else if (idx < 0 ) {
             idx = 0 ;
         }
         if (event.getAction() == MotionEvent.ACTION_DOWN
                 || event.getAction() == MotionEvent.ACTION_MOVE) {
             setBackgroundResource(R.drawable.scrollbar_bg);
             mDialogText.setVisibility(View.VISIBLE);
             if (idx == 0 ) {
                 mDialogText.setText( "Search" );
                 mDialogText.setTextSize( 16 );
             } else {
                 mDialogText.setText(String.valueOf(l[idx]));
                 mDialogText.setTextSize( 34 );
             }
             if (sectionIndexter == null ) {
 
             
 
                 sectionIndexter = (SectionIndexer) list.getAdapter();
                 
             }
             int position = sectionIndexter.getPositionForSection(l[idx]);
 
             if (position == - 1 ) {
                 return true ;
             }
             list.setSelection(position);
         } else {
             mDialogText.setVisibility(View.INVISIBLE);
 
         }
         if (event.getAction() == MotionEvent.ACTION_UP) {
             setBackgroundDrawable( new ColorDrawable( 0x00000000 ));
         }
         return true ;
     }
 
     protected void onDraw(Canvas canvas) {
         Paint paint = new Paint();
         paint.setColor(color);
         paint.setTextSize( 12 );
         paint.setStyle(Style.FILL);    
         paint.setTextAlign(Paint.Align.CENTER);
         float widthCenter = getMeasuredWidth() / 2 ;
         if (l.length > 0 ) {
             float height = getMeasuredHeight() / l.length;
             for ( int i = 0 ; i < l.length; i++) {
                 if (i == 0 && type != 2 ) {
                     canvas.drawBitmap(mbitmap, widthCenter - 7 , (i + 1 )
                             * height - height / 2 , paint);
                 } else
                     canvas.drawText(String.valueOf(l[i]), widthCenter,
                             (i + 1 ) * height, paint);
             }
         }
         this .invalidate();
         super .onDraw(canvas);
     }
}

第二步:设计XML
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:divider="@null" />
 
    <com.example.listsildedel.SideBar
        android:id="@+id/sideBar"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_gravity="right|center_vertical" />
 
</FrameLayout>

第三步:继承BaseAdapter并实现SectionIndexer接口,并且Item是通过当字母重复的时候进行隐藏 ,不重复时显示。
import java.util.List;
 
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;
 
public class MyAdapter extends BaseAdapter implements SectionIndexer{
 
     private List<Content> list = null ;
     private Context mContext;
     private SectionIndexer mIndexer;
     
     public MyAdapter(Context mContext, List<Content> list) {
         this .mContext = mContext;
         this .list = list;
 
     }
 
     public int getCount() {
         return this .list.size();
     }
 
     public Object getItem( int position) {
         return null ;
     }
 
     public long getItemId( int position) {
         return position;
     }
 
     public View getView( final int position, View view, ViewGroup arg2) {
         ViewHolder viewHolder = null ;
         if (view == null ) {
             viewHolder = new ViewHolder();
             view = LayoutInflater.from(mContext).inflate(R.layout.item, null );
             viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
             viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
             view.setTag(viewHolder);
         } else {
             viewHolder = (ViewHolder) view.getTag();
         }
         final Content mContent = list.get(position);
         if (position == 0 ) {
             viewHolder.tvLetter.setVisibility(View.VISIBLE);
             viewHolder.tvLetter.setText(mContent.getLetter());
         } else {
             String lastCatalog = list.get(position - 1 ).getLetter();
             if (mContent.getLetter().equals(lastCatalog)) {
                 viewHolder.tvLetter.setVisibility(View.GONE);
             } else {
                 viewHolder.tvLetter.setVisibility(View.VISIBLE);
                 viewHolder.tvLetter.setText(mContent.getLetter());
             }
         }
     
         viewHolder.tvTitle.setText( this .list.get(position).getName());
         
         return view;
 
     }
     
 
 
     final static class ViewHolder {
         TextView tvTitle;
         TextView tvLetter;
     }
 
 
     public Object[] getSections() {
         // TODO Auto-generated method stub
         return null ;
     }
 
     public int getSectionForPosition( int position) {
         
         return 0 ;
     }
 
     public int getPositionForSection( int section) {
         Content mContent;
         String l;
         if (section == '!' ) {
             return 0 ;
         } else {
             for ( int i = 0 ; i < getCount(); i++) {
                 mContent = (Content) list.get(i);
                 l = mContent.getLetter();
                 char firstChar = l.toUpperCase().charAt( 0 );
                 if (firstChar == section) {
                     return i + 1 ;
                 }
 
             }
         }
         mContent = null ;
         l = null ;
         return - 1 ;
     }
}

第四步: activity的实现:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
     private ListView mListView;
     private SideBar indexBar;
     private WindowManager mWindowManager;
     private TextView mDialogText;
     private View head;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
          //启动activity时不自动弹出软键盘
         getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         mListView = (ListView) this .findViewById(R.id.list);
         indexBar = (SideBar) findViewById(R.id.sideBar);
         mDialogText = (TextView) LayoutInflater.from( this ).inflate(R.layout.list_position, null );
         head = LayoutInflater.from( this ).inflate(R.layout.head, null );
         mListView.addHeaderView(head);
         mDialogText.setVisibility(View.INVISIBLE);
         mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
         WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                 WindowManager.LayoutParams.TYPE_APPLICATION,
                 WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                         | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                 PixelFormat.TRANSLUCENT);
         mWindowManager.addView(mDialogText, lp);
         indexBar.setTextView(mDialogText);
         //初始化数据
         List<Content> list = new ArrayList<Content>();
         for ( int i = 0 ; i < 10 ; i++) {
             Content m;
             if (i < 3 )
                 m = new Content( "A" , "选项" + i);
             else if (i < 6 )
                 m = new Content( "F" , "选项" + i);
             else
                 m = new Content( "D" , "选项" + i);
             list.add(m);
         }
         //根据a-z进行排序
         Collections.sort(list, new PinyinComparator());
         // 实例化自定义内容适配类     
         MyAdapter adapter = new MyAdapter( this , list);
         // 为listView设置适配
         mListView.setAdapter(adapter);
         //设置SideBar的ListView内容实现点击a-z中任意一个进行定位
         indexBar.setListView(mListView);       
     }
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# -*- coding: UTF-8 -*- from lib2to3.pgen2 import driver from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="通讯录") el1.click() el2 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.FrameLayout[3]/android.widget.RelativeLayout") el2.click() el3 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[1]/android.widget.TextView") el3.click() el4 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[8]") el4.click() el5 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[11]") el5.click()
06-08
根据你提供的代码,看起来你使用了 `lib2to3.pgen2.driver` 模块中的 `find_element` 方法。但是,`lib2to3.pgen2.driver` 模块实际上并没有这个方法,所以出现了 `AttributeError`。 我猜测你可能是想使用 Appium 的 `driver.find_element` 方法。如果是这样的话,你需要更改你的代码来正确导入 `appium.webdriver` 模块并使用它的 `driver` 属性。具体的修改如下: ```python # -*- coding: UTF-8 -*- from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy # 创建 Appium driver desired_caps = {} desired_caps['platformName'] = 'Android' # 添加其他的 desired capabilities 选项... driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 执行测试操作 el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="通讯录") el1.click() el2 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.FrameLayout[3]/android.widget.RelativeLayout") el2.click() el3 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[1]/android.widget.TextView") el3.click() el4 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[8]") el4.click() el5 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[11]") el5.click() # 关闭 driver driver.quit() ``` 注意,这里我使用了 `appium.webdriver` 模块的 `webdriver.Remote` 方法来创建 driver,然后使用 `driver.find_element` 方法来查找元素。最后,在测试结束后,我也关闭了 driver。你需要根据你的具体情况修改代码中的 `desired_caps` 和元素定位方式等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值