gpt4 book ai didi

android - 如何使用 fastscroll 和 albhabet 索引器实现 ListView

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:34 24 4
gpt4 key购买 nike

请帮助我在这 2 天里感到震惊。我想在联系人应用程序/下图中实现一个带有 fastscroll 和 albhabet 索引器的 ListView。我正在使用 SimpleAdapter 来填充 ListView。从图中可以看出,通过从右侧的字母表索引器中选择一个字母,listView 选择会转到相应的 ListItem。请分享一些例子。提前谢谢你。EX:下面是我的代码,它只是对字母表进行排序,当我点击与 E 相关的 E 字母表数据是 gng 到 diaplay ..但是当我触摸字母表时它没有在中间显示 E 文本框。

enter image description here

如何在中间显示 E 文本框..当我触摸 fastscroll 中间文本框时必须显示。

主 Activity .java

   public class MainActivity extends Activity implements SearchView.OnQueryTextListener,SearchView.OnCloseListener {

private ListView listView;
private SearchView search;
EfficientAdapter objectAdapter;
EfficientAdapter2 objectAdapter1;
int textlength=0;
private CheckBox checkStat, checkRoutine, checkTat;
private GestureDetector mGestureDetector;

// x and y coordinates within our side index
private static float sideIndexX;
private static float sideIndexY;

// height of side index
private int sideIndexHeight;

// number of items in the side index
private int indexListSize;

// list with items for side index
private ArrayList<Object[]> indexList = null;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.homempleb);
Log.i("scan"," txtScanResult ");

Arrays.sort(CountriesList.name);
ActionItem nextItem = new ActionItem();
final QuickAction quickAction = new QuickAction(this, QuickAction.VERTICAL);
quickAction.addActionItem(nextItem);
quickAction.setOnDismissListener(new QuickAction.OnDismissListener() {
@Override
public void onDismiss() {
Toast.makeText(getApplicationContext(), "Dismissed", Toast.LENGTH_SHORT).show();
}
});


listView = (ListView) findViewById(R.id.homelistView);
listView.setTextFilterEnabled(true);
objectAdapter = new EfficientAdapter(this);
mGestureDetector = new GestureDetector(this, new SideIndexGestureListener());
listView.setAdapter(objectAdapter);


}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (mGestureDetector.onTouchEvent(event))
{
return true;
} else
{
return false;
}
}

private ArrayList<Object[]> createIndex(String[] strArr)
{
ArrayList<Object[]> tmpIndexList = new ArrayList<Object[]>();
Object[] tmpIndexItem = null;

int tmpPos = 0;
String tmpLetter = "";
String currentLetter = null;
String strItem = null;

for (int j = 0; j < strArr.length; j++)
{
strItem = strArr[j];
currentLetter = strItem.substring(0, 1);

// every time new letters comes
// save it to index list
if (!currentLetter.equals(tmpLetter))
{
tmpIndexItem = new Object[3];
tmpIndexItem[0] = tmpLetter;
tmpIndexItem[1] = tmpPos - 1;
tmpIndexItem[2] = j - 1;

tmpLetter = currentLetter;
tmpPos = j + 1;

tmpIndexList.add(tmpIndexItem);
}
}

// save also last letter
tmpIndexItem = new Object[3];
tmpIndexItem[0] = tmpLetter;
tmpIndexItem[1] = tmpPos - 1;
tmpIndexItem[2] = strArr.length - 1;
tmpIndexList.add(tmpIndexItem);

// and remove first temporary empty entry
if (tmpIndexList != null && tmpIndexList.size() > 0)
{
tmpIndexList.remove(0);
}

return tmpIndexList;
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);

final ListView listView = (ListView) findViewById(R.id.homelistView);
LinearLayout sideIndex = (LinearLayout) findViewById(R.id.sideIndex);
sideIndexHeight = sideIndex.getHeight();
sideIndex.removeAllViews();

// TextView for every visible item
TextView tmpTV = null;

