问题描述
请帮助我在这 2 天内感到震惊.我想在联系人应用程序/下图中实现一个带有 fastscroll 和 albhabet 索引器的 ListView.我正在使用 SimpleAdapter 来填充 ListView.从图中可以看出,通过从右侧的字母索引器中选择一个字母,listView 的选择会转到相应的 ListItem.请分享一些例子.提前谢谢你.EX:下面是我的代码,它只是对字母进行排序,当我点击 E 时,与 E 相关的字母数据是 gng 到 diaplay..但是当我触摸字母时,它没有在中间显示 E 文本框.
Please help I am struck in this for 2 days.I would like to implement a ListView with fastscroll and albhabet indexer as in the contacts application/below image. I'm using a SimpleAdapter to populate the ListView. As seen from the image, by selecting a letter from the alphabet indexer at the right, the listView selection goes to the corresponding ListItem. Please share some examples. Thank u In advance. EX: Below is my code it is just sorting the alphabet and when i onclick on E alphabet data related to E is gng to diaplay..But it is not showing E textbox in middle when i on touch of alphabet.
如何在中间显示E文本框..当我触摸fastscroll中间文本框时必须显示.
How to display E text box in middle..When i touch fastscroll middle text box must show.
MainActivity.java
MainActivity.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
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程序文件
Here is the Simple Code for alphabet indexing in ListView, which uses 2 java program files
1.我们处理listview索引的MainActivity文件
1.The MainActivity file where we handling the indexing of listview
2.CustomAdapter.java 文件,它是 BaseAdapter 的子类,用于列出元素.
2.The CustomAdapter.java file which is the subclass of BaseAdapter for listing the elements.
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
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
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
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
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 文件中包含一个字符串数组(根据您的需要替换/增加项目)
Finally, Include a string array in strings.xml file (Replace / Increase the item based on your needs)
<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>
这篇关于如何使用 fastscroll 和 albhabet 索引器实现 ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!