// we'll create the index list
indexList = createIndex(CountriesList.name);

// number of items in the index List
indexListSize = indexList.size();

// maximal number of item, which could be displayed
int indexMaxSize = (int) Math.floor(sideIndex.getHeight() / 20);

int tmpIndexListSize = indexListSize;

// handling that case when indexListSize > indexMaxSize
while (tmpIndexListSize > indexMaxSize)
{
tmpIndexListSize = tmpIndexListSize / 2;
}

// computing delta (only a part of items will be displayed to save a
// place)
double delta = indexListSize / tmpIndexListSize;

String tmpLetter = null;
Object[] tmpIndexItem = null;

// show every m-th letter
for (double i = 1; i <= indexListSize; i = i + delta)
{
tmpIndexItem = indexList.get((int) i - 1);
tmpLetter = tmpIndexItem[0].toString();
tmpTV = new TextView(this);
tmpTV.setText(tmpLetter);
tmpTV.setGravity(Gravity.CENTER);
tmpTV.setTextSize(20);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1);
tmpTV.setLayoutParams(params);
sideIndex.addView(tmpTV);
}

// and set a touch listener for it
sideIndex.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
// now you know coordinates of touch
sideIndexX = event.getX();
sideIndexY = event.getY();

// and can display a proper item it country list
displayListItem();

return false;
}
});
}

class SideIndexGestureListener extends
GestureDetector.SimpleOnGestureListener
{
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY)
{
// we know already coordinates of first touch
// we know as well a scroll distance
sideIndexX = sideIndexX - distanceX;
sideIndexY = sideIndexY - distanceY;

// when the user scrolls within our side index
// we can show for every position in it a proper
// item in the country list
if (sideIndexX >= 0 && sideIndexY >= 0)
{
displayListItem();
}

return super.onScroll(e1, e2, distanceX, distanceY);
}
}

public void displayListItem()
{
// compute number of pixels for every side index item
double pixelPerIndexItem = (double) sideIndexHeight / indexListSize;

// compute the item index for given event position belongs to
int itemPosition = (int) (sideIndexY / pixelPerIndexItem);

// compute minimal position for the item in the list
int minPosition = (int) (itemPosition * pixelPerIndexItem);

// get the item (we can do it since we know item index)
Object[] indexItem = indexList.get(itemPosition);

// and compute the proper item in the country list
int indexMin = Integer.parseInt(indexItem[1].toString());
int indexMax = Integer.parseInt(indexItem[2].toString());
int indexDelta = Math.max(1, indexMax - indexMin);

double pixelPerSubitem = pixelPerIndexItem / indexDelta;
int subitemPosition = (int) (indexMin + (sideIndexY - minPosition) / pixelPerSubitem);

ListView listView = (ListView) findViewById(R.id.homelistView);
listView.setSelection(subitemPosition);
}

EfficientAdapter.java

 public class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private Context context;

public EfficientAdapter(Context context) {
mInflater = LayoutInflater.from(context);
this.context=context;

}


public int getCount() {
return CountriesList.name.length;
}

public Object getItem(int position) {

return position;
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.homemplebrowview, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView
.findViewById(R.id.name);
holder.text2 = (TextView) convertView
.findViewById(R.id.mrn);
holder.text3 = (TextView) convertView
.findViewById(R.id.date);
holder.text4 = (TextView) convertView
.findViewById(R.id.age);
holder.text5 = (TextView) convertView
.findViewById(R.id.gender);
holder.text6 = (TextView) convertView
.findViewById(R.id.wardno);
holder.text7 = (TextView) convertView
.findViewById(R.id.roomno);
holder.text8 = (TextView) convertView
.findViewById(R.id.bedno);
holder.btnList = (Button)convertView.findViewById(R.id.listbutton);
// holder.btnList.setOnClickListener(this);

holder.btnList.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent next=new Intent(context, SeviceDetails.class);
context.startActivity(next);
}
});


convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.text1.setText(CountriesList.name[position]);
holder.text2.setText(CountriesList.mrn[position]);
holder.text3.setText(CountriesList.actualstart[position]);
holder.text4.setText(CountriesList.age[position]);
holder.text5.setText(CountriesList.gender[position]);
holder.text6.setText(CountriesList.wardNo[position]);
holder.text7.setText(CountriesList.roomNo[position]);
holder.text8.setText(CountriesList.bedNo[position]);

return convertView;
}
static class ViewHolder {
public Button btnList;
public TextView text8;
public TextView text7;
public TextView text6;
public TextView text5;
public TextView text4;
public TextView text1;
public TextView text2;
public TextView text3;
}

@Override
public void notifyDataSetChanged()
{
super.notifyDataSetChanged();
}


}

最佳答案

这是ListView中字母表索引的简单代码,它使用了2个java程序文件

1.我们处理listview索引的MainActivity文件

2.CustomAdapter.java 文件,它是 BaseAdapter 的子类,用于列出元素。

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener
{
private Map<String, Integer> mapIndex;
private String[] fruits;
private ListView fruitsList;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
fruitsList.setAdapter(new CustomAdapter(this, Arrays.asList(fruits)));

getIndexList(fruits);
displayIndex();
}

private void init()
{
fruitsList = (ListView)findViewById(R.id.list_fruits);
fruits = getResources().getStringArray(R.array.fruits_array);
Arrays.sort(fruits);
}

private void getIndexList(String[] fruits)
{
mapIndex = new LinkedHashMap<String, Integer>();
for(int i=0; i<fruits.length; i++)
{
String fruit = fruits[i];
String index = fruit.substring(0,1);

if(mapIndex.get(index) == null)
mapIndex.put(index, i);
}
}

private void displayIndex()
{
LinearLayout indexLayout = (LinearLayout)findViewById(R.id.side_index);
List<String> indexList = new ArrayList<String>(mapIndex.keySet());

TextView textView;
for(String index : indexList)
{
textView = (TextView) getLayoutInflater().inflate(R.layout.alphabetindicator, null);
textView.setText(index);
textView.setOnClickListener(this);
indexLayout.addView(textView);
}
}

@Override
public void onClick(View v) {
TextView selectedTextView = (TextView) v;
fruitsList.setSelection(mapIndex.get(selectedTextView.getText()));
}
}

CustomAdaper.java

public class CustomAdapter extends BaseAdapter
{
private Context context;
private List<String> listItem;
private LayoutInflater layoutInflater;

CustomAdapter(Context context, List<String> listItem) {
this.context = context;
this.listItem = listItem;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.indexindicator, parent, false);
viewHolder.textView = (TextView) convertView.findViewById(R.id.listitem);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.textView.setText(listItem.get(position));
return convertView;
}

static class ViewHolder {
TextView textView;
}

@Override
public int getCount() {
return listItem.size();
}

@Override
public Object getItem(int position) {
return listItem.get(position);
}

@Override
public long getItemId(int position) {
return 0;
}
}

activity_main.xml

<LinearLayout>
<ListView
android:id="@+id/list_fruits"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:scrollbars="none">
</ListView>

<LinearLayout
android:id="@+id/side_index"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="@color/white"
android:gravity="center_horizontal"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>

alphabetIndicator.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/side_list_item"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center"
android:padding="3dp"
android:textSize="14sp" />

IndexIndicator.xml

<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/listitem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:padding="3dp"
android:textColor="#000000"
android:textSize="14sp" />
</LinearLayout>

最后,在 strings.xml 文件中包含一个字符串数组(根据您的需要替换/增加项目)

<string-array name="fruits_array">
<item>Cantalope</item>
<item>Date</item>
<item>Grape</item>
<item>Gooseberry</item>
<item>Guava</item>
<item>Honeydew melon</item>
<item>Elderberry</item>
<item>Fig</item>
<item>Grapefruit</item>
</string-array>

关于android - 如何使用 fastscroll 和 albhabet 索引器实现 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12559843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